gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:21:35 31 4
gpt4 key购买 nike

一般来说,SQL连接的最佳实践是打开连接,执行查询,释放连接。但是,对于像 RabbitMQ 这样的基于 AMQP 的队列服务器,推荐的做法是什么。应用程序是否需要保持与 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!");
}

最佳答案

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

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

在应用程序实例中,您在 RMQ 连接之上创建 channel 。你可以非常快速地创建这些。大多数应用程序在 RMQ 中使用单一 channel handler 单一事物。消息生产者?打开一个 channel 。从队列消费?打开一个 channel 。重新定义队列?开通 channel 等

此外 - 如果您使用的语言具有线程,例如 C#,则必须将您的 channel 限制为单线程。不要跨线程重复使用 channel 。如果您尝试这样做,将会发生非常糟糕的事情。

关于c# - rabbitmq 连接最佳实践我们是否在发布者中保持持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39071511/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com