Redis 如何在任何MQ平台中实现此单一并发分布式队列?

Redis 如何在任何MQ平台中实现此单一并发分布式队列?,redis,queue,message-queue,amazon-sqs,Redis,Queue,Message Queue,Amazon Sqs,我目前正在努力寻找一种解决方案来实现一种特定类型的队列,它需要以下特性: 所有队列必须遵守添加作业的顺序 整个队列的并发性为1,这意味着每个队列每次只执行一个作业,而不是工作进程 像这样的队伍将超过几千人 它需要分布并能够扩展(例如,如果我添加了一个worker) 基本上,它是一个单进程FIFO队列,这正是我在试用不同的消息队列软件(如ActiveMQ或RabbitMQ)时想要的,但一旦我将其扩展到2个工作线程,它就不起作用了,因为在这种情况下,我希望它扩展并保持与单进程队列完全相同的功能。下面

我目前正在努力寻找一种解决方案来实现一种特定类型的队列,它需要以下特性:

  • 所有队列必须遵守添加作业的顺序
  • 整个队列的并发性为1,这意味着每个队列每次只执行一个作业,而不是工作进程
  • 像这样的队伍将超过几千人
  • 它需要分布并能够扩展(例如,如果我添加了一个worker)
  • 基本上,它是一个单进程FIFO队列,这正是我在试用不同的消息队列软件(如ActiveMQ或RabbitMQ)时想要的,但一旦我将其扩展到2个工作线程,它就不起作用了,因为在这种情况下,我希望它扩展并保持与单进程队列完全相同的功能。下面我附上它在具有多个工作线程的分布式环境中如何工作的描述

    拓扑外观示例:(请注意,队列工作者之间存在多对多关系)

    它将如何运行的示例:

    +------+-----------------+-----------------+-----------------+
    | Step | Worker 1        | Worker 2        | Worker 3        |
    +------+-----------------+-----------------+-----------------+
    | 1    | Fetch Q/1/Job/1 | Fetch Q/2/Job/1 | Waiting         |
    +------+-----------------+-----------------+-----------------+
    | 2    | Running         | Running         | Waiting         |
    +------+-----------------+-----------------+-----------------+
    | 3    | Running         | Done Q/2/Job/1  | Fetch Q/2/Job/2 |
    +------+-----------------+-----------------+-----------------+
    | 4    | Done Q/1/Job/1  | Fetch Q/1/Job/2 | Running         |
    +------+-----------------+-----------------+-----------------+
    | 5    | Waiting         | Running         | Running         |
    +------+-----------------+-----------------+-----------------+
    
    这可能不是最好的表示,但它表明,即使在队列1和队列2中,也有更多的作业,但是工作者3在前一个作业完成之前不会开始提取下一个作业。

    这就是我努力寻找一个好的解决方案的原因

    我尝试过很多其他解决方案,比如rabbitMQ、activeMQ、apollo。。。这些允许我创建数千个队列,但在我尝试时,所有这些队列都将使用worker 3来运行队列中的下一个作业。并且并发性是每个工作者的

    是否有任何解决方案可以在任何MQ平台(例如ActiveMQ、RabbitMQ、ZeroMQ等)中实现这一点


    谢谢:)

    您可以使用Redis列表和一个附加的“调度”队列来实现这一点,所有工人
    BRPOP
    都可以打开该队列进行工作。调度队列中的每个作业都标记有原始队列ID,当工作人员完成该作业后,它将转到该原始队列并执行
    rpoplush
    到调度队列上,以使下一个作业可供任何其他工作人员使用。因此,调度队列最多有num_queues元素


    您必须处理的一件事是源队列为空时调度队列的初始填充。这可能只是发布者针对初始设置的每个队列的“空”标志所做的检查,也可能是工作者在原始队列中没有留下任何要分派的内容时所做的检查。如果设置了此标志,则发布者可以将第一个作业直接推送到调度队列上。

    主题当然很有趣。关于堆栈溢出,请求非站点资源是离题的。什么是非站点资源?如果需要的话,我会重新措辞这个问题。我想问的更像是一种实现方法,而不是严格地寻找程序/解决方案。