我目前面临一个问题,我很确定有一个官方名称,但我不知道在网上搜索什么。我希望如果我描述了我想到的问题和解决方案,有人能够告诉我设计模式的名称(如果有一个与我将要描述的匹配)。
基本上,我想要的是一个作业队列:我有多个创建作业的客户端(发布者),以及一些处理这些作业的工人(消费者)。现在我想将发布者创建的作业分发给各个消费者,这基本上可以使用几乎任何具有跨队列负载平衡的消息队列来实现,例如使用 RabbitMQ 甚至 MQTT 5。
然而,现在事情变得复杂了……每个工作都指向一个外部实体,比如说一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户。我没有要求用户 X 的工作总是交给工人 Y,因为无论如何它们都应该按顺序处理。
现在我可以使用 RabbitMQ 及其一致的哈希交换来解决这个问题,但是当新的工作人员进入集群时我会遇到数据竞争,因为 RabbitMQ 不支持重新定位已经在队列中的作业。
MQTT 5 也不支持这个:这里这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是 MQTT 6 的一部分,也可能不是。谁知道。
我还查看了 NSQ、NATS 和其他一些经纪人。他们中的大多数甚至不支持这种非常具体的场景,而那些确实使用一致哈希的场景,其中存在前面提到的数据竞速问题。
现在,如果代理不将作业排序到队列中,一旦作业到达,问题就会消失,但是如果它会跟踪特定用户的作业是否已经被处理:如果是这样,它应该延迟所有其他作业此用户,但其他用户的所有作业仍应处理。这是,AFAICS,使用 RabbitMQ 等人是不可能的。
我很确定我不是唯一一个有这个用例的人。例如,我可以想到用户将视频上传到视频平台,虽然上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。
所以,长话短说:我所描述的东西是否以一个通用名称而闻名?诸如分布式作业队列之类的东西?具有任务亲和性的任务调度程序?还是别的什么?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但正如所说,很难想象我是这个星球上唯一遇到这个问题的人。
有什么我可以寻找的想法吗?并且:是否有任何工具可以实现这一点?有什么协议吗?
PS:只使用预定义的路由键不是一个选项,因为用户 ID(我只是在这里作为一个虚构的例子)基本上是 UUID,所以可能有数十亿个,所以我需要更动态的东西。因此,一致的散列基本上是正确的方法,但如前所述,分布必须逐个工作,而不是预先进行,以避免数据竞争。