class oslo_messaging.
RPCClient
(transport, target, timeout=None, version_cap=None, serializer=None, retry=None)
RPCClient是用于在远程RPC服务器上调用方法的类。
transport:RPCClient通过transport向RPC server发送远程调用并接收响应。
支持两种模式:
RPC calls:适用于期望有调用响应的场景,远程调用方法并等待响应
RPC casts:适用于不需要RPC server返回响应的场景
client:用于控制如何将RPC request传递到服务器。如果只有topic(exchange可选)被设置,RPC能够被任何监听该topic(以及exchange)的servers服务,多个servers按照round-robin的方式轮流被选中。在RPC Cast场景下,通过设置target的"fanout"属性为True,可以把request广播到所有监听的servers。
在构造过程中创建默认target后,target属性能够在单独的方法调用中使用prepare方法进行重配置。
方法调用由请求上下文字典,方法名称和参数字典组成。
使用类封装RPC Client的例子:
class TestClient(object): def __init__(self, transport): target = messaging.Target(topic=‘test‘, version=‘2.0‘) self._client = messaging.RPCClient(transport, target) def test(self, ctxt, arg): return self._client.call(ctxt, ‘test‘, arg=arg)
使用prepare方式重新设置target属性的例子:
def test(self, ctxt, arg): cctxt = self._client.prepare(version=‘2.5‘) return cctxt.call(ctxt, ‘test‘, arg=arg)
另一个例子,设置超时时间:
def test(self, ctxt, arg): cctxt = self._client.prepare(timeout=10) return cctxt.call(ctxt, ‘test‘, arg=arg)
如果连接无法完成,client会尝试重新建立连接,默认将无限期继续直到连接完成,可以设置retry次数:
client = messaging.RPCClient(transport, target, retry=None) client.call(ctxt, ‘sync‘) try: client.prepare(retry=0).cast(ctxt, ‘ping‘) except messaging.MessageDeliveryFailure: LOG.error("Failed to send ping message")
call
(ctxt, method, **kwargs)
call方法,触发调用并等待响应。
只允许返回单个响应值,不支持调用一个fanout模式的target。
在单一线程内能够保证多个call方法按顺序处理。
方法参数必须是原始类型或者客户端序列化器支持的类型(如果有)。 类似地,请求上下文必须是字典类型,除非客户端的序列化程序支持序列化另一个类型。
can_send_version
(version=<object object>)
检查版本是否与版本上限兼容。
cast
(ctxt, method, **kwargs)
触发方法并且不会为返回值阻塞。
cast() RPC请求可以广播到所有相匹配的servers。
cast会阻塞直到RPC request方法被messaging transport接受,但不确认方法是否被server调用。
cast保证方法不会在一个目的地被执行两次。
cast不保证执行顺序。
类似的,请求上下文必须是字典类型,除非客户端的序列化程序支持序列化另一个类型。
prepare(exchange=<object object>, topic=<object object>, namespace=<object object>, version=<object object>, server=<object object>, fanout=<object object>, timeout=<object object>, version_cap=<object object>, retry=<object object>)
准备方法调用上下文。
使用此方法覆盖单个方法调用的客户端属性。 例如:
def test(self, ctxt, arg): cctxt = self.prepare(version=‘2.5‘) return cctxt.call(ctxt, ‘test‘, arg=arg)
exception oslo_messaging.
RemoteError
(exc_type=None, value=None, traceback=None)
表示远程端点方法引发了异常。