Rabbitmq 寻找正确的mule组件以fifo顺序解复用消息

Rabbitmq 寻找正确的mule组件以fifo顺序解复用消息,rabbitmq,mule,activemq,messaging,mule-studio,Rabbitmq,Mule,Activemq,Messaging,Mule Studio,我一直在搜索用于以下问题的正确消息传递模式: 我有一个队列,其中包含域中每个用户ID的消息,每条消息都是userChanged事件。业务要求是必须以FIFO顺序处理特定用户ID的所有消息,如果在处理特定用户ID的消息期间发生错误,则在将该错误标记为已成功处理之前,不应再进行处理。必须处理所有消息,并且需要在集群ESB环境中部署此解决方案 我想将这些事件分解为每个用户ID的FIFO队列,这样我就可以并行处理来自不同用户ID的消息,并按顺序处理每个用户的消息 到目前为止,我已经提出了涉及Mule和R

我一直在搜索用于以下问题的正确消息传递模式:

我有一个队列,其中包含域中每个用户ID的消息,每条消息都是userChanged事件。业务要求是必须以FIFO顺序处理特定用户ID的所有消息,如果在处理特定用户ID的消息期间发生错误,则在将该错误标记为已成功处理之前,不应再进行处理。必须处理所有消息,并且需要在集群ESB环境中部署此解决方案

我想将这些事件分解为每个用户ID的FIFO队列,这样我就可以并行处理来自不同用户ID的消息,并按顺序处理每个用户的消息

到目前为止,我已经提出了涉及Mule和Rabbit的两种可能的解决方案,但这两种解决方案都涉及定制组件或我不知道的现有组件

  • 让Mule流读取第一个RabbitMQ队列上的所有消息,其中AMQP入站端点从头中获取用户ID。然后,它使用一个AMQP出站端点,该端点动态创建一个持久队列(如果该队列尚不存在),该队列的名称类似于:
    userChangedEvent-#[flowVars.userid]
    ,并将消息发布到该队列。自定义组件需要执行以下操作: A.创建一个共享对象映射,该映射将标识所有动态amqp侦听器流(如果不存在) B检查映射以查看是否存在该用户标识的侦听器流的实例。如果没有,请添加动态amqp侦听器流的实例,该实例将侦听
    userChangedEvent-#[flowVars.userid]
    队列,并使用userid作为键将其添加到映射中。 C启动流程。 D动态流需要配置为在单线程配置中处理,在业务逻辑成功完成后手动确认消息,并在出现错误时停止流

  • 让一个amqp入站端点读取队列中的所有消息,然后“排序”路由器将具有相同用户ID的消息路由到该用户ID的可重用业务逻辑流的相同实例,如果给定用户ID的实例不存在,则创建一个实例。此场景的未决问题包括: A.这样的路由器是否存在或是否需要开发? B业务逻辑流需要在单个线程中执行,因此需要以持久的方式为流的每个实例维护积压的消息。 C执行其中一个实例时出现错误,应停止该实例处理更多消息,直到问题得到解决

  • 我已经想到了一些解决方法,比如将用户ID“bucketing”到各种预定义的队列中
    (userChangedEvent-0to1000、userChangedEvent-1000to2000等等)
    ,这样我们就可以预定义我们需要的所有流和相关的amqp侦听器,并消除对动态流的需求,但这对我来说是一个不雅观的解决方案

    我觉得必须有一个消息模式来解决这个问题,但我撕毁了我的EIP副本,没有用!如有任何建议,将不胜感激


    更新:从概念上讲,这就是我想要的,一个带通道的解复用器(我称之为bucket),但我认为动态通道创建(每个用户ID 1个)会更好:

    你不可能同时拥有多个并发消费者并同时遵守fifo订单。但是,您可以使用名为“独占使用者”的功能拥有多个非并发使用者,以提高可用性。您可以使用的属性
    exclusiveConsumers
    激活此功能

    关于错误停止处理,我可以建议两种不同的方法:

    • 如果此业务需求可能发生变化,您可以利用复杂的事件处理引擎作为事件的信号量
    • 否则,您可以使用如上所述的断路器模式,这可能是最简单的方法

    感谢维克托的建议,断路器看起来很有希望,CEP方法听起来很有趣-你有任何文档可供参考吗?我可能不清楚我最初的问题。我不希望在同一队列上有多个并发使用者,也不希望遵守fifo顺序。我想获取从第一个队列中发出的消息流,并将它们按userid分隔成以fifo顺序处理的流,并在出现异常时使用断路器模式停止对给定userid的处理。我建议使用队列(每个用户ID一个队列)或使用有状态路由器进行解组。Rabbitmq将遵守插入顺序,因此默认配置应该可以。有关断路器的文件可在aswer的此处工作中找到。关于esper的例子是和感谢的链接维克多。请看我发布的更新,其中一行显示了一个带通道的解复用器,这在功能上是我真正想要的:从概念上来说,这是我想要的,一个带通道的解复用器(我称之为bucket),但我认为动态通道创建(每个用户ID 1个)甚至更好:就我个人而言,我会使用类似ActiveMQ的消息组()之类的东西,但是现在可以在rabbitmq()上使用。根据您所拥有的,我可能会在一个队列中接收消息,将元素放在一个不同的队列中,其中只有一个标题Enrichment和您想要的bucketname。然后我会在不同的独占入站端点上使用消息选择器。