RabbitMQ请求响应与消息确认

3
我正在使用Java和Spring Framework的RabbitMQ,有一个生产者和一个消费者,两者都将有多个实例运行。然而,每个请求来到生产者时都会生成一条消息,由消费者处理,该消费者应该能够回复给同一个生产者(与其持有的请求完全相同)。

所以要求如下:

  • 生产者将收到HTTP请求,然后生成一条消息并将其推送到队列中。
  • 消息内容只能由一个消费者处理,没有其他消费者应处理相同的消息。
  • 该消息应等待确认。
  • 任何消费者都可以处理该消息,但当消费者失败时,该消息应返回到队列中,因为我们需要从中恢复。
  • 完成后,消费者应向完全相同的生产者回复,因为它现在持有该请求。
  • 如果生产者失败,则该请求也应失败,因此消费者应在回复之前检查生产者是否仍然活动,如果不可用,则应失败。

因此:

请求--> Producer1 --> 队列 --> 消费者1

--> Producer1等待

--> 消费者1失败

--> 将消息返回到队列中

--> 消费者2获取消息并继续消费者1的进度

--> 消费者2完成并确认请求消息,发送响应

--> 消费者2发现生产者1已经失败,因此需要发送一个失败信号

目前,我能想到的是: 1. 直接回复模式:但这里的问题是消息没有确认要求,但我需要能够从消费者故障中恢复 2. RPC模型:它没有解决生产者故障的问题

还有其他解决方案吗?我做错了吗?


你最后的观点在解释rabbitmq的使用逻辑时有些偏差。生产者不应该知道谁会接收消息,也不知道是否有人会接收。如果生产者知道有人会接收消息,那么为什么还要使用消息代理呢?需要注意的是,发送消息的任何客户端都是生产者,而接收消息的任何客户端都是消费者。当然,一个客户端可以同时是生产者和消费者,例如RPC示例。这也是为什么rabbitmq没有客户端故障处理(生产者或消费者)的原因。 - cantSleepNow
@cantSleepNow 我们需要消息代理进行恢复,如果我们使用直接调用,则无法在消费者失败时进行恢复,而且我们也永远无法知道它正在处理哪些作业并失败了。 - engma
我知道这是一个Java问题,但是在.NET中有轻量级消息总线工具MassTransit和NServiceBus,它们使用RabbitMQ作为消息代理处理请求/响应。这两个工具位于RabbitMQ的抽象层之上,便于请求/响应、发送和发布模式,并处理消息序列化/反序列化。但是我不知道是否有Java的类似工具。 - Andy
1个回答

0

看起来要实现这个过程,我们必须使用直接方式,但我还不确定。一旦找到解决方案,我会告诉你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接