当前位置:  开发笔记 > 编程语言 > 正文

使用NService Bus发布大量消息

如何解决《使用NServiceBus发布大量消息》经验,为你挑选了1个好方法。

我想使用n服务总线发布大量消息.我找到了一个重载的Publish方法,它将消息列表作为参数.当我尝试使用它时,它显示以下错误

  var message= new Message
                    {                           
                        Id = id,
                        Timestamp = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local),
                        PublishingStartTimestamp = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local)

                    };

                    bus.Publish(new[] { message, message});

错误:'NServiceBus.IBus.Publish(params T [])'已过时:'已删除以减少复杂性和API混淆.有关更多信息,请参阅https://github.com/Particular/NServiceBus/issues/1346.将在5.0.0版本中删除.

什么是发布大量邮件的替代方法. 我的任务是每秒发布600个事件. 有人可以帮忙吗?

提前致谢!



1> Ramon Smits..:

高音量

我不确定你的用例是什么.如果这是一致的消息流,则600 msg/s转换为单个端点每天近5200万条消息.

用例

我们会对您的用例感兴趣,我们可以在Google群组中公开讨论此问题

https://groups.google.com/forum/#!forum/particularsoftware

我们也可以通过support@particular.net联系我们私下这样做

作为单个或单个消息接收

如果您发送这600条消息,是否要在接收端将它们视为单个消息?我问的原因是问题中的API是什么.它创建一个包含所有这些消息的信封.在传输上,您将看到一条物理消息.在接收端,所有消息都将作为单个接收操作进行处理.

如果这是您想要的行为,则必须创建一个包含集合(数组/列表)的消息,并将所有这些消息片段放入其中.

这个策略的好处是你在合同中使行为更加明确.

var message = new ParentMessage();
for(int i=0;i<600;i++) message.Children.Add(new ChildFragment());
Bus.Publish(message);

传输邮件大小限制

Azure Service Bus消息在标准层上最多为256KB,在高级层上最多为1MB.如果片段包含大量数据,以前的解决方案可能无法使用单个大型消息.

接收上下文

在您的问题中,不清楚您是在接收消息的上下文中还是在接收上下文之外发送这些消息.每种行为都不同.

在传入的消息上下文中,发送被缓冲.在传入消息上下文之外,消息被直接推送到传输.

批量派遣

您在NServiceBus V5中使用Azure Service Bus,或者默认情况下V6发送缓冲.如果您在处理程序/传奇中执行发布/发送,则消息不会立即推送到传输.

这种行为的原因是为了防止'ghost'消息.假设您发送了一条消息,之后您创建了第二条消息,并且在映射期间,会发生空引用异常.您是否希望第一条消息已被推送到传输中?可能不是,这是默认行为.

https://docs.particular.net/nservicebus/messaging/batched-dispatch

对于Azure Service Bus,通过执行事务范围登记,此行为也存在于V5中.如果您不希望在V5中出现此行为,请通过禁用分布式事务来禁用事务范围的使用.

异步

在V6中,API是异步的,这意味着您可以执行以下操作:

var tasks = new List();
for(int i=0;i<600;i++) tasks.Add(context.Publish(new MyEvent()));
await Task.WhenAll(tasks).ConfigureAwait(false);;

由于缓冲发送,除非创建消息执行IO,否则这并没有真正产生巨大差异.

如果您在接收消息上下文之外执行此操作,那么它可以提高性能.

var tasks = new List();
for(int i=0;i<600;i++) tasks.Add(messageSession.Publish(new MyEvent()));
await Task.WhenAll(tasks).ConfigureAwait(false);;

这是因为消息将立即并同时推送到传输.

立即发货

如果您明确不希望缓冲消息,那么您可以使用立即分派.以下是V6样本.

var options = new SendOptions();
options.RequireImmediateDispatch();
var message = new MyMessage();
await context.Send(message, options).ConfigureAwait(false);

https://docs.particular.net/nservicebus/messaging/send-a-message#dispatching-a-message-immediately

性能

您在说明中使用的API是NServiceBus V5或更早版本.在V6中,Azure Service Bus的性能得到了显着提升.

有很多变量可以调整以提高性能.

https://docs.particular.net/nservicebus/azure-service-bus/performance-tuning

对于V6中的单个端点实例,每秒发送/接收数千条消息应该不是问题.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有