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

Tru*_*der 6 c# connection amqp rabbitmq

通常,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!");
    }
Run Code Online (Sandbox Code Playgroud)

Der*_*ley 12

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

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

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

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

  • https://www.cloudamqp.com/blog/2017-12-29-part1-rabbitmq-best-practice.html (2认同)