我正在编写一个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?
可能有两个不同的通知程序,一个用于批量更新,用于保留实例中的通道,另一个用于每次更新时打开和关闭通道的零星更新?
所以归结为: 打开和关闭频道的成本有多高?
答案 0 :(得分:5)
创建并销毁一个通道,这对RabbitMQ来说非常简单快捷。
但是,如果您需要高吞吐量创建/销毁每个发布的频道可能会影响性能。
对于我的观点,你不需要缓存频道等,只需使用一个频道进行线程,你就是安全的。
我建议您阅读https://www.rabbitmq.com/production-checklist.html和https://www.rabbitmq.com/networking.html。
链接可以帮助您调整RabbitMQ