Nservicebus 第二个物理发布者如何获得新订户的通知?

Nservicebus 第二个物理发布者如何获得新订户的通知?,nservicebus,publish-subscribe,Nservicebus,Publish Subscribe,有关: 据我所知,两个物理发布服务器代表一个逻辑发布服务器,每个逻辑发布服务器必须有自己的订阅队列。使用DBSubscriptionStorage可以让他们拥有一个常见的订阅者列表,但是当一个新订阅者弹出并订阅时会发生什么呢?订阅消息将进入其中一个订阅队列,然后进入数据库。除了重新启动其他发布者,是否有其他方法可以让他们知道新的订户?您有两种选择。最简单的方法之一是让每个单独的物理发布服务器指向单个物理订户/订阅数据库 另一个很好的处理方法是数据库复制。复制的唯一问题是它本质上是“单向的”。尽管

有关:
据我所知,两个物理发布服务器代表一个逻辑发布服务器,每个逻辑发布服务器必须有自己的订阅队列。使用DBSubscriptionStorage可以让他们拥有一个常见的订阅者列表,但是当一个新订阅者弹出并订阅时会发生什么呢?订阅消息将进入其中一个订阅队列,然后进入数据库。除了重新启动其他发布者,是否有其他方法可以让他们知道新的订户?

您有两种选择。最简单的方法之一是让每个单独的物理发布服务器指向单个物理订户/订阅数据库

另一个很好的处理方法是数据库复制。复制的唯一问题是它本质上是“单向的”。尽管如此,MySQL还有一个非常有趣的项目,名为“”,它似乎非常适合这个场景

最后,您可以使用Membase这样的持久复制密钥/值存储来拥有自己的订阅存储


一句话:您可以拥有一个最简单的订阅数据库,但是您有一个失败点。或者,您可以使用复制订阅存储。复制存储将确保所有节点都有一个所有订阅服务器的列表。

2个具有多个订阅服务器的物理发布服务器

配置

  • 每个端点(发布服务器或订阅服务器)都有自己的输入队列
  • 每个发布服务器都将配置为指向同一共享订阅数据库
  • 每个订阅服务器将被配置为指向一个发布服务器输入队列(这是他们将丢弃订阅消息的地方)
加工

  • Subscriber1将订阅消息(M1)放入Publisher1的输入队列
  • Publisher1将该订阅保存到数据库中
  • Subscriber2将订阅消息(M2)放入Publisher2的输入队列
  • Publisher2将该订阅保存到数据库
  • Publisher1发布服务器M1,它被放入Subscriber1的输入队列中
  • 发布器2和M1也会发生同样的情况

  • 您必须决定是否所有订阅者都对相同的消息感兴趣。允许两个发布者发布相同的消息,因为每个订阅者只订阅一次(在P1或P2)。您完全可以控制如何“平衡”工作。如果您尚未查看,可以找到更多信息

    我正在使用共享数据库。那么,出版商是否会对数据库进行民意调查,以获得可能出现的任何新订户?如果他们在不同的机器上,他们就不能共享订阅队列,对吗?出版商会进行投票,就像订阅者在启动时总是订阅一样。@Adam Fyles也许我遗漏了什么。物理订阅者(在彼此不同的机器上)是否以某种方式共享订阅队列?我认为这是不可能的。或者,更准确地说,来自一些NSB配置文件的评论吓跑了我,使我不敢这样做:“2.输入队列必须与从中获取信息的进程在同一台机器上。”可能适用于订阅者输入队列,而不是发布者?可能我太密集了,但我想做的是,步骤5应该将消息多路传输到S1和S2(这是逻辑上和物理上不同的“服务”,它们处理彼此相同的事件类型,我不想尝试负载平衡。)在我看来,在P1从数据库刷新其订阅信息之前,S2无法接收来自P1的消息(我想这需要重新启动吗?),P1不需要重新启动,它将每次ping数据库以获取订阅者列表。只要S1和S2订阅了P1,它就会遍历列表并向每个订户发送消息。感谢您提供的信息,这是我问题的关键。当你说它“每次”都会ping数据库时,你的确切意思是什么?(每次发布消息时?出于性能原因,这似乎不太可能)订阅数据库模式是一个表,每个订阅/消息组合一行,因此非常轻量级。发布服务器无法缓存订阅,因为新的订阅服务器可以随时弹出。可能是因为我太密集了,但我不知道我是否清楚。您是说Publisher1发布消息M1、Subscriber1和Subscriber2都将收到消息b/c它们都在数据库订阅存储表中吗?或者P1发布将只向S1发送消息,因为S1只向P1发送订阅消息?