【问题标题】:Fire Message Event Only when These other Messages have been sent仅在发送这些其他消息时触发消息事件
【发布时间】:2019-11-08 16:19:31
【问题描述】:

我正在构建一个微服务解决方案,其中大多数代码将是 C#,并且很可能是任何前端的 Angular。我的问题是关于消息链。我仍在弄清楚要使用什么消息代理; Azure Service Bus , RabbitMQ 等。有一个我没有找到太多的概念。

当我想在一组特定的消息被触发时触发消息时,如何处理这种情况。一个例子,但不是我实际解决方案的一部分:我想说在支付账单时通知某人。我们发消息"PAIDBILL" 这将触发将独立处理的微服务:

  1. FinanceService 借记账本并解雇 "PaymentPosted"

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

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

如果所有三个消息都针对同一PAIDBILL 触发:消息"PaymentPosted""CustomerPaymentEmailSent""CustomerCanGetPaymentDiscount" 然后我想给客户发邮件说他们下一张账单会打折。必须在所有三个都触发并且顺序无关紧要之后完成。如何安排发送新消息 "EmailNextTimeDiscount" 消息,而不必每分钟、每小时、每天轮询触发了哪些消息?

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

【问题讨论】:

    标签: microservices message-queue serverless-architecture


    【解决方案1】:

    如果您使用消息(例如服务总线/RabbitMQ),那么我认为您描述的解决方案是最好的解决方案。这种类型的设计——服务了解系统中的其他领域——通常被称为编排。

    您需要选择一个负责此业务逻辑的服务。该服务将需要接收所有上述类型的消息,以便它可以确定何时(是否)满足所有要求,它可能希望通过在数据库中记录哪些门已经通过。

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

    1. PAYBILL 导致 FinanceService 借记分类帐并触发“PaymentPosted”
    2. “PayentPosted”导致 EmailService 向客户发送电子邮件,表示感谢您支付账单并广播“CustomerPaymentEmailSent”
    3. “CustomerPaymentEmailSent”会导致 DicsountService 检查他们是否因按时付款而获得折扣,然后发送“CustomerCanGetPaymentDiscount”
    4. 您要发送的电子邮件刚刚由“CustomerCanGetPaymentDiscount”触发。

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

    【讨论】:

    • 这个例子不是我专门处理的,这是理论上的,作为我设计的一部分,我需要为任何可能基于这样的情况提供解决方案。谢谢你的定义,我不知道它被称为编舞,这确实有意义。是否有与消息不同的架构可以处理编排?
    • 理论上,您可以使用同步消息进行编排,但这将是非典型的,尤其是 bc 同步通信更常用于命令,其中 A 告诉 B 做某事,而不是事件,其中B 正在听 A 建议完成某事。 (Webhook 是一个明显的例外,因为它们控制反转。)而且,一般来说,一旦架构开始变得相对较大,我建议尽可能选择异步通信,以限制时间耦合。
    • 如果您希望避免消息传递而使用同步通信,您可能需要研究编排的替代方案,即编排。将编排视为一组半松散耦合的服务,它们相互交互以实现比任何人都意识到的更大的目标。相反,编排是各个服务之间更松散耦合的地方,但有一个集中式服务正在推动工作流程的步骤。该服务了解并努力实现整个更大的目标。
    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2014-01-30
    相关资源
    最近更新 更多