我应该为每个线程创建一个连接吗?

Sai*_*eni 5 java multithreading rabbitmq

我正在运行 2 个多线程程序。

第一个程序中的每个线程充当生产者并将消息写入队列,而第二个程序中的每个线程充当消费者并从同一队列中读取消息。

在这两个项目中,我创建了一个连接工厂,如下所示:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setAutomaticRecoveryEnabled(true);
factory.setRequestedChannelMax(0);
factory.setUsername("user");
factory.setPassword("password");
Run Code Online (Sandbox Code Playgroud)

但是我不确定下一步的推荐方法。

  1. 我应该在每个线程开始时创建一个新连接,例如:

    Connection connection = factory.newConnection();
    
    Run Code Online (Sandbox Code Playgroud)

    然后为每个请求创建一个新通道,例如:

    Channel channel = connection.createChannel();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者我应该只创建一个连接,使线程共享相同的连接,然后为每个请求创建一个新通道。

我知道该连接是套接字线程安全连接,应该小心创建。我只是问我的程序中是否有推荐的方法,因为通常文档会包含处理连接和套接字的推荐方法,但我在 RabbitMQ 的文档中找不到这样的答案。

Stu*_*tLC 5

使用选项 2。Rabbit MQ 可以为每个进程共享一个连接,因此除非您连接到多个代理或具有极端的负载配置文件,否则在进程中的所有线程之间共享一个长期存在的连接就足够了。获取连接的成本相对较高(下降了 80%) ,因此短暂的连接会影响生产者的性能。

连接是线程安全的——在内部,RabbitMQ 客户端在单个连接上复用多个通道,从而允许并发使用该连接。

即您可以将连接用作“通道工厂”。但是,通道不是线程安全的,因此您通常会创建一个短暂的通道,生成一条消息,然后关闭生产者上的通道(获取通道的成本很低)。

建议生产者不要将消息直接发送到队列,而是将消息发布到 Exchange(即跳到“发布-订阅”教程)。通过这种方式,您可以利用其他路由拓扑,超越旧中间件(例如 MSMQ / MQSeries)使用的经典点对点机制。