java - 在 RabbitMQ Java 客户端中每次发布时打开和关闭 Channel

标签 java rabbitmq channel

场景

我正在编写一个 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();
    }
}

问题

是否建议为每次发布打开一个新 channel 然后关闭它,或者在 UpdateNotifier 的每个实例中缓存该 channel 会更好吗?

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

所以归结为: 打开和关闭 channel 的成本有多大?

最佳答案

创建和销毁 channel 对于 RabbitMQ 来说是非常简单且快速的操作。

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

就我的观点而言,您不需要缓存 channel 等,只需为线程使用一个 channel 即可安全。

我建议阅读这篇文章 https://www.rabbitmq.com/production-checklist.htmlhttps://www.rabbitmq.com/networking.html .

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

关于java - 在 RabbitMQ Java 客户端中每次发布时打开和关闭 Channel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35174270/

相关文章:

rabbitmq - 为什么我已经安装了RabbitMQ却找不到 'rabbitmq.config'文件?

go - 同时计算树叶

algorithm - 广播信道的最优重传算法

java - Spring模型属性/jsp不可见

java - 使用 pdfbox 翻转 PDF

java - 如何让 shuffler 方法仅对数组中的某些索引进行洗牌?虽然不打乱我想保持不变的索引

Scala Actor 异常 "react on channel belonging to other actor"

java - StartActivity 一旦用户在权限屏幕上单击允许

php - RabbitMQ 错误 : fwrite(): send of 12 bytes failed with errno=104 Connection reset by peer

java - Mysql 事务和 RabbitMq