Architecture 发布并等待关于RabbitMQ/EasyNetQ主题的响应-如何仅获取您的?

Architecture 发布并等待关于RabbitMQ/EasyNetQ主题的响应-如何仅获取您的?,architecture,rabbitmq,easynetq,Architecture,Rabbitmq,Easynetq,当发布者希望得到消息的答案时,如何确保在扩展消息时,它只获得相关的答案(对其自己的消息) 我们有一个客户端进程,它发布一条消息供服务器进程应答。此外,我们还有一个“监听器”流程,只需要使用问题和答案,而不发布任何内容。此外,服务器进程将来可能会被分解为多个进程,从而创建一个消息级联。我们不能使用请求/响应,因为我们需要侦听器,然后,当我们有级联时。。。此外,我们将有几个问题/答案类别,EasyNetQ中的请求/响应不支持主题 我们使用EasyNetQ的解决方案是简单的基于主题的发布/订阅:客户端

当发布者希望得到消息的答案时,如何确保在扩展消息时,它只获得相关的答案(对其自己的消息)

我们有一个客户端进程,它发布一条消息供服务器进程应答。此外,我们还有一个“监听器”流程,只需要使用问题和答案,而不发布任何内容。此外,服务器进程将来可能会被分解为多个进程,从而创建一个消息级联。我们不能使用请求/响应,因为我们需要侦听器,然后,当我们有级联时。。。此外,我们将有几个问题/答案类别,EasyNetQ中的请求/响应不支持主题

我们使用EasyNetQ的解决方案是简单的基于主题的发布/订阅:客户端发布到“问题”主题,订阅到“答案”,服务器订阅到“问题”并发布到“答案”,而侦听器只订阅这两个主题

问题是当您扩展客户机时。现在有两个实例发布了问题,但由于它们都订阅了一个“答案”主题,其中一个实例可能会得到另一个实例发布的问题的答案,而不会得到自己的答案

我们找到的解决方案是让客户端在订阅“答案””时使用一个唯一命名的队列-这样每个客户端都将获得所有答案,只需忽略那些不是自己的答案。但是,此解决方案存在一些性能缺陷,并且每次客户端崩溃(或在开发过程中重新启动等)时,都会导致RabbitMQ中累积唯一命名的队列

客户端,正在发送对象消息:

string corrId = Guid.NewGuid().ToString();

// Register the corrId in a dictionary
//...

var myMessage = new MyMessage {correlationId =corrId, realMessage = msg};
easyNetQBus.Subscribe<MyMessage>("mqClient"+uniqueSuffix, HandleMsg, x => x.WithTopic("answer"));
easyNetQBus.Publish(myMessage, "question");

// In HandleMsg, we see if we have issued questions with the correlation id that came with the answer (lookup in the dictionary) and if not, ignore it
string corrId=Guid.NewGuid().ToString();
//把勘误表登记在字典里
//...
var myMessage=newmymessage{correlationId=corrId,realMessage=msg};
订阅(“mqClient”+uniqueSuffix,HandleMsg,x=>x.WithTopic(“answer”);
发布(myMessage,“问题”);
//在HandleMsg中,我们查看是否发布了带有答案(在字典中查找)的相关id的问题,如果没有,则忽略它
服务器:

easyNetQBus.Subscribe<MyMessage>("mqServer", HandleMsg, x => x.WithTopic("question"));

// In HandleMsg, we publish the answer back to "answer" with the correlation id from the question
easyNetQBus.Subscribe(“mqServer”,HandleMsg,x=>x.WithTopic(“问题”);
//在HandleMsg中,我们使用问题的相关id将答案发布回“答案”
我们是否应该使用另一种模式?我们可以在每条消息中放入一个独特的主题/队列来发送答案,但这会使听者的生活和我提到的级联中未来参与者的灵活性变得复杂