【问题标题】:RabbitMQ RPC producer with Multithreading具有多线程的 RabbitMQ RPC 生产者
【发布时间】: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 是确定所必需的哪个请求拥有答案。

标签: java rabbitmq


【解决方案1】:

就我而言: channel.basicConsume(replyQueueName, true, new DefaultConsumer(channel) {} 导致内存中有很多堆大小,只要我不删除通道,它就不会被清除。

根据 Internet ,您应该创建一个连接。 为每个线程创建通道并为每个通道创建单独的队列,并在您阅读响应后删除队列,如果您不这样做,它将在同一个通道中一遍又一遍地创建新队列。

但新的 DefaultConsumer 正在创建大量堆内存。

看起来要摆脱这个我必须删除频道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2016-03-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多