Architecture 基于请求的体系结构与基于事件的体系结构 Q1

Architecture 基于请求的体系结构与基于事件的体系结构 Q1,architecture,message-queue,messaging,event-driven-design,request-response,Architecture,Message Queue,Messaging,Event Driven Design,Request Response,我知道基于事件的体系结构与基于请求/驱动的体系结构之间的根本区别。问题是,基于请求的操作是否总是同步进行,而基于事件的操作是否总是异步进行 问题2 此外,在API world(请求-响应)中,如果请求消息无效,通常会返回400个http代码。幸运的是,在API世界中,我们可以执行契约测试,使集成更加健壮 除了将消息放入错误队列之外,在消息队列中处理类似问题的最佳方法是什么? 首先得到问题通知是公共服务部门还是消费者服务部门的责任?Q1 这是根本的区别。事件发布者不关心谁使用它。请求/响应中的服务

我知道基于事件的体系结构与基于请求/驱动的体系结构之间的根本区别。问题是,基于请求的操作是否总是同步进行,而基于事件的操作是否总是异步进行

问题2 此外,在API world(请求-响应)中,如果请求消息无效,通常会返回400个http代码。幸运的是,在API世界中,我们可以执行契约测试,使集成更加健壮

除了将消息放入错误队列之外,在消息队列中处理类似问题的最佳方法是什么? 首先得到问题通知是公共服务部门还是消费者服务部门的责任?

Q1

这是根本的区别。事件发布者不关心谁使用它。请求/响应中的服务被占用

Q2

在事件驱动系统中,发布者有责任包含其他服务可以使用的所有内容。如果事件没有包含它需要的所有内容,那么您首先不能发布事件,因此您需要确保情况属实。这是整个事件驱动点,因为消费者希望挑选包含其所需所有数据的消息

如果您仍然能够发布格式不好的事件,那么您将拒绝该事件并明确记录它。如果被拒绝的事件是事务的一部分并链接到另一个事件的发布,那么您将引发失败的处理事件(Saga模式)


最佳实践是使用所有必要的有效负载引发事件。如果事件的格式不好,那么这是一个糟糕的设计,最终将变得复杂,难以大规模处理

理论上说“糟糕的设计”很容易,但你们不能总是涵盖所有的场景。例如,ServiceA发布ServiceB使用的事务事件,该事务事件期望Amount属性大于0。但有一天,该活动包括“退款”类型的交易,其金额将为负值。在这种情况下,ServiceB将抛出异常并将其放入错误队列。除了“糟糕的团队沟通”,您会建议如何缓解/防止这种情况?微服务是一种不断发展的方法,我们可以在不断改进。您的退款示例另一项服务B无法更改合同,这完全违反了开放-关闭原则,最终必须予以修复。但事情可以而且确实会变得糟糕。由于被拒绝的邮件被推送到死信队列,因此您需要监视死信队列并调查原因。您可以根据拒绝的消息触发警报thresh hold。一般来说,监控是关键,尤其是在这种情况下。您的建议没有什么例外。当然,我已经实施了对死亡字母Q的警告,但是现在的辩论是谁将在半夜被唤醒?是编写ServiceA还是ServiceB的团队?“你的建议没有什么特别之处,当然我已经实施了”。我在你的问题中找不到实现部分?你的问题是一般性的,答案也是一般性的。如果你不喜欢,你可以恭敬地表示不同意见。