rpc call
调用方法并等待返回。
call()方法是用来调用有返回值的RPC方法。由于只允许有一个返回值,所以不允许对fanout类型的target调用call方法。
call方法会阻塞调用线程,直到消息队列提供了返回值,超时,或不可恢复的错误。
call保证RPC请求最多执行一次,保证了不会有重复调用。但是如果在返回值到达之前调用失败或超时,则无法保证是否调用了该方法。
由于call()会阻塞到RPC方法完成,因此可保证来自同一线程的多个RPC调用按顺序处理。
方法参数必须是原始类型或客户端序列化程序支持的类型(如果有)。 同样,request context必须是dict,除非客户端的序列化程序支持序列化另一种类型。
如何处理远端RPC方法引发的任何错误的语义是非常微妙的。首先,如果远端异常包含在allow_remote_exmods messaging.get_rpc_transport()参数中列出的其中一个模块中,那么将通过call()重新引发此异常。 但是,此类本地重新引发的远程异常可与本地引发的相同异常类型区分开,因为重新引发的远程异常被修改,以使其类名以“_Remote”后缀结尾,因此可以执行以下操作:
if ex.__class__.__name__.endswith('_Remote'):
# Some special case for locally re-raised remote exceptions
其次,如果远程异常不是来自allowed_remote_exmods列表中列出的模块,则会引发messaging.RemoteError异常,其中包含远程异常的所有详细信息。
Parameters:
ctxt (dict) – a request context dict
method (str) – the method name
kwargs (dict) – a dict of method arguments
Raises:
MessagingTimeout, RemoteError, MessageDeliveryFailure
rpc cast
调用方法,不会因等待返回值而阻塞当前逻辑。
cast()方法用于调用没有返回值的RPC方法。通过将fanout target属性设置为True,可以向所有侦听给定topic的服务器广播RPC请求。
尽管cast()操作是尽力而为:cast()将阻塞调用线程,直到消息队列接受RPC的调用方法,但cast()不验证对端服务器是否已调用RPC方法。 cast()确保该方法不会在目标上执行两次(例如,“最多一次”执行)。
连续的cast请求没有顺序保证,即使cast是同一目的地。因此,方法会以与它们被触发的顺序不同的顺序执行。
cast请求
方法参数必须是原始类型或客户端序列化程序支持的类型(如果有)。 同样,request context必须是dict,除非客户端的序列化程序支持序列化另一种类型。
Parameters:
ctxt (dict) – a request context dict
method (str) – the method name
kwargs (dict) – a dict of method arguments
Raises:
MessageDeliveryFailure if the messaging transport fails to accept the request.
prepare
准备方法调用context
使用此方法重写客户端属性
参考链接
https://docs.openstack.org/oslo.messaging/latest/reference/rpcclient.html