Concurrency 骆驼+;ActiveMQ:处理与竞争消费者的两个不同并发约束

Concurrency 骆驼+;ActiveMQ:处理与竞争消费者的两个不同并发约束,concurrency,apache-camel,activemq,apache-servicemix,Concurrency,Apache Camel,Activemq,Apache Servicemix,问题: 处理积压的消息,其中每条消息有三个标题“服务”、“客户端”和“流”。我希望以最大并发性处理积压的消息,但我有一些要求: 一次只能处理具有相同服务的10条消息 一次只能处理具有相同服务和客户端的4条消息 一次 具有相同服务、客户端和流的所有消息必须 保持秩序 其他信息: 我一直在ServiceMix(Camel+ActiveMQ)上下文中使用“maxConcurrentConsumers”和“JMSXGroupID”,我似乎能够满足三分之二的需求 例如,如果我执行一些基于内容的路由以

问题:

处理积压的消息,其中每条消息有三个标题“服务”、“客户端”和“流”。我希望以最大并发性处理积压的消息,但我有一些要求:

  • 一次只能处理具有相同服务的10条消息
  • 一次只能处理具有相同服务和客户端的4条消息 一次
  • 具有相同服务、客户端和流的所有消息必须 保持秩序

其他信息:

我一直在ServiceMix(Camel+ActiveMQ)上下文中使用“maxConcurrentConsumers”和“JMSXGroupID”,我似乎能够满足三分之二的需求

例如,如果我执行一些基于内容的路由以将积压工作拆分为单独的“服务”队列(每个服务一个队列),那么我可以将JMSXGroupID设置为(服务+客户端+流),并将每个队列的路由消耗设为maxConcurrentConsumers=10。这解决了第一个和最后一个需求,但是对于同一个客户机处理,我可能有太多的消息

请注意,如果解决方案需要为每个服务+客户端组合使用单独的队列和路由,那么这将变得不可管理,因为可能有10个或数千个组合


非常感谢您的反馈!如果我的问题不清楚,请随时建议我如何改进。

据我所知,如果你有10k+组合,这将很难实现

通过使用使用者和选择器,您可以在每个服务/客户端组合中获得一个队列。但是,如果您无法以某种方式预测一组有限的服务/客户机同时处于活动状态,那么这几乎同样难以处理(您无法创建10k+选择器消费者,而不会造成任何伤害,也不会考虑到显著的性能问题)

你能详细说明第二个要求吗?你需要它来确保你的客户之间有某种公平感吗?请详细说明,如果我能想到其他事情,我会更新

更新:
您可以在队列上进行浏览,循环浏览消息并选择一个“有空闲时间”的消息,而不是仅仅通过侦听消息来消费。如果在单个实例中运行某个共享变量,您可能会发现该变量是否已达到限制

非常感谢你的洞察力,@peter!我对选择器的概念不是很熟悉,所以这对我来说是一件值得研究的事情。至于第二个要求,它与SLA有关。由“服务”头表示的web服务只允许每个客户端同时登录指定数量的用户。选择器可能很有用,因为它类似于SQL对队列的访问,但请注意性能影响。在答案中添加一些内容。不确定是否有帮助我认为选择器和/或BrowsableEndpoint界面确实有帮助。如果我能够通过这种方式实现实现目标,我一定会发布。当然,这样做。这会很有趣:)