亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何僅使用消息 ID(在 Go 中)確認 Rabbitmq 消息?

如何僅使用消息 ID(在 Go 中)確認 Rabbitmq 消息?

Go
達令說 2021-11-08 15:45:30
我構建了一個小型服務器 (golang) 來從 RabbitMQ 獲取消息并通過 Websocket 將它們傳送到連接的瀏覽器。它工作得很好,但有一個警告:當通過 websocket 傳遞到瀏覽器時,消息會得到確認。對于大多數消息來說沒問題,但有些消息可能非常重要。如果用戶的瀏覽器收到了那些但用戶沒有看到消息,那么如果瀏覽器關閉或重新加載,它就會丟失。有沒有辦法稍后根據消息 ID(來自 Delivery 結構)確認消息?用例是當用戶明確確認某些消息時會確認它們,然后將消息 ID 發送回工具以通過 RabbitMQ 進行確認。
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

即使你能做到這一點,這也是糟糕的設計。

如果用戶沒有看到消息會發生什么?您的網絡服務器是否無限地掛在它上面?它是否將消息“nack”回隊列?

這兩種選擇都不好。

堅持每條消息,RabbitMQ 將開始遇到來自大量用戶的數千條未確認消息的問題。將消息返回到隊列中,您將循環處理消息,增加 Web 服務器和 RMQ 服務器上的 CPU 資源,以及兩者之間的網絡流量。

這個問題更好的解決方案是將消息從RabbitMQ中拉出后存儲在數據庫中。當它被發送到瀏覽器/被瀏覽器查看時,更新數據庫以反映這一點。

從我寫的尚未發表的文章中:

將消息存儲在數據庫中。

向數據庫記錄添加一個字段,說明此消息屬于誰。當用戶稍后重新連接時,查詢數據庫以獲取該用戶當時需要查看和發送的任何消息。

上面開始的完整過程,然后變成了這樣:

  • 用戶的瀏覽器連接到 Web 服務器上的 SignalR/Socket.io/Pusher/websockets

  • Web 服務器檢查隊列中是否有在長時間運行的過程中發生的更新

  • 當登錄用戶的消息進來時

    • 如果用戶已登錄,則通過websocket向用戶廣播消息

    • 如果用戶未登錄,則將消息存儲在數據庫中

  • 當用戶再次登錄時,查詢數據庫并發送所有等待消息

這是在消息隊列的想法出現之前你會做的事情,對吧?現在您也有一個消息隊列,這應該是您要做的。


查看完整回答
反對 回復 2021-11-08
  • 1 回答
  • 0 關注
  • 302 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號