在 RabbitMQ Java 客户端中每次发布时打开和关闭通道
Open and close Channel with each publish in RabbitMQ Java Client
场景
我正在编写一个 Java 应用程序,它可以从多个不同的来源将产品导入数据库,然后将更新后的产品导出到搜索引擎和 RSS 提要等其他系统。多次进口,多次出口。由于一些出口商尽快获得更新至关重要,我让他们留在 运行 并通过 RabbitMQ 实例中的队列侦听更新。一些导入器会批量处理文件(这意味着附近会有很多更新),一些导入器会偶尔获取更新(每小时更新几次,比如来自管理员)。每个导入器都会有一个 UpdateNotifier 实例。
例子
这是(稍微简化的)class,用于将更新产品的 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 的每个实例中缓存通道?
也许有两种不同的通知程序,一种用于在实例中保留通道的批量更新,另一种用于在每次更新时打开和关闭通道的零星更新?
因此归结为:
打开和关闭通道的成本是多少?
创建和销毁通道对于 RabbitMQ 来说是非常简单快速的操作。
但是,如果您需要高吞吐量 create/destroy 每次发布的通道都会影响性能。
以我的观点,您不需要缓存通道等,只需为线程使用一个通道即可。
我建议阅读此 https://www.rabbitmq.com/production-checklist.html and https://www.rabbitmq.com/networking.html .
这些链接可以帮助您调整 RabbitMQ
场景
我正在编写一个 Java 应用程序,它可以从多个不同的来源将产品导入数据库,然后将更新后的产品导出到搜索引擎和 RSS 提要等其他系统。多次进口,多次出口。由于一些出口商尽快获得更新至关重要,我让他们留在 运行 并通过 RabbitMQ 实例中的队列侦听更新。一些导入器会批量处理文件(这意味着附近会有很多更新),一些导入器会偶尔获取更新(每小时更新几次,比如来自管理员)。每个导入器都会有一个 UpdateNotifier 实例。
例子
这是(稍微简化的)class,用于将更新产品的 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 的每个实例中缓存通道?
也许有两种不同的通知程序,一种用于在实例中保留通道的批量更新,另一种用于在每次更新时打开和关闭通道的零星更新?
因此归结为: 打开和关闭通道的成本是多少?
创建和销毁通道对于 RabbitMQ 来说是非常简单快速的操作。
但是,如果您需要高吞吐量 create/destroy 每次发布的通道都会影响性能。
以我的观点,您不需要缓存通道等,只需为线程使用一个通道即可。
我建议阅读此 https://www.rabbitmq.com/production-checklist.html and https://www.rabbitmq.com/networking.html .
这些链接可以帮助您调整 RabbitMQ