Java 实现队列队列的队列代理

Java 实现队列队列的队列代理,java,rabbitmq,queue,message-queue,Java,Rabbitmq,Queue,Message Queue,我正在为我的用例寻找一个队列代理,但是我很难找到一个适合我需要的。也许我的需求不常见,或者我正在以错误的方式解决我的问题 情况:数以百万计的人口统计数据信息进入系统。这些消息中的每一条都具有该人独有的标识符。不幸的是,发送系统差异很大,有些系统有一些奇怪的做法,导致几十个,甚至偶尔数百个相同的人在很短的时间内进入系统。我们目前的排队系统有多个处理器,不知道这些人和他们的标识符,它基本上是一个基于时间的bucket pull和process。因此,我们可能会在同一时间处理同一个人,从而导致争用和竞

我正在为我的用例寻找一个队列代理,但是我很难找到一个适合我需要的。也许我的需求不常见,或者我正在以错误的方式解决我的问题

情况:数以百万计的人口统计数据信息进入系统。这些消息中的每一条都具有该人独有的标识符。不幸的是,发送系统差异很大,有些系统有一些奇怪的做法,导致几十个,甚至偶尔数百个相同的人在很短的时间内进入系统。我们目前的排队系统有多个处理器,不知道这些人和他们的标识符,它基本上是一个基于时间的bucket pull和process。因此,我们可能会在同一时间处理同一个人,从而导致争用和竞争条件。归根结底,由于数据库事务回滚,这不是一个数据问题,但显然是许多不必要的处理(因为失败的事务导致消息被重新查询)。但是,由于下游操作和我们缺乏发送系统的知识,我们不能真正忽略或删除某些消息——我们最终必须处理它们

我的理想解决方案是基于每个人的唯一标识符的队列。因此,它的工作方式是有一个不断被处理的主队列。每次一个唯一的人进入系统时,都会为该标识符创建一个新队列。如果此人再次进来,消息将被添加到该唯一标识符队列中。因此,当主队列最终退出该元素时,它将按顺序通过该唯一标识符队列。由于每个唯一标识符队列的工作将在一个单独的线程中进行,因此主队列可以继续分派元素(最高可达uniqueue标识符队列工作线程数量的任意限制)。这允许处理多条消息,而不需要由不同的进程处理同一个人

我已经对RabbitMQ进行了广泛的研究,没有发现任何允许这种行为的东西。即使我要为每个唯一标识符创建一个新队列,我也看不到一种有序处理它们的方式。而光是创建数百万个队列的开销就相当大了


我只简要介绍了其他排队代理,但在谷歌上搜索队列的概念并没有返回多少有用的信息,因此我开始认为这是一个人们不需要解决的问题。所以,我的问题是,有没有一种解决方案能够以类似于我所描述的方式简化队列?如果没有,是否有更好或不同的处理方法?

不确定是否相关,但您是否查看过?目前还不清楚您的队列是如何使用的。您是否为每个队列处理一种类型的函数?@我们当前的队列处理器只提取一个事件桶(比如200个)并处理它们。有多个队列处理器。我不知道这是否真的重要,因为我们希望改进当前的队列处理,而不是完全复制它。按照现在的方式,重复唯一标识符的人很容易被不同的处理者同时处理,因此希望有一个队列。我发现,将队列组织起来只处理一种类型的事情(例如,单个事件类型)特别有用。如果您有不止一种类型的东西,通常需要不止一个队列。您是正确的,RabbitMQ没有基于队列中项目的属性实现高级分区。在一个专门用于此目的的工具中,例如数据库中,这样做会更好。@AHungerArtist因为我有一个类似于您一年前的问题,我想知道您是如何(如果!)解决它的。你介意在这里分享你的经历吗?