學習記錄 訊息丟失處理 還有很多確認機制待續

2022-06-10 17:39:06 字數 1377 閱讀 2578

持久化儲存是傳送者傳送訊息後,訊息中心首先將訊息儲存到本地檔案/db(activemq_msgs(儲存訊息),activemq_acks(訂閱關係)和activemq_lock(集群環境下用)),然後試圖將訊息傳送給接收者,傳送成功則將訊息從儲存中刪除,失敗則繼續嘗試,訊息中心啟動後首先檢查指定的儲存位置,如果有未傳送成功的訊息,就把他發出去

事務性會話中,乙個事物被提交,確認自動發生,非事務性會話中,訊息確認取決於配置的應答模式

auto_ack...從receive方法返回的時候或者從messagelistener.onmessage方法返回的時候,會話自動確認客戶收到訊息(業務是否完成等問題,保證至多一次)

client_ack...客戶端通過acknowledge方法確認訊息,這個確認是在會話層面(業務完成後手動確認,至少一次)

在非持久化儲存時,訊息在記憶體中,重啟失效,持久化可以配置消

息持久化到db硬碟之類的,保證重啟不失效

非持久化儲存在超出最大記憶體使用配置之後,會臨時部分置換到磁碟,滿了可能會阻塞消費者出問題,原因不詳,但是重啟依然失效,盡量用持久化訊息

訊息一直不消費生產者阻塞

開啟事物,commit會等待伺服器返回,不會關閉連線導致訊息丟失

非持久化是非同步傳送,持久化是同步到硬碟,但開啟事物都是同步傳送的,建議持久化時無比開啟事務

activemq有prefetch機制,相當於一次一批,所以可能你分配了好多臺客戶端,只有乙個在工作,可以將prefetch設定為1,避免分配不均

自動確認(這種情況下還有listener一類的在確認之前可以稍加處理)和ack**確認

佇列p2p時,乙個訊息只能被乙個消費者消費

pub/sub時,乙個訊息會重複被多個訂閱集群同時消費

業務需要實現乙個訊息按照queue模式被集群消費,在集群內以訂閱方式消費,需要自行開發或者多層

客戶端丟失:producer傳送訊息到訊息佇列,客戶端接受訊息進行處理,在處理過程中,客戶端掛了,此時正在處理的訊息和已經分配到該客戶端的未處理訊息將面臨丟失。

未知delivery tag錯誤,由自動ack引起,關閉即可

---訊息系統可配置持久化訊息到硬碟,消費者可配置在消費確認之前不接收新訊息,關閉自動確認,並在finally中傳送確認訊息給訊息伺服器,以防止訊息永久保留,越積越多造成記憶體洩漏

業務系統==》傳送訊息到訊息系統==》儲存訊息為待處理狀態==》返回給業務系統結果==》業務系統開始業務流程,將結果告知訊息系統==》訊息變為待投遞

中間如果出現問題,訊息為待處理狀態,訊息系統可以反向詢問業務處理結果,由此更新訊息狀態。

訊息可以設計為跟業務系統同資料庫,將業務db操作和訊息操作作為乙個本地事物保證一致性

訊息儲存可以設計訊息表和投遞表(可以安排投遞某個訂閱集群的訊息),也可以放在一起(只能按照訊息進行投遞)效率相對低

QT5中,WM COPYDATA訊息丟失處理

之前利用nativeevent 截獲來著系統的訊息。發現有 wm copydata 訊息接收不到的問題。在操作下拉框之後,多麼奇怪的bug 後來查詢資料,有人說 資料處理太多,處理不及時,導致截獲訊息失敗 win32 wm copydata 訊息結構體 typedef struct tagcopyd...

學習記錄 cookie詭異的丟失

問題簡單說明 使用者註冊完後,把使用者名稱和密碼存放在cookie中,跳轉後cookie丟失 cookie cookiename new cookie security login name user.getusername cookiename.setpath cookiename.setmaxa...

qml學習 按鍵訊息處理

本次學習了如何處理qml中的按鍵訊息,其實也很簡單,主要就是有個訊息傳遞的問題需要處理。如果不向下傳遞訊息,後面則無法接收到按鍵訊息了。下面就是具體的例子 import qtquick 2.2 import qtquick.controls 1.2 rectangle 訊息傳遞到 movetext,...