oslo_message.Target 学习
代码注释对Target类的定义如下:
用于指定消息的目的地。
Target类封装了包括一条消息该朝哪里发送以及一个消息服务器应该监听哪些消息的全部信息。具体到不同的API,一个Target对象包含的信息也不同:
创建一个消息服务器,需要指定topic和server,exchange是可选的;
一个endpoint的target,namespace和version是可选的;
client端发送消息,则只需要指定topic。
Target类包含的属性如下:
- exchange:(str) topic的范围,将未指定值设置成control_exchange配置中的default值;
- topic:(str)消息服务器暴露出的用于定义接口集的名称。多个服务器可以监听一个topic,或者一条消息可以以轮训的方式分发到其中一个服务器中;
- namespace:(str)由消息服务器定义的一个特定的接口(或者称一组方法)。默认接口没有命名空间标识符;
- version:(str)版本号,用于迭代开发;
- server:(str)客户端可以指定将消息发送给特定的消息服务器;
- fanout:(bool)标识是否广播消息至所有监听该topic的服务端;默认为False(None)
- legacy_namespaces:一个消息服务器可以接收由namespace指定的消息,也可以接收由legacy_namespaces指定的消息;
oslo.message get_rpc_server 学习
构造一个rpc消息服务器(消息消费者)
get_rpc_server(transport, target, endpoints, executor='blocking', serializer=None):
dispatcher = rpc_dispatcher.RPCDispatcher(target, endpoints, serializer)
return msg_server.MessageHandlingServer(transport, dispatcher, executor)
传入参数如下:
- transport :(Transport类型)消息传输层
- target:(Target类型)消息服务器监听的exchange,topic
- endpoints:(list)终端对象列表,对象中定义了处理消息的方法接口
- executor:(str)定义消息执行器的方式,主要有两种:blocking(默认)和eventlet,如果指定eventlet,则线程和时间的模块需要monkey_patch化
- serializer: (Serializer)可选的实例序列化
RPCDispatcher
理解rpc消息的消息分发器
在构造一个消息处理服务器对象时,传入能够在每次接收到消息后可以调用上下文和字典的分发器。
RPCDispatcher就是实现了这样一个分发器。能够读取RPC消息的格式,识别消息中namespace,version,和方法名,然后匹配出相应的终端(endpoint)
端点可能具有一个Target变量,该Target描述了该端点中method的namespace和version。一个终端对象的所有公共方法都能实现客户端远程的调用。
MessageHandlingServer
class MessageHandlingServer(service.ServiceBase, _OrderedTaskRunner):
消息处理服务器
在每收到消息时,用消息中的上下文和字典来调用dispatcher里相应的可调用方法
在该类的初始化方法中会通过stevedore模块根据executor_type动态加载相应的执行器executor
try:
mgr = driver.DriverManager('oslo.messaging.executors',
self.executor_type)
except RuntimeError as ex:
raise ExecutorLoadFailure(self.executor_type, ex)
self._executor_cls = mgr.driver
其中在olso.messaging.executors在entry_points.txt的定义如下
[oslo.messaging.executors]
threading = futurist:ThreadPoolExecutor
blocking = futurist:SynchronousExecutor
eventlet = futurist:GreenThreadPoolExecutor
当executor_type为eventlet时,会动态加载一个GreenThreadPoolExecutor对象。