2016-07-28 45 views
2

在編寫雲環境中的Messenger聊天機器人的上下文中,我遇到了一些併發問題。聊天機器人:確保在羣集環境中基於每個對話的消息的串行處理

具體來說,我想確保來自同一對話的傳入消息被一個接一個地處理。

作爲一個約束條件,我正在使用雲環境中的工作人員處理消息(即,工作池具有可變大小,並且工作者實例可能會短暫且可能會崩潰)。另外,低延遲很重要。

那麼抽象一點,我的要求是:

  • 我收到的郵件
  • 流這些消息都有一個「主題鑰匙」(會話ID)
  • 集主題不知道提前和幾乎是無限的
  • 我想確保同一主題的消息被串行處理
  • 在潛在的短暫工作人員羣集如果可能的話,我希望可靠性保證,例如確保每條消息只處理一次。

我的問題是:

  1. 是否有這種併發場景?
  2. 是否有技術(信息經紀人,協調服務等),它實現了開箱即用?
  3. 如果不是,什麼算法我可以使用在較低級別的併發工具之上實現此? (分佈式鎖,演員,隊列等)

回答

1

我不知道該場景的廣泛接受的名稱,但解決此類問題的常見策略是路由您的消息,以便所有具有相同主題密鑰的消息最終結束在同一個目的地。一對夫婦的技術,會爲你做到這一點:

一些消息代理廠商指此要求作爲消息分組粘性會話,或粘滯消息Load巴爾an 012

郵件系統的另一個常見策略是在郵件/訂單保證較弱的情況下(如Amazon SQS),只需在郵件中包含一個序列號,並將其保留到目的地,以便重新排序並根據需要請求重新傳送缺失的郵件。

+0

謝謝,由ActiveMQ或HornetQ執行的消息分組正是我所需要的。 –

+1

我冒昧地通過自己的搜索來完成您的答案。 –

0

我想你可以通過使用一個隊列和一組來解決這個問題。我能想到的是將隊列中的每個消息對象作爲先進先出的方式處理。但是,在隊列中添加主題名稱時,請在集合中添加主題名稱,並在處理中將主題名稱從集合中刪除。 所以,現在如果你在集合中有任何主題,那麼不要在隊列中添加同一主題的另一個消息對象。 我希望這會幫助你。所有最好的:)

+0

因此,本質上這包括A - 在每個主題上使用分佈式鎖和B - 立即丟棄每個無法獲取鎖的消息。我不喜歡A,在我的用例中B不可接受。 –