rpc call
調(diào)用方法并等待返回。
call()方法是用來調(diào)用有返回值的RPC方法。由于只允許有一個返回值,所以不允許對fanout類型的target調(diào)用call方法。
call方法會阻塞調(diào)用線程,直到消息隊列提供了返回值,超時,或不可恢復(fù)的錯誤。
call保證RPC請求最多執(zhí)行一次,保證了不會有重復(fù)調(diào)用。但是如果在返回值到達之前調(diào)用失敗或超時,則無法保證是否調(diào)用了該方法。
由于call()會阻塞到RPC方法完成,因此可保證來自同一線程的多個RPC調(diào)用按順序處理。
方法參數(shù)必須是原始類型或客戶端序列化程序支持的類型(如果有)。 同樣,request context必須是dict,除非客戶端的序列化程序支持序列化另一種類型。
如何處理遠端RPC方法引發(fā)的任何錯誤的語義是非常微妙的。首先,如果遠端異常包含在allow_remote_exmods messaging.get_rpc_transport()參數(shù)中列出的其中一個模塊中,那么將通過call()重新引發(fā)此異常。 但是,此類本地重新引發(fā)的遠程異??膳c本地引發(fā)的相同異常類型區(qū)分開,因為重新引發(fā)的遠程異常被修改,以使其類名以“_Remote”后綴結(jié)尾,因此可以執(zhí)行以下操作:
if ex.__class__.__name__.endswith('_Remote'):
# Some special case for locally re-raised remote exceptions
其次,如果遠程異常不是來自allowed_remote_exmods列表中列出的模塊,則會引發(fā)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
調(diào)用方法,不會因等待返回值而阻塞當(dāng)前邏輯。
cast()方法用于調(diào)用沒有返回值的RPC方法。通過將fanout target屬性設(shè)置為True,可以向所有偵聽給定topic的服務(wù)器廣播RPC請求。
盡管cast()操作是盡力而為:cast()將阻塞調(diào)用線程,直到消息隊列接受RPC的調(diào)用方法,但cast()不驗證對端服務(wù)器是否已調(diào)用RPC方法。 cast()確保該方法不會在目標上執(zhí)行兩次(例如,“最多一次”執(zhí)行)。
連續(xù)的cast請求沒有順序保證,即使cast是同一目的地。因此,方法會以與它們被觸發(fā)的順序不同的順序執(zhí)行。
cast請求
方法參數(shù)必須是原始類型或客戶端序列化程序支持的類型(如果有)。 同樣,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
準備方法調(diào)用context
使用此方法重寫客戶端屬性
參考鏈接
https://docs.openstack.org/oslo.messaging/latest/reference/rpcclient.html