首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用消息队列时应如何复制订阅者

使用消息队列时应如何复制订阅者
EN

Stack Overflow用户
提问于 2014-08-21 01:29:55
回答 1查看 76关注 0票数 0

在我们的环境中,为了确保容灾能力,我们将在另一个城市部署另一个服务器。如下图所示:

Node2是我们将要部署的服务器。业务要求是,在接受付款时,应向用户发送电子邮件,并在系统中生成发票。但是,部署了另一个节点,事件将由所有四个订阅者接收,这意味着用户将收到两封电子邮件,并生成两张发票。

一种解决方案是,在订阅者中,我们实现了一种idempontent算法,以防止发出第二封电子邮件/发票。有表现的惩罚。当每个正常情况下,一个事件将被两个电子邮件通知订阅者接收时,我觉得这是不太正确的。理想的情况是,该事件将只收到两个电子邮件通知订阅者中的一个和两个发票生成订阅者中的一个。

我知道,无论如何,我们都需要懒惰的行为,即使我们没有复制的服务器。但是,这将只用于少数情况下,一个事件是收到不止一次。

顺便说一下,我们使用的是ActiveMQ。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-21 05:34:00

您只需使用队列将事件发布到。只有一个节点能够抓取单个事件并处理电子邮件。我怀疑你今天发布到一个主题,因为你得到了每个订阅者一份。

这假设您在其他地方每次付款只生成一个事件。

读这个http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html

要将一条消息分成两部分,有很多种方法。一个快速的解决方案是在虚拟目的地中配置ActiveMQ。

1

复合队列将将消息复制到多个位置:

代码语言:javascript
复制
<compositeQueue name="EVENT.PAY">
   <forwardTo>
      <queue physicalName="SEND.EMAIL" />
      <queue physicalName="GENERATE.INVOICE" />
   </forwardTo>
</compositeQueue>

2

VirtualTopics还可以解决您的情况(与上面链接的文档相同)。您可以将事件发布到(虚拟)主题,比如VirtualTopic.Event.Pay

然后让您的电子邮件使用者从queue Consumer.Email.VirtualTopic.Event.Pay读取电子邮件,从queue Consumer.Invoice.VirtualTopic.Event.Pay读取发票使用者。

  • 不需要进一步的逻辑,因为AMQ通过命名约定来处理这个问题。

如文档中所示,可以重新配置虚拟主题的默认命名约定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25416987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档