2017-08-07 76 views
0

我有一個RabbitMQ隊列用於生成文檔。基本上,每個文件都有typestate(新,處理,準備),所以我用像type.state路由鍵話題的交流。每次文檔更改時,都會將帶有最後文檔說明的消息發送給交換機,並且它工作得很好。RabbitMQ插件刪除重複郵件

然而有時文檔可以被處理兩次:

  1. 用戶發送新的文檔。所以發送新消息report.new進行交換。
  2. 雖然工作人員尚未啓動文檔處理(隊列尚未到達),但用戶更新了文檔。發送相同文檔的新消息report.new
  3. 所以現在工人得到的第一個消息,並開始他的工作,而該文件被改變,因此這項工作是毫無道理的。

現在我只是添加少量的代碼到工人,從比較與數據庫中的一個消息last_modified文檔關鍵,如果他們是不一樣的ACK消息。但我不認爲這是最好的解決方案。

我的想法是添加ID到郵件頭,並且有一定的RabbitMQ插件,它將會從隊列中相同ID刪除舊郵件。

謝謝。

P.S.也許另一個MQ引擎在這裏很有用?例如。也許ActiveMQ有這樣的功能?

回答

1

好吧,我讀過有關RabbitMQ的內部結構,並發現它是不可能的。所以有人尋找它的方式。

  1. 僅發送文件ID在郵件正文
  2. 創建一個工人key-value存儲(我使用memcached的這個)。鍵是ID值是此ID上次工作人員運行的時間戳。
  3. 當工作人員收到消息時,它會檢查消息時間戳是否大於鍵值存儲中的消息時間戳。如果是,則更新存儲中的時間戳並運行任務,否則只需跳過它。