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

Node2是我们将要部署的服务器。业务要求是,在接受付款时,应向用户发送电子邮件,并在系统中生成发票。但是,部署了另一个节点,事件将由所有四个订阅者接收,这意味着用户将收到两封电子邮件,并生成两张发票。
一种解决方案是,在订阅者中,我们实现了一种idempontent算法,以防止发出第二封电子邮件/发票。有表现的惩罚。当每个正常情况下,一个事件将被两个电子邮件通知订阅者接收时,我觉得这是不太正确的。理想的情况是,该事件将只收到两个电子邮件通知订阅者中的一个和两个发票生成订阅者中的一个。
我知道,无论如何,我们都需要懒惰的行为,即使我们没有复制的服务器。但是,这将只用于少数情况下,一个事件是收到不止一次。
顺便说一下,我们使用的是ActiveMQ。
发布于 2014-08-21 05:34:00
您只需使用队列将事件发布到。只有一个节点能够抓取单个事件并处理电子邮件。我怀疑你今天发布到一个主题,因为你得到了每个订阅者一份。
这假设您在其他地方每次付款只生成一个事件。
读这个http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html
要将一条消息分成两部分,有很多种方法。一个快速的解决方案是在虚拟目的地中配置ActiveMQ。
1
复合队列将将消息复制到多个位置:
<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读取发票使用者。
如文档中所示,可以重新配置虚拟主题的默认命名约定。
https://stackoverflow.com/questions/25416987
复制相似问题