适用于Windows服务器的Service Bus - 使用大量过滤器(100+)减慢订阅速度

时间:2016-03-22 11:59:56

标签: c# .net servicebus

我有一组要从服务总线主题订阅消息的类。所有这些类都希望只接收某些消息类型,例如:

public class MySubscriber : IBusSubscriber, IConsume<ItemCreated>, IConsume<ItemUpdated> {
  public void Consume(ItemCreated message) { /* processing */ }
  public void Consume(ItemUpdated message) { /* processing */ }
}

对于每个订阅者类,我使用一组规则创建订阅以过滤消息。对于MySubscriber,它将是名为MySubscriber的订阅和内部有SqlFilters的两个规则:

"MessageType = 'ItemCreated'"
"MessageType = 'ItemUpdated'"

我在发布时将MessageType作为消息属性填充,并且它正常工作。但是,如果此类规则的数量增长(例如报告订阅者中的一个需要大约130个规则),则变得非常缓慢。即使没有大量消息,也只有一个这样的报告订阅者每秒只收到大约1条消息。

可以加速吗?或者可能有另一种方法来实现它,避免创建这么多的过滤器?

1 个答案:

答案 0 :(得分:0)

Azure Service Bus将是一个更好的选择。 如果您使用的是 Standard 消息传递层,请考虑按照以下方法之一创建主题,以提高性能

1)快速主题,可实现高吞吐量和减少延迟的情况

TopicDescription td = new TopicDescription(TopicName);
td.EnableExpress = true;
namespaceManager.CreateTopic(td);   

2)分区主题比常规队列和主题具有更高的吞吐量,并且可用性更高

TopicDescription td = new TopicDescription(TopicName);
td.EnablePartitioning = true;
namespaceManager.CreateTopic(td);

但是,服务总线消息传递的 Premium 层可满足关键任务应用程序在规模,性能和可用性方面的常见客户需求。对于生产方案,建议使用“高级”层。