向RabbitMQ发送数千条消息,以了解是否已确认

5vf7fwbs  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(225)

我正在做一个.net的核心项目,这个项目向Rabbitmq发送上千条消息。消息的数量在10K到500K之间。
我声明了一个循环,在这里我调用RabbitMQ.Client库的BasicPublish方法来发送我的消息。我需要验证消息是否由代理发送和接收,并根据结果更新数据库。
我想使用_channel.BasicAcks += _channel_BasicAcks_channel.ConfirmSelect();_channel.WaitForConfirmsOrDie();来触发event _channel_BasicAcks,以了解代理是否收到消息。
代码示例:

_channel.BasicAcks += _channel_BasicAcks;
        _channel.BasicNacks += _channel_BasicNacks;

        _channel.QueueDeclare(queue: "myQueue",
                              durable: true,
                              exclusive: false,
                              autoDelete: false,
                              arguments: arguments);
        _channel.ConfirmSelect();

        for (int i = 0; i < 500000; i++)
        {
            _channel.BasicPublish("exchange", "routingKey", null, Encoding.UTF8.GetBytes("some data"));
            _channel.WaitForConfirmsOrDie();
        }

        private void _channel_BasicAcks(object? sender, BasicAckEventArgs e)
        {
           //some code here....
        }

这是实现这一目标的最佳方法吗?还是有其他解决方案可以处理大量邮件?

rbl8hiat

rbl8hiat1#

WaitForConfirmsOrDie是同步的,速度很慢。您应该跟踪未完成的确认(例如,通过一个并发哈希表),并在_channel_BasicAcks_channel_BasicNacks回调中处理它们。
如果你收到了一个Nack,你应该重新发布这个消息。请看我下面链接的教程中的警告。
如果你收到一个Ack,你就知道消息已经被确认了,你可以从你的跟踪数据结构中删除它。一定要检查RabbitMQ是否确认了多个消息。
我们提供了示例代码:
https://www.rabbitmq.com/tutorials/tutorial-seven-dotnet.html

**注意:**RabbitMQ团队监控rabbitmq-users邮件列表,仅在某些时候回答StackOverflow上的问题。

相关问题