2016-05-23 128 views
4

我有以下結構: ArchitectureAMQP/RabbitMQ的 - 如何避免競爭條件

  • 有輸入源的固定數量。每個輸入源都是等效的。
  • AMQP經紀人。我在使用RabbitMQ。
  • 目前,有2個消費者。同樣,每個消費者都是相同的。

輸入源正在發送要處理的命令。這些命令由經紀人轉發,並由兩位消費者中的一位提取。

我需要以下行爲:

  • 如果一個輸入源發送多個命令,所有命令必須被順序地處理。也就是說,在2個命令的示例中,當消費者2同時處理命令2時,消費者1正在處理命令1的是不允許
  • 但是,可以同時處理源自兩個不同輸入源的兩個命令。

是否可以用AMQP/RabbitMQ強制執行此行爲?

回答

0

您可以爲每個隊列使用一位消費者來覆蓋您的方案。 每個隊列都可以按順序處理消息。

另一種方式是僅使用一個隊列,並使用envelope.getExchange()瞭解源,或tag使用AMQP.BasicProperties properties

這樣你的消息,例如,你可以消耗多線程的消息和分配每個線程一個線程tag

+0

我不太確定這是否解決了我的問題。這可以防止消費者同時收到多條消息。然而,我可能在這裏是錯的,這並不妨礙另一位消費者收到來自第一位消費者目前正在處理的來自同一輸入源的消息? – TheRabbitHopper

+0

這取決於你作爲'broker'的意思,你把所有的信息放在同一個隊列中嗎? – Gabriele

+0

所有消息放在同一隊列中。我應該爲每個輸入源創建一個隊列嗎?這意味着每個消費者都在傾聽所有隊列? – TheRabbitHopper

0

爲了保證順序,您可能需要聚合消息。在發佈到隊列之前,您可以將來自一個源的命令批量處理爲消息,因此消息進入隊列可以包含一個或多個將由消費者執行的命令。

+1

我無法在發佈前批量/收集消息。每條消息應儘快處理。 – TheRabbitHopper