在RabbitMQ Java Client

时间:2016-02-03 10:20:30

标签: 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();
    }
}

问题

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

链接可以帮助您调整RabbitMQ