事件溯源和微服务、消息系统
Event sourcing and microservices, messaging system
我们正在设计我们的新系统,很可能会从头开始编写,因为旧系统真的很旧。对于我们的系统来说,保留系统中发生的一切的审计跟踪日志非常重要。
由于审计跟踪的重要性,我们决定遵循事件溯源架构以获得其所有优势。另一个关键因素是我们有多个团队在不同的“领域”工作。也就是说,我们希望将每个领域拆分成它自己的服务(微服务架构),这样每个团队都可以独立工作。
我们面临的最大问题是谁将负责微服务之间的事件共享。例如,在其中一个服务中发生的事件也应该在另外两个服务中触发另一个事件。我们可以看到 2 个选项:
- 中央流媒体服务(最有可能是 AWS Kinesis),所有服务都注册了发布者和订阅者。每个服务都会在那里发布它的所有事件,消费者将决定他们是否“关心”特定事件然后做或不做。
- 具有特定服务发布者和订阅者的多个分类流(最有可能是 AWS Kinesis),它们确实需要对发布的事件执行某些操作。
我们已经花了很多时间试图找出对我们来说最好的选择是什么,或者我们应该问自己什么问题才能做出正确的决定。
我更倾向于第一个选项,尽管我确实对消费者的性能和瓶颈有一些担忧,因为每个服务都会监听所有事件,然后他们将决定是否必须对其采取行动。
您是否看到第一个选项或第二个选项中有任何不可行的地方?我们是在寻找正确的方向还是应该后退一步?
这张图片描述了我们需要在短期内实现的目标(CQRS 除外) which is taken from here
我倾向于为每个发布服务提供一系列事件。然后你有一定程度的分类,当你想按发射顺序处理事件时,不必处理(或至少不处理)同步多个流的消耗。
事件通常有一个自然键,而且您通常也只需要在按该键分组后严格排序;因此,您可以 partition/shard 事件。
没有什么本质上可以阻止您同时拥有发布服务发出的所有事件的流水线和分类的事件流,因此消费者可以决定不订阅他们不感兴趣的流。
您是否做过简单的优缺点 table 并将它们并排比较?如果您清楚地知道解决方案的优先级是什么,那么在该过程结束时答案应该非常明显。如果不清楚,那么您可能仍在尝试了解您的解决方案优先级以及哪些是最重要的。
请注意,'solution priorities' 我指的是系统质量属性,如性能、可维护性、可测试性等 - 但也要考虑您可能拥有的架构原则、产品所有者的功能优先级、商业驱动程序,等等
为了更直接地回答 OP,我将从单个事件流开始:您将所有内容放在一个地方,这样更简单:更易于设置和管理、调试、监控等。拆分只会增加复杂性。当然,您可以随意拆分它 - 但前提是有明确的理由。
我们正在设计我们的新系统,很可能会从头开始编写,因为旧系统真的很旧。对于我们的系统来说,保留系统中发生的一切的审计跟踪日志非常重要。
由于审计跟踪的重要性,我们决定遵循事件溯源架构以获得其所有优势。另一个关键因素是我们有多个团队在不同的“领域”工作。也就是说,我们希望将每个领域拆分成它自己的服务(微服务架构),这样每个团队都可以独立工作。
我们面临的最大问题是谁将负责微服务之间的事件共享。例如,在其中一个服务中发生的事件也应该在另外两个服务中触发另一个事件。我们可以看到 2 个选项:
- 中央流媒体服务(最有可能是 AWS Kinesis),所有服务都注册了发布者和订阅者。每个服务都会在那里发布它的所有事件,消费者将决定他们是否“关心”特定事件然后做或不做。
- 具有特定服务发布者和订阅者的多个分类流(最有可能是 AWS Kinesis),它们确实需要对发布的事件执行某些操作。
我们已经花了很多时间试图找出对我们来说最好的选择是什么,或者我们应该问自己什么问题才能做出正确的决定。 我更倾向于第一个选项,尽管我确实对消费者的性能和瓶颈有一些担忧,因为每个服务都会监听所有事件,然后他们将决定是否必须对其采取行动。
您是否看到第一个选项或第二个选项中有任何不可行的地方?我们是在寻找正确的方向还是应该后退一步?
这张图片描述了我们需要在短期内实现的目标(CQRS 除外)
我倾向于为每个发布服务提供一系列事件。然后你有一定程度的分类,当你想按发射顺序处理事件时,不必处理(或至少不处理)同步多个流的消耗。
事件通常有一个自然键,而且您通常也只需要在按该键分组后严格排序;因此,您可以 partition/shard 事件。
没有什么本质上可以阻止您同时拥有发布服务发出的所有事件的流水线和分类的事件流,因此消费者可以决定不订阅他们不感兴趣的流。
您是否做过简单的优缺点 table 并将它们并排比较?如果您清楚地知道解决方案的优先级是什么,那么在该过程结束时答案应该非常明显。如果不清楚,那么您可能仍在尝试了解您的解决方案优先级以及哪些是最重要的。
请注意,'solution priorities' 我指的是系统质量属性,如性能、可维护性、可测试性等 - 但也要考虑您可能拥有的架构原则、产品所有者的功能优先级、商业驱动程序,等等
为了更直接地回答 OP,我将从单个事件流开始:您将所有内容放在一个地方,这样更简单:更易于设置和管理、调试、监控等。拆分只会增加复杂性。当然,您可以随意拆分它 - 但前提是有明确的理由。