現網程式執行一段時間後,經常發現收不到redis訂閱訊息。輸入client list查詢redis連線資訊,輸出如下資訊:
id=2375018 addr=120.15.207.135:9159 fd=663 name=subarea age=3324 idle=563 flags=n db=0 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 obl=16382 oll=797 omem=12734654 events=rw cmd=psubscribe看看redis.conf配置項:
client-output-buffer-limit pubsub 32mb 8mb 60 #當緩衝區資料達到硬限制32m時,連線會關閉;當緩衝區資料達到軟限制每60秒8m時,連線也會關閉。經排查發現上述問題是由於關閉了訂閱/發布輸出緩衝區記憶體限制,程式操作阻塞,沒有及時取走發布的訊息,導致訊息在服務端不斷快取,最終耗盡服務端記憶體,客戶端無法接收到訂閱訊息。client-output-buffer-limit pubsub 0 0 0 #可將hard limit和soft limit同時置0,關閉該限制。該操作官方不推薦。
解決方案: 將訂閱訊息讀取到本地佇列中,防止阻塞訂閱訊息的讀取;單獨啟動一線程掃瞄佇列訊息即可。
Redis之訊息訂閱
程序間的訊息通訊模式,傳送者 pub 傳送訊息,訂閱者 sub 接收訊息,如下圖所示 publish發布訊息 127.0.0.1 6379 publish c1 hello integer 0 127.0.0.1 6379 publish c1 hi integer 1 subscribe訂閱訊息,...
ros先訂閱後發布 無法收到訊息的解決辦法
今天遇到的問題是 使用的是ros1,在先訂閱後發布時,會導致訂閱者無法收到訂閱的訊息,除非在發布者發布後重新訂閱.以前使用的是ros2似乎並不關心訂閱和發布的先後順序,似乎都可以收到訊息.這個問題後面再確認下,今天也記錄下.因為計算機上已經沒有ros2的環境了,所以這個問題暫時擱置,等有機會的確認下...
Redis訊息發布與訂閱
1.publish channel message 定義乙個channel並在其上發布訊息,例如 這裡定義了news,並在news上發布了hello訊息,返回值是1,說明有乙個訂閱者收到了發布的訊息,如果有多個訂閱者,會將顯示所有訂閱者的數量。2.subscribe channel 訂閱乙個chan...