Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在发布消息rabbitmq之前选择使用者_Rabbitmq_Messaging_Soa_Nosql - Fatal编程技术网

在发布消息rabbitmq之前选择使用者

在发布消息rabbitmq之前选择使用者,rabbitmq,messaging,soa,nosql,Rabbitmq,Messaging,Soa,Nosql,我正在尝试构建一个系统,在该系统中,我需要选择下一个可用且合适的消费者从队列发送消息(或者可能是不使用该队列的任何其他解决方案) 要求 我们有多个发布者/客户机,他们将在一方发送对象(图像)进行处理,还有多个分析人员将对其进行处理,一旦处理完毕,发布者应得到相应的响应 出版商不在乎由哪位分析师来处理数据 用户有一个web应用程序,可以将每个客户端/发布服务器映射到一个或多个或所有代理,例如,如果发布服务器P1映射到代理a和代理B,则来自P1的所有对象都可以由代理a或代理B处理。注:一个对象只能由

我正在尝试构建一个系统,在该系统中,我需要选择下一个可用且合适的消费者从队列发送消息(或者可能是不使用该队列的任何其他解决方案)

要求 我们有多个发布者/客户机,他们将在一方发送对象(图像)进行处理,还有多个分析人员将对其进行处理,一旦处理完毕,发布者应得到相应的响应

出版商不在乎由哪位分析师来处理数据

用户有一个web应用程序,可以将每个客户端/发布服务器映射到一个或多个或所有代理,例如,如果发布服务器P1映射到代理a和代理B,则来自P1的所有对象都可以由代理a或代理B处理。注:一个对象只能由一个代理处理

根据映射,我应该有一个中间件,它使用来自所有发布者的消息并分发给代理

解决方案1 我最初的想法是建立一个队列,让所有的发布者发布他们的消息。另一个队列,代理发布消息说他们正在等待处理对象

中间件拾取消息,获取它可以将消息发送到的代理的可能列表(从缓存的数据库),并通过代理队列查找下一个合适的可用代理,然后将消息发布到该代理

此解决方案的问题是,如果我有代理队列,如a、b、c、d,并且我收到的消息只能由代理b处理,我将拒绝代理d&c,它们将最终位于队列的尾部,我有大约180个代理,因此它们可能永远不会被拾取,或者如果下一条消息只能由代理d处理(例如)我们必须拒绝所有的代理人才能到达那里

解决方案2 从发布服务器到中间件的第一位仍然是相同的

有一个扩展的快速nosql数据库,代理在其中添加一条记录以通知可用性。基本上是一个键值对

中间件从缓存获取配置,并从nosql数据库获取下一个可用+合适的代理,将消息发送到代理的队列(通过直接交换),并更新nosql以设置isavailable false,并获取下一条消息

这个解决方案的问题是数据库和中间件可能会成为瓶颈,而且如果我扩展中间件,我最终会遇到数据库并发问题,例如,如果我有两个运行的中间件副本,每个副本都会收到一条消息,这条消息可以由代理a和代理B处理,并且两个代理都可用。 这两个中间件副本将查询数据库,并可能获得可用的A,最终在B仍在等待消息处理时将两条消息都发送给A

我将有大约100个出版商和180个代理商开始

对于如何改进这些解决方案或任何其他可行的解决方案,我们将不胜感激

根据这一点,我还需要弄清楚代理如何将响应发送回发布者


谢谢

我将从我的开源服务总线的角度回答这个问题:

通常,人们会忽略任何基于内容的路由,而只是拥有一个分发模式。所有消息都将发送到主端点,它将分发消息。但是,如果您决定坚持使用这些逻辑分组,则每个逻辑分组(每个代理组)都可以有主端点。您仍然会有主端点,但不是将工作端点映射到代理,而是将代理分组映射到逻辑主端点,并由工作端点支持

然后,在主端点中,根据您的内容(作为代理标识符),将消息转发到相关的逻辑主端点。一直跟踪原始发件人。在worker中,您将向原始发件人的队列发送一条消息


我相信,使用任何服务总线,您都可以做到几乎相同的效果。

由于发送方和接收方的总数只有数百个,如何为每个发送方创建一个队列。根据发送方-接收方映射,接收方订阅发送方队列(在映射更改时更新订阅)。您可以将接收器配置为在处理完一条消息后(以随机方式)只从其订阅的所有队列接收下一条消息。

我在这里看到了几个要求,可以归结为几件事,我认为:

  • publisher不关心哪个代理处理映像
  • publisher需要知道图像处理何时完成
  • 代理一次只能处理一个映像
  • 代理只能处理某些图像
这些假设正确吗?我错过了什么重要的事情吗

如果不是,那么您的解决方案基本上是内置在RabbitMQ中的,带有路由和队列。应该不需要构建定制的中间层服务来管理它

使用RabbitMQ,可以将使用者设置为一次仅处理1条消息。消费者将其“预回迁”限制设置为1,并从队列中检索消息,将“无确认”设置为
false
——这意味着,消费者在处理完消息后必须确认消息

要仅使用特定代理可以处理的消息,请将RabbitMQ的路由功能用于多个队列。队列将根据图像类型或消费者可以选择图像的一些其他标准创建

例如,如果有两种类型的图像:TypeA和TypeB,您将有两个队列-一个用于TypeA,一个用于TypeB

然后,如果Agent1只能处理TypeA图像,那么它将只使用TypeA队列中的图像。如果Agent2可以处理这两种类型的映像,它将从两个队列中使用

要将正确的图像放入正确的队列,发布者需要使用正确的路由密钥。如果您知道图像类型(或任何se