記錄一個 nameko standalone rpc 應答不消費導致阻塞的問題

universe_king發表於2024-11-26

使用 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。且一直不消費

圖片.png

重啟 nameko rpc 客戶端的程式(kill 程序)問題就會隨之消失

佇列頁面的詳情是這樣

圖片.png

消費者頁面詳情是這樣

圖片.png

至於問題產生的原因,還不清楚,需要等下一次再發生的時候,再進一步調查

不過我初步懷疑是引入了一些和 eventlet 協程不相容的程式碼,導致 cpu 會奪走導致的

相關文章