在RabbitMQ Java Client中每次发布都打开和关闭Channel

Fre*_*ris 2 java rabbitmq channels

脚本

我正在编写一个Java应用程序,它将产品从几个不同的源导入数据库,然后将更新的产品导出到其他系统,如搜索引擎和RSS源.多次进口,多次出口.至关重要的是,一些出口商尽快获得更新,我让他们继续运行并通过RabbitMQ实例中的队列监听更新.一些进口商将批量处理文件(意味着会有近距离的许多更新),一些进口商偶尔获得更新(一小时更新一次,比如来自管理员).每个导入器都有一个UpdateNotifier实例.

这是(稍微简化)用于将更新产品的ID添加到RabbitMQ交换的类:

public class UpdateNotifier
{
    private Connection conn;

    public UpdateNotifier(Connection alreadyOpenConnection)
    {
        conn = alreadyOpenConnection;
    }

    public void productIsUpdated(String id)
    {
        Channel chan = conn.createChannel();

        publishTheMessageToExchange(chan, id);

        chan.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否建议为每个发布打开一个新通道然后关闭它,或者最好在UpdateNotifier的每个实例中缓存Channel?

也许两个不​​同的通知程序,一个用于批量更新,在实例中保留一个通道,另一个用于每次更新打开和关闭通道的零星更新?

所以归结为: 开启和关闭频道的成本有多高?

Gab*_*ele 6

创建和销毁一个通道,这对RabbitMQ来说非常简单快捷.

但是,如果您需要高吞吐量创建/销毁每个发布的通道可能会影响性能.

对于我的观点,你不需要缓存通道等,只需使用一个通道进行线程,你就是安全的.

我建议你阅读这个https://www.rabbitmq.com/production-checklist.htmlhttps://www.rabbitmq.com/networking.html.

这些链接可以帮助您调整RabbitMQ