仅当发送了其他消息时才触发“消息事件”

时间:2019-11-08 16:19:31

标签: microservices message-queue serverless-architecture

我正在设计一种微服务解决方案,其中大多数代码将是C#,并且很可能是任何前端的Angular。我的问题是关于消息链。我仍在寻找要使用的消息代理。 Azure服务总线,RabbitMQ等。有一个我不太了解的概念。

当一组特定的消息已触发时,我要如何处理要触发消息的情况。一个示例,但不是我实际解决方案的一部分:我想说在付款时通知某人。我们发送一条消息Error Message:com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: (String)"[{"accountId":"1005003805","status":"1000","internalStatus":"ACTIVE","associations":[{"id":"1000004114","type":"reseller"}],"preferredLanguage":"it-IT","address":{"country":"IT","phoneNumber":"408-536-3538","city":"SESTO FIORENTINO","postalCode":"50019","addressLine1":"345 Park Ave","addressLine2":"VIA DONINZETTI 17","region":"32"},"name":"UPLOAD DI RICCI LUCA E PROCELLI SNC anil","type":"customer","externalReferenceId":"Su66353456234","contacts":[{"firstName":"surendra1","lastName":"kumar","pho"[truncated 1565 chars]; line: 1, column: 2] (through reference chain: adobe_Partner_Api_ECCS_PojoClasses.ECCSGetExtraCustomer["accountId"])   将触发将独立处理的微服务:

  1. FinanceService借记帐并解雇"PAIDBILL"

  2. EmailService:向客户发送电子邮件说感谢您支付账单 "PaymentPosted"

  3. DiscountService:检查他们是否可以按时付款获得折扣,然后发送 "CustomerPaymentEmailSent"

如果所有三个消息都针对同一"CustomerCanGetPaymentDiscount"触发:消息PAIDBILL"PaymentPosted""CustomerPaymentEmailSent" 然后我想向客户发送电子邮件,说他们将在下一张账单上获得折扣。这三个步骤都必须完成之后,才可以完成,顺序无关紧要。如何安排要发送的新消息"CustomerCanGetPaymentDiscount",而不必轮询每分钟,每小时,每天触发了什么消息?

我所能想到的就是拥有一个SQL表,该表标记每个表都已完成(通过锁定表),并且当最后一个表被填充时,然后发送该消息。这将是一个好的解决方案吗?我发现它是微服务和消息队列设计的反模式。

1 个答案:

答案 0 :(得分:1)

如果您正在使用消息(例如Service Bus / RabbitMQ),那么我认为您所描述的解决方案是最好的解决方案。这种类型的设计(服务在其中具有有关系统中其他域的知识)通常称为编排。

您需要选择一个负责此业务逻辑的服务。该服务将需要接收所有先前的消息类型,以便可以确定何时满足(如果)全部满足,它可能希望通过记录数据库中已经通过了哪些门来做到这一点。

您可以考虑的一种替代方法是链接业务流程,而不是并行进行。所以...

  1. PAYBILL使FinanceService借记分类帐并解雇“ PaymentPosted”
  2. “ PayentPosted”使EmailService向客户发送电子邮件,说谢谢您支付账单并广播“ CustomerPaymentEmailSent”
  3. “ CustomerPaymentEmailSent”使DicsountService检查是否在按时付款时获得折扣,然后发送“ CustomerCanGetPaymentDiscount”
  4. 您要发送的电子邮件只是由“ CustomerCanGetPaymentDiscount”触发的。

老实说,我会在最后阶段切换您正在使用的依赖模型。因此,我认为不是让某些组件从DiscountService监听“ CustomerCanGetPaymentDiscount”事件并发送电子邮件,而是让DiscountService告诉其他组件发送电子邮件。对于某些计算折扣以知道应该发送电子邮件的东西,在我看来很自然。发送电子邮件以了解折扣(以及需要发送电子邮件的其他所有信息)的事情似乎不太自然。这就是为什么我不喜欢这样的架构,即假设每个消息都应该是一个事件,并且每个动作都应该由一个事件触发:它消除了很多关于域逻辑可以驻留在何处的决定,因为消息接收者总是必须知道消息发件人的域,反之亦然。

相关问题