Cloudkitty Data Flow(Newton版)
来源:互联网 发布:怎样做网络推广话术 编辑:程序博客网 时间:2024/06/04 18:07
一、简介
架构图
cloudkitty总共有两个服务(进程),cloudkitty-api和cloudkitty-processor
cloudkitty-api服务作为外界访问cloudkitty的统一接口,可以分为两组api,文档如下:cloudkitty API,通过rpc与cloudkitty-processor服务进行通信。
cloudkitty-processor进程的主要工作有:
- 接收API发来的RPC消息,比如更新module的状态或优先级
- 启动循环任务,在每一个计费周期内,对每个计费租户的资源使用情况进行查询和计费(又可细分为以下内容:)
- 收集计费租户信息(TenantFetcher)
- 获取资源使用数据(Collector)
- 格式化资源使用数据(Transformers)
- 依据计费策略计费(Rating)
- 存储计费信息(Storage)
二、cloudkitty-api剖析
1.wsgi服务初始化
- service.prepare_service():初始化log并修改配置文件默认值;
app.build_server():创建启动WSGI服务,load_app加载各个应用
由上可知client请求进来最终路由到cloudkitty.api.app:app_factory
app定义在app_conf.app.root中,其中有v1 = v1_api.V1Controller():
其中比较特殊的类是rating_api.RatingController(),该类中的reload_modules方法会动态加载计费模块的API:
其中self.modules.reload_extensions()为父类RatingModulesMixin()中的方法:
依据setup.cfg,可知‘cloudkitty.rating.processors’命名空间对应下述计费模块
至此,cloudkitty-api服务中的两组api入口清晰可见,若采用pyscripts(即第三方计费模块脚本),流程也是类似,需要在对应的文件中添加第三方的内容即可
- server.serve_forever():循环接受client请求, 如果有请求来,经finish_request方法把请求交给RequestHandlerClass处理,RequestHandlerClass调用handle()方法处理request,WSGIRequestHandler的handle()方法把request又交给ServerHandler处理,ServerHandler调用run执行application方法。
2.API预览
COMMON REST API (v1)
HashMap Module REST API
三、cloudkitty-processer剖析
1.服务初始化
cloudkitty-processer的启动代码在cli/processer.py中,如下:
该进程主要的初始化代码在orchestrator这个库中,位于cloudkitty的根目录下。先看看orchestrator.Orchestrator()这个类如何初始化
可以看到分别初始化了fetcher、transformers、collector、storage。然后初始化了tooz库的coordination,后续利用其分布式锁功能,通过fetcher获取需要计费的tenant ID(即project_id),然后依照计费逻辑轮循各个project时,保证每个project不被中断。
首先是fetcher,调用stevedore库以driver的形式动态加载,对应的后端可以有:
transformers的初始化也类似,其后端命名空间:TRANSFORMERS_NAMESPACE = 'cloudkitty.transformers',在setup.cfg中:
collector、storage也都类似:
由上可以看出,主要的组件均允许后端以插件的形式插入。再来看processor的主要逻辑:
2.cloudkitty-processor主要逻辑
以下是processor的主要逻辑:
这里简要画了一幅processor的逻辑图:
接下来看代码
首先_load_tenant_list()加载所有的project,在for循环中,对每个project建立锁,并判断当前project的状态(判断是否处于下个执行周期),若处于可执行周期,则调用worker.run
2.1 Collect
首先明确一点,run方法执行于某个project的计费周期内,获取可用的collect services,调用self._collect()方法,其中该方法中的self._collector在Worker类初始化时传入,对应processor服务初始化的collector,对应的collector后端具体方法位置在setup.cfg中定义,前面已经列出。这里看self._collect()方法:
其中self._collector.retrieve()方法对应不同的后端有不同的实现,默认Ceilometer为collector后端时,retrieve()方法位于collector.__init__的BaseCollector基类中,其余各后端均有自己的实现(例如gnocchi为后端时,retrieve()方法位于collector.gnocchi.GnocchiCollector中)
以Ceilometer为后端为例:
会获取self中是否具有get_[resource]的方法,若有则调用该方法,比如resource为image:
可以看到最终会调用Ceilometer的client去获取image的相关信息。
2.2 Rating
回到Worker.run方法中:
其中self._processors在Worker的父类BaseWorker中被初始化,对应的命名空间为PROCESSORS_NAMESPACE = 'cloudkitty.rating.processors' 下面贴出该命名空间对应setup.cfg中的内容:
所以这里调用processor.obj.process()方法来处理前面collector收集回来的resource信息,默认后端采用hashmap计费模块的逻辑,具体方法不细致分析。
2.3 Writing
类似前面两个步骤,均是通过调用插件的驱动来完成功能,不重复展开。
- Cloudkitty Data Flow(Newton版)
- Zaqar Data Flow(Newton 版)
- Nova Data Flow(Newton版)
- 数据流程图(Data flow diagram)
- uva 10594 - Data Flow(费用流)
- boot from volume分析(Newton版)
- 3.5 Data Flow任务
- DS5000 Data flow
- loopback interface data flow
- Data Flow Diagrams (DFDs)
- Receiving Module Data Flow
- UVa10594 Data Flow
- uva 10594Data Flow
- llvm:Data Flow Graph
- Spring Cloud Data Flow
- Spring Data Flow
- Newton法(牛顿法 Newton Method)
- Newton法(牛顿法 Newton Method)
- adb端口被占用
- 拯救小tim
- JMS_ActiveMQ的点对点消息模型的小例子
- 设计模式 Concurrency 之 ReadWriteLock 读写锁
- mybatils 数据库时间模糊查询
- Cloudkitty Data Flow(Newton版)
- 市场研究中的数据分析知识整理 (七)-结构方程模型
- git生成patch,应用到rpmbuild 打补丁
- 关于Activity
- Maven 构建配置文件
- lintcode刷题——搜索二维矩阵
- 矩阵构造+矩阵快速幂-HDU5950
- 用栈实现队列
- 单元测试,在控制台输入测试值。