【发布时间】:2017-03-09 15:06:31
【问题描述】:
如何在多线程环境中实现 RPC 调用? 在这里的基本教程中:https://www.rabbitmq.com/tutorials/tutorial-six-java.html,在多线程环境中,我看到了两个问题:
-如果所有线程都在不同的线程中(包括构造函数),我们为每个线程创建一个回复队列,我认为这不是一个好主意(不是吗?)
-如果只有fibonacciRpc.call("4")在不同的线程,回复队列的消费者可以消费坏回复,这个回复的原始消费者会无限等待。
我暂时没有找到任何解决方案,但也许我不明白。
【问题讨论】:
-
在示例中,每个线程都应该有一个独立的临时回复队列。为什么你认为这会是个问题?
-
我的应用程序是一个Web应用程序,可能同时有很多请求,所以会创建和删除很多回复队列。示例中我不明白的是“Correlation id”,因为我们为每个 RPC 请求创建了一个队列,所以“correlation id”的检查是不必要的,回复队列中的消息不可避免地是请求。如果队列是针对多个请求的,我们在第二秒也许我的错误是我的英语不好......
-
好吧,我不是RabbitMQ专家,但我的理解是回复队列是瞬态的,换句话说,它不需要是持久的,这意味着它只是一个内存队列,因此创建速度应该很快。此外,回复队列是每个消费者,而不是每个请求,这意味着每个线程都对应一个消费者,如果您的线程/消费者发出多个请求,那么所有请求都可以通过同一个回复队列,在这种情况下,相关 ID 是确定所必需的哪个请求拥有答案。