【发布时间】:2023-07-15 06:10:01
【问题描述】:
我正在尝试构建一个系统,我需要选择下一个可用且合适的消费者从队列发送消息(或者可能是任何其他不使用队列的解决方案)
要求 我们有多个发布者/客户将发送对象(图像)以在一侧进行处理,并且有多个分析师将处理它们,一旦处理,发布者应该得到相应的响应。
发布者并不关心哪个分析师将处理数据。
用户有一个网络应用程序,他们可以将每个客户端/发布者映射到一个或多个或所有代理,例如,如果发布者 P1 映射到代理 A 和 B,则来自 P1 的所有对象都可以由代理 A 或Agent B. 注意:一个对象只能由一个代理处理。
根据映射,我应该有一个中间件,它使用来自所有发布者的消息并分发给代理
解决方案 1 我最初的想法是建立一个所有发布者发布消息的队列。代理发布消息说他们正在等待处理对象的另一个队列。
中间件选择消息,获取可以将消息发送到的可能代理列表(从缓存的数据库中),并通过代理队列找到下一个合适且可用的代理并将消息发布到该代理。
这个解决方案的问题是,如果我有像 a、b、c、d 这样的代理队列,而我收到的消息只能由代理 b 处理,我将拒绝代理 d & c,他们最终会排在最后我有大约 180 个代理,所以他们可能永远不会被选中,或者如果下一条消息只能由代理 d 处理(例如),我们必须拒绝所有代理才能到达那里
解决方案 2 从发布者到中间件的第一位还是一样
拥有一个可扩展的快速 nosql 数据库,代理会在其中添加一条记录以通知那里的可用性。基本上是一个键值对
中间件从缓存中获取配置,并从 nosql 数据库中获取下一个可用 + 合适的代理 将消息发送到代理的队列(通过直接交换)并更新 nosql 以设置 isavailable false ad 获取下一条消息。
这个解决方案的问题是数据库和中间件可能成为瓶颈,如果我扩展中间件,我最终会遇到数据库并发问题,例如我有两个中间件副本正在运行,每个副本都会收到一条可以处理的消息由代理 A 和 B 提供,两个代理均可用。 这两个中间件副本将查询数据库,并可能使 A 可用,并最终将两条消息发送给 A,而 B 仍在等待消息处理。
我将拥有大约 100 个出版商和 180 个代理商。
任何想法如何改进这些解决方案或任何其他可行的解决方案将不胜感激?
基于此,我还需要弄清楚代理如何将响应发送回发布者。
谢谢
【问题讨论】:
-
当您说“出版商”和“代理”时,您指的是软件还是人?
-
发布者是一个软件,代理是一个人,他最终会在屏幕上看到这个图像,然后点击一个按钮来启动这个过程
-
回答这个问题的尝试证明它过于宽泛以及主要基于意见
标签: rabbitmq messaging soa nosql