如何实现消息队列解决方案

时间:2011-10-30 18:47:14

标签: c# wcf queue ibm-mq msmq-wcf

我有一个场景,大约需要将10条不同的消息排队,然后才能出列/处理。一个用户需要所有10个消息,而另一个用户只需要10个消息中的8个。我试图了解设置此类架构的最佳方法是什么。您是否为每种消息类型创建一个队列,以便订阅者可以只订阅相关队列,还是将它们全部转储到同一队列并忽略与该订阅者无关的消息?我想确保解决方案具有灵活性/可扩展性等。

过程:

  1. 10个不同的xml消息将被排入IBM WebSphere MQ服务器。
  2. 我们将使用.Net(很可能是WCF,因为WebSphere MQ 7.1已添加到WCF支持中)
  3. 我们将消息出列并将它们加载到另一个后端数据库(很可能是SQL Server)。
  4. 解决方案需要很好地扩展,因为我们将处理大量的消息,这可能会增长(可能是40-50,000 /小时)。至少对我们来说很大。
  5. 总是非常欣赏这些信息。

    - S

2 个答案:

答案 0 :(得分:2)

从资源角度来看,创建队列相对“便宜”,加上是,最好为每个特定目的使用队列,因此在这种情况下,如果可能的话,最好将它们与目标客户端分开。使用队列根据某些标准(相关ID或其他东西)选择性地提取消息通常是个坏主意。消息传递中表现最佳的场景是最简单的场景:只需在队列到达时从队列中提取消息,而不是有选择地偷看和接收消息。

至于扩展,我不能代表Websphere MQ或其他IBM产品,但是每小时40-50K消息对于Windows Server上的MSMQ来说并不是特别难以处理,所以我认为IBM可以这样做好。通常,瓶颈不是排队平台本身,而是排队和处理单个消息的过程。

答案 1 :(得分:1)

好的,根据评论,这里有一个建议,可以扩展,并且不需要对应用程序进行太多更改。

在生产者方面,我将消息选择标准复制到消息属性,然后将消息发布到主题。此处对应用程序所需的唯一更改是message属性。如果由于某种原因您不希望使用本机功能进行发布,则可以在主题上定义别名。该应用程序认为它正在发送消息,但它们确实是出版物。

在消费者方面,您有几个选择。一种是为每个应用程序创建管理订阅,并在订阅中使用选择器。然后根据选择标准将消息汇集到每个消费者的专用队列。应用程序认为他们只是在消费消息。

或者,应用程序可以简单地订阅该主题。这使您可以选择动态订阅,当应用程序断开连接时(如果实际上您想要它)或者在功能上等同于管理订阅的持久订阅时,它不会接收消息。

此解决方案可轻松扩展到您引用的卷。另一个选择是生产者不使用属性。这里,消费者应用程序消耗所有消息,打破每个消息上的消息有效负载并决定是处理还是忽略该消息。在此解决方案中,制作人仍在发布主题。任何涉及直接排队的解决方案都会迫使生产者知道所有目的地。添加另一个消费者,更改生产者。此外,每个目的地都有一个PUT。

最糟糕的情况是生产者发出多条消息,而消费者必须阅读每一条消息以决定是否会被忽略。该选项可能会出现缩放问题,具体取决于选择标准字段所处的有效负载的深度。真的很长的XPath表达式=性能不佳,无法调整WMQ来弥补它,因为延迟在应用程序中都是在那时。

最好的情况是,生产者设置一个消息属性并发布。消费者在他们的订阅中选择财产,或者管理订阅为他们做这件事。就可扩展性而言,此解决方案是使用应用程序订阅还是管理订阅没有任何区别。