发布和订阅消息系统 "Shared Subscription" 说明 (TIBCO EMS)

Publish & Subscribe Messaging System "Shared Subscription" Explanation (TIBCO EMS)

我正在阅读 pdf tib_ems_user_guide.pdf 为即将到来的项目(TIBCO ESB 上的一个项目)做准备。当我 运行 进入我认为自相矛盾的地方时,我只做了介绍。我意识到我没有掌握这个概念。 (我进一步阅读了它,但找不到答案)

从 Ch1 (pg4) 的 发布和订阅 部分开始,我谈到 "Shared Subscriptions":

Shared subscriptions are created with a specific name, and optionally a client ID. Consumers sharing the subscription specify this name when subscribing to the topic.

For example, the topic foo might have the following subscriptions:

• not shared, non-durable subscription.

• not shared, durable subscription

• shared, non-durable subscription called mySharedSub with three shared consumers

• shared, durable subscription called myDurableSharedSub with two shared consumers

If a message is received on foo, each of the above four subscriptions receive that same message. For the shared subscriptions mySharedSub and myDurableSharedSub, the message is delivered to only one if its respective shared consumers.

If the shared consumers of the shared durable subscription myDurableSharedSub are closed, then the shared durable subscription continues to exist and accumulate messages until it is deleted, or until the application creates a new durable shared consumer named myDurableSharedSub to resume this subscription. If the shared consumers of mySharedSub are all closed, the subscription is removed from topic foo.

我的问题是...

  1. 订阅的 "speceific name" 有什么意义。您不需要主题中的每个订阅都具有某种特定名称,以便在订阅时可以引用它吗?或者是你订阅了一个主题,它会系统地找出你订阅哪个订阅,除非你指定。
  2. 客户端 ID 有什么作用?
  3. 为什么名为 "shared" 的订阅只将其消息传递给其中一位消费者?这对我来说似乎倒退了。

感谢您的帮助,

明曼

请注意,这些概念通常适用于 JMS,而不仅仅是 TIBCO EMS。让我从最后一个问题开始。

假设您有一个系统广播有关某个主题的新订单的消息。然后你说另外两个系统,每个 运行 在一台机器上作为一个进程,需要接收这条消息:Billing and Fulfilment。每个系统都将订阅非共享订阅(耐用,因为您不想松散订单)。

现在考虑当您必须水平扩展比方说计费系统时会发生什么。现在 运行 在两台服务器上,每台服务器上有一个进程,我们称之为 Billing1 和 Billing2。如果 Fulfilment、Billing1 和 Billing2 将分别订阅非共享订阅,则 Billing1 和 Billing2 都会收到每个订单。然而,这不是您想要的,因为现在每个订单基本上只需要支付两次费用。相反,您希望订单以交替(或负载平衡)的方式发送到 Billing1 和 Billing2。这就是您可以使用共享订阅的目的。现在,您将对 Fulfillment 进行非共享订阅,对 Billing1 和 Billing2 进行共享订阅(我们称之为 "BillingSubscription")。第一条订单消息现在将转到 Fulfillment 和 Billing1,第二条订单消息将转到 Fulfillment 和 Billing2,依此类推。

附带说明一下,在共享订阅之前,您可以通过将主题与队列绑定并让计费系统订阅此桥接队列来实现类似的效果。

对于第一点,您需要订阅的具体名称才能知道哪些系统属于共享订阅。 Billing1 和 Billing2 在创建主题订阅时使用相同的订阅名称共享订阅。假设您现在将库存系统 运行 作为三个进程 Inv1、Inv2、Inv3 连接到您的主题。您将为这些使用不同的订阅名称(例如,"InventorySubscription")。

clientID用于查看客户端是否已经收到消息(对于发送消息时客户端离线,但其他客户端可能在线的情况)。请注意,clientID 是在连接上设置的(一个连接可以管理许多对主题和队列的订阅)。如果你只使用共享订阅,据我所知,它没有那么有用。但是假设你有一个连接,其中包含对 Topic1 的持久共享订阅和对 Topic2 的持久非共享订阅,那么 clientID 将用于确保即使你离线一段时间也能收到 Topic2 上的消息。