如何实施EMS竞争消费者和分销商

时间:2016-06-23 11:14:59

标签: c# ems

我有一个制作人,它会在队列中发送与购买/取消产品相关的消息,并根据该消息计算产品的可用性。

如果以错误的顺序在多个消费者上处理它,我的可用性计算将是错误的。

现在的问题是,我希望获得与正在处理的一个产品相关的所有消息,以及正在处理哪个消费者的争议。

有人可以建议我怎么做。

目前我使用的工具是TIBCO EMS,C#windows服务。

2 个答案:

答案 0 :(得分:1)

我不确定将竞争消费者和序列混合在一起是否可行......但这里有两个选项可能会激发你的灵感:

选项A

好的......我在这里猜很多东西。

假设:

  • 您需要竞争消费者的安全(例如:第一个失败),而不是负载分享。
  • 您需要按顺序处理所有消息

我必须做出这些假设,因为进程和竞争负载共享的顺序通常不兼容,除非你引入另一种机制(例如:消息选择器,主题等)

所有这一切,然后您将队列设置为" exclusive"。并且有多个客户端连接...只有一个会真正收到消息...因此处理顺序永远不会出错。 "竞争" (等待)客户端仅在第一个客户端失败时使用。

选项B

好的......如果我上面错了,你真的需要多个客户同时处理,并且仍然坚持订购与特定产品相关的消息......试试这个:

让发送应用程序在每条消息中设置带有产品编号的JMS标头。然后,您可以在非独占队列(默认)上设置多个客户端,其中消息选择器绑定到新标头(例如:productID = 1234)。在这种情况下,客户端并不是真正的竞争对手,但它们至少分担负载,并按顺序处理有关产品ID的所有消息。缺点?您的消息选择器必须涵盖所有产品ID ...如果您有数千个,则不可行。

选项C

与选项C类似,您可以将产品分成多个队列(例如:产品类别),并为每个按顺序处理所有消息的类别设置一个客户端。在这种情况下,客户端上不需要消息选择器。但是,您需要引入一种排序机制(主题+消息选择器,ESB或发件人自己排序)

答案 1 :(得分:0)

您的问题的另一个解决方案可能是使用Sequencing Keys。您可以通过在 JMS队列接收器的misc选项卡中指定键值来使用序列

Sequencing Key