我正在做一个.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....
}
这是实现这一目标的最佳方法吗?还是有其他解决方案可以处理大量邮件?
1条答案
按热度按时间rbl8hiat1#
WaitForConfirmsOrDie
是同步的,速度很慢。您应该跟踪未完成的确认(例如,通过一个并发哈希表),并在_channel_BasicAcks
和_channel_BasicNacks
回调中处理它们。如果你收到了一个Nack,你应该重新发布这个消息。请看我下面链接的教程中的警告。
如果你收到一个Ack,你就知道消息已经被确认了,你可以从你的跟踪数据结构中删除它。一定要检查RabbitMQ是否确认了多个消息。
我们提供了示例代码:
https://www.rabbitmq.com/tutorials/tutorial-seven-dotnet.html
**注意:**RabbitMQ团队监控
rabbitmq-users
邮件列表,仅在某些时候回答StackOverflow上的问题。