事件源微服务的设计指南

Design guides for Event Sourced microservices

我在想构建微服务的最佳方式是什么,过去与我合作的团队使用 Axon Framework 和 PostgreSQL,并且每个微服务在 PostgreSQL 数据库中都有自己的事件存储,然后我们构建了使用 REST 之间的通信。

我认为让所有微服务与同一个事件存储对话会更聪明,因为我们能够更快地共享事件,而不是使用 REST 重写通信线路。

根据背景故事提出的问题是:

拥有事件存储的最佳实践是什么 每个服务都有自己的吗?他们会共享同一个 eventstore 吗?

我在哪里可以找到信息来激发灵感并收集更多答案?在互联网上搜索最佳实践以及如何构建 Event Store 就像大海捞针一样。

请记住,提出的问题绝不是针对 Axon Framework,而是针对构建可扩展和良好代码的一般想法。因为应用程序将使用每个自己的事件存储来写入模型和读取模型。

感谢您的阅读,祝您一切顺利 -- 我

您希望每个服务有一个 EventStore,就像您希望为非 EventSourced 系统的每个服务有一个关系数据库一样。

在服务之间共享 database/eventstore 会产生耦合,我们今天都通过惨痛的方式了解到这是一种反模式。

如果你想使用事件日志来跨服务共享事件,那么 Kafka 是一个流行的选择。

重要的是要记住,您只能在服务限界上下文中进行事件溯源。

我想对 Tore 的回复添加一个稍微不同的概念,尽管主线与我在这里分享的内容相同。所以,我的目的不是推翻 Tore,只是希望提供更多见解。

如果(微)服务属于同一个限界上下文,那么它们就可以“了解彼此的语言”。 语言因此包括这些应用程序发布和存储的事件。

只要 不同的限界上下文之间需要通信,您就会将存储分开,因为一个上下文不应该被另一个上下文的细节所打扰。 因此,推断出哪些服务属于哪个限界上下文是有益的,因为这将决定所需的分离。

A​​xon 旨在通过允许 Axon 服务器的多个上下文来支持这一点,如您所见 here。 它只允许将应用程序注册到特定上下文,在该上下文中它将完全分离所有消息流(例如命令、事件和查询)和事件存储。

当然,您也可以自己从头开始设置。 Tore 推荐的 Kafka 广泛用于满足应用程序之间的事件流需求。老实说,任何广播类型的基础设施都适合事件分发,因为事件通常是这样传播的。