第二个物理发布者如何收到新订阅者的通知?
Posted
技术标签:
【中文标题】第二个物理发布者如何收到新订阅者的通知?【英文标题】:How does a second physical publisher get notified of new subscribers? 【发布时间】:2011-05-20 19:33:08 【问题描述】:与this question相关: 据我了解,两个物理发布者代表一个逻辑发布者,每个发布者都必须有自己的订阅队列。使用 DBSubscriptionStorage 可以让他们拥有一个共同的订阅者列表,但是当一个新的订阅者弹出并订阅时会发生什么?订阅消息将进入订阅队列之一,然后进入数据库。除了重新启动其他发布者之外,有什么方法可以让他们知道新的订阅者?
【问题讨论】:
【参考方案1】:2 家拥有众多订阅者的实体出版商
配置
每个端点(发布者或订阅者)都有自己的输入队列。 每个发布者都将被配置为指向同一个共享订阅数据库 每个订阅者将被配置为指向一个发布者输入队列(这是他们将丢弃订阅消息的地方)处理
-
订阅者 1 将订阅消息 (M1) 放入发布者 1 的输入队列中
Publisher1 将该订阅保存到数据库中
订阅者 2 将订阅消息 (M2) 放入发布者 2 的输入队列中
Publisher2 将该订阅保存到数据库中
Publisher1 发布者 M1 被放入 Subscriber1 的输入队列中
Publisher2 和 M1 也是如此
您必须决定是否所有订阅者都对相同的消息感兴趣。可以让两个发布者发布相同的消息,因为每个订阅者只会订阅一次(在 P1 或 P2 处)。您可以完全控制如何“负载平衡”工作。更多信息可以在here找到,如果你还没有看过的话
【讨论】:
也许我很密集,但我想要发生的是第 5 步应该将消息多路复用到 S1 和 S2(它们在逻辑和物理上是不同的“服务”,处理一些相同的事件类型是彼此的,我不想进行负载平衡。)在我看来,S2 无法接收源自 P1 的消息,直到 P1 从数据库刷新其订阅信息(我认为这需要重新启动?) P1不需要重启,每次都会ping数据库获取订阅者列表。只要 S1 和 S2 订阅了 P1,它就会遍历列表并向每个订阅者发送一条消息。 感谢您的信息,这是我问题的症结所在。当您说它“每次”都会 ping 数据库时,您到底是什么意思? (每次发布消息?这似乎不太可能,出于性能原因) 订阅数据库模式是一个表,每个订阅/消息组合一行一行,因此非常轻量级。发布者无法缓存订阅,因为新订阅者可以随时弹出。 也许我说的很密集,但我不知道我是否清楚。您是说 Publisher1 发布消息 M1,Subscriber1 和 Subscriber2 都会收到一条消息 b/c 他们都在数据库订阅存储表中?还是 P1 发布只会向 S1 发送消息,因为 S1 只会向 P1 发送订阅消息?【参考方案2】:您有几个选择。最简单的方法之一是让每个单独的物理发布者指向一个物理订阅者/订阅数据库。
另一个很好的处理方法是使用数据库复制。复制的唯一问题是它本质上是“一种方式”。尽管如此,有一个非常有趣的 mysql 项目,名为“MySQL MMM”,似乎非常适合这种情况。
最后,您可以使用 Membase 之类的东西拥有自己的订阅存储,它是一个持久的、复制的键/值存储。
底线:您可以拥有一个最简单的订阅数据库,但您有一个故障点。或者,您可以拥有一个复制的订阅存储。复制的存储将确保所有节点都有一个所有订阅者的列表。
【讨论】:
我正在使用共享数据库。那么发布者是否会轮询数据库以获取可能出现的任何新订阅者?如果他们在不同的机器上,他们就不能共享订阅队列,对吧? 发布者将像订阅者在启动时始终订阅一样进行轮询。 @Adam Fyles 也许我错过了一些东西。物理订阅者(在彼此不同的机器上)是否以某种方式共享订阅队列?我认为这是不可能的。 或者,更准确地说,一些 NSB 配置文件中的注释让我不敢这样做:“2. 输入队列必须与从它获取的进程位于同一台机器上。”也许适用于订阅者输入队列而不是发布者?以上是关于第二个物理发布者如何收到新订阅者的通知?的主要内容,如果未能解决你的问题,请参考以下文章
EWS 通过SubscribeToPullNotifications订阅Exchange新邮件提醒