2016-06-21 156 views
0

我正試圖讓自己的頭腦解決最近遇到的問題,並希望有人能夠指出我解決問題的最合理的方向。處理rabbitmq消息處理中的時鐘的最佳方法

我使用了Riak KV存儲和上CRDT數據,在那裏我有某種存儲在數據庫中的每個項目CRDT櫃檯內工作。

我有一個rabbitmq隊列,其中每條消息是增加或減少一定數量的上述計數器的請求。

最後,我有一組服務工的,即在隊列監聽,並且對於每個請求嘗試相應地改變計數器的量。

我的問題是如下:當一個工人正在處理請求時,它可能會卡上的寫操作數據庫一段時間 - 讓我們在櫃檯第二次更換了三次的說。它與rabbitmq的連接會丟失(超時),因此消息請求會回到隊列中(我不能錯過)。然後由第二名工作人員拾起,重新開始所有處理。但是,第一名工作人員完成了工作,並且作爲結果,我已經處理了一條消息兩次。

我可以將這些增量分成單獨的行動,但仍給我留下了困境 - 仍然可以改變計數器的值的兩倍,如果一些員工卡上的寫操作很長一段時間。

我沒有做了Riak KV CRDT的可能性寫入工作得更快,我也可以接受錯過了一個消息請求。我需要實現一些檢查請求是否已經處理過的方法。 我最初的想法是使用一些替代的快速KV商店來存儲rabbitMQ消息ID(如果正在處理它們)。這樣,其他工作人員就可以判斷他們是否開始處理已在別處解析過的消息。 我可以使用任何幫助和指向我可以閱讀的材料的指針。

回答

1

你不能有「完全一個交付」的語義。您可以減少重複發送的信息或錯過發送信息,因此您可以自行決定哪種不當行爲是最不方便的。

首先你確定這是CRDT太慢了嗎?你是否在地圖內使用簡單的計數器或計數器?根據我的經驗,它們非常快,但比kv慢。你可以嘗試: - 有簡單CRDTs(無圖),多CRDTs對象,以降低自己的壓力 - 不使用CRDTs但上簡單的按鍵客戶端使用好老的兄弟分辨率(可你一分爲二的計數器?) /值。 - 累計計數更新訂單並批量應用它們,但是您接受延遲增加,因此它相當於增加超時。

你能提供一些指標嗎?如更新需要多長時間,您希望得到的數字是多少,如果數據更新較少或更新較慢,則數據速度較慢等。