首页 文章

rabbitmq连接最佳实践我们是否在发布者中保持持久连接

提问于
浏览
2

通常,SQL连接的最佳实践是打开连接,执行查询并配置连接 . 但是,基于AMQP的队列服务器(如RabbitMQ)的推荐做法是什么 . 应用程序是否需要维护与RabbitMQ服务器的持久连接,或者为发布方发送的每条消息打开和关闭连接 .

public static void Main(string[] args)
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using(var connection = factory.CreateConnection())
        using(var channel = connection.CreateModel())
        {
            channel.ExchangeDeclare(exchange: "logs", type: "fanout");

            var message = GetMessage(args);
            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange: "logs",
                                 routingKey: "",
                                 basicProperties: null,
                                 body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }

    private static string GetMessage(string[] args)
    {
        return ((args.Length > 0)
               ? string.Join(" ", args)
               : "info: Hello World!");
    }

1 回答

  • 7

    在RMQ中,连接被认为是“昂贵的” - 它们占用TCP / IP端口,需要握手/协商等等 . 虽然这在SQL Server领域似乎微不足道,但当你谈到在RabbitMQ中每秒发送100K消息时,这种开销变得不可行 .

    因此,对于RMQ,一般的最佳做法是为每个应用程序实例打开一个连接,并尽可能长时间保持打开 - 如果可以的话,应用程序实例的生命周期 .

    在app实例中,您可以在RMQ连接之上创建通道 . 你可以非常快速地创建它们 . 大多数应用程序在RMQ中使用单个通道进行单个操作 . 消息制作人?打开一个 Channels . 从队列中消费?打开一个 Channels . 重新定义队列?打开 Channels 等

    另外 - 如果你使用的是具有线程的语言,比如C#,你必须将你的 Channels 限制为一个线程 . 不要跨线程重用通道 . 如果你试图这样做会发生非常糟糕的事情 .

相关问题