使用 nameko standalone rpc 呼叫其他 rpc 服務的示例程式碼:
from nameko.standalone.rpc import ClusterRpcProxy
with ClusterRpcProxy(config) as cluster_rpc:
parse_result_json = cluster_rpc.parse_rpc_service.parse_rpc_v3(
parser_result.json(ensure_ascii=False)
)
先明確兩個角色:
- nameko rpc 客戶端,上面的程式碼就是客戶端程式碼
- nameko rpc 服務端
遇到了一個問題,就是 rpc 服務端已經返回資料了(服務端是把資料推到 rabbitmq 即視為返回資料完成),但是 rpc 客戶端一直處於資料消費中。所以問題是出在客戶端,而不是服務端
出現了類似下面格式的 10個佇列
http://xxxx:15672/#/queues/xxx-test/rpc.reply-standalone_rpc_proxy-cde4457d-a580-4672-8a94-1cf4b5fce9f0
http://xxxx:15672/#/queues/xxx-test/rpc.reply-standalone_rpc_proxy-a1ad897c-48d6-4ff0-b975-9e83ec79916d
問題從 rabbitmq 看就是 total 列的值是 1,unacked 也是 1。且一直不消費
重啟 nameko rpc 客戶端的程式(kill 程序)問題就會隨之消失
佇列頁面的詳情是這樣
消費者頁面詳情是這樣
至於問題產生的原因,還不清楚,需要等下一次再發生的時候,再進一步調查
不過我初步懷疑是引入了一些和 eventlet 協程不相容的程式碼,導致 cpu 會奪走導致的