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