Microservices 如何解决事件存储层和持久层之间的两个一般性问题?

Microservices 如何解决事件存储层和持久层之间的两个一般性问题?,microservices,event-sourcing,distributed-system,Microservices,Event Sourcing,Distributed System,两个常见问题-事件存储和持久层? 我想了解工业界是如何处理这些问题的 如果微服务1将对象X持久化到数据库a中。同时,为了使微服务2从微服务1获取数据,微服务1将相同的对象X写入事件存储B 现在,我的问题是,我首先在哪里写对象X 首先是数据库A,然后是事件存储B,如果数据库A关闭,在应用程序级别回滚线程是否公平?另外,如果数据库A联机并且持久化对象X,但事件存储B关闭,理想的错误句柄应该是什么 如果我们将第1点反过来,错误句柄应该是什么样的 我明白,在当今分布式高可用系统的世界中,系统崩溃是一件值

两个常见问题-事件存储和持久层?

我想了解工业界是如何处理这些问题的

如果微服务1将对象X持久化到数据库a中。同时,为了使微服务2从微服务1获取数据,微服务1将相同的对象X写入事件存储B

现在,我的问题是,我首先在哪里写对象X

  • 首先是数据库A,然后是事件存储B,如果数据库A关闭,在应用程序级别回滚线程是否公平?另外,如果数据库A联机并且持久化对象X,但事件存储B关闭,理想的错误句柄应该是什么

  • 如果我们将第1点反过来,错误句柄应该是什么样的


  • 我明白,在当今分布式高可用系统的世界中,系统崩溃是一件值得怀疑的事情。但是,这是可能发生的。我想了解当数据库或事件存储系统/集群关闭时需要做什么?

    通常,您希望避免依赖您描述的那种两阶段提交


    一般来说,(假设是一个事件源系统;不确定这是否隐含在您的问题/选项中-可能与您的上下文相关?),这通常是通过在拉式基础上从单个权威事件集中获取某个
    project
    来管理的-每个需要对某些下游执行关联操作的正在编写的事件都会维护一个指针,指向它从基流获得投射事件的距离,首先,事件存储是一种持久性,它将应用程序状态存储为一系列事件,而不是存储最后投影状态的平面持久性

    如果微服务1将对象X持久化到数据库a中。同时,为了使微服务2从微服务1获取数据,微服务1将相同的对象X写入事件存储B

    您正试图获得两个真相来源,它们必须通过某种不可扩展的分布式事务保持同步

    这是使用事件存储的一种不同寻常的模式。一般来说,事件存储是标准的信息源,是唯一的真理源。您正试图将其用作通信渠道。事件存储是事件源聚合的持久性(请参见域驱动设计)

    我希望有以下选择:

  • 您可以重构您的体系结构,使
    对象X
    和事件源实体具有持久性作为事件存储。然后让一个读取模型订阅事件存储,并构建持久化在数据库a中的
    对象X
    的平面表示。换句话说,首先写入事件存储,然后写入数据库a(但最终以一致的方式!)。这是一个很大的飞跃,如果你想去,你应该好好想想

  • 您可以使用CQR而无需事件源。这意味着每次修改后,
    对象X
    都会发出一个或多个域事件,这些域事件会以与
    对象X
    本身相同的本地事务保存在数据库A中。microservice 2可以订阅数据库A以获取发出的事件。实际订阅取决于数据库的类型


  • 我感觉您正在使用事件存储作为通信渠道,而不是将其用作数据库。如果希望micro service 2从micro service 1获取数据,则应与REST services通信

    当然,依赖REST服务可能会降低您对停机的适应能力。在这种情况下,使用一种专门用于通信的技术将是正确的选择。(我在思考MQ/主题,如RabbitMQ、卡夫卡等)

    然后,一旦您的服务相互通信,您仍然需要持久化您的数据。。。但仅在一个位置。 因此,您需要定义数据存储的位置

    问问自己:

    谁将拥有数据持久性的治理权

    • 是微服务吗?如果是这样,那么每次Microservice2需要读取数据时,它都会对Microservice1进行REST调用
    • 是另一条路吗?Microservice2管理数据,而Microservice1使用数据

    • 这可能是你还没有创建的第三个微服务。这取决于您如何应用关注点分离

    让我们举一个例子:

    • Microservice1的职责是处理我们的数据,以PDF和其他格式导出数据
    • Microservice2的职责是为遗留合作伙伴公开一项服务,这要求以非常专有的表示形式返回我们的数据
    谁将在这里存储数据

    • Microservice1不应该是持久化数据的工具:它的工作只是将数据转换为其他格式。如果它需要一些数据,它将从拥有数据治理的数据库中获取这些数据
    • Microservice2不应该是持久化数据的服务。毕竟,也许我们还有许多其他类似的微服务,但对于其他合作伙伴,它们的专有格式不同
    • 如果有一个服务,你可以做积垢操作,这是你的人。如果你没有这样的服务,也许你可以找到一个现有的微服务谁不会有冲突的责任
    例如:如果我有一个Microservice3,它可以确保每次my
    ObjectX
    被更改时,它都会将它的PDF表示发送到某个地址,并通知我的所有合作伙伴数据已过期。在这种情况下,这个微服务看起来很有可能成为这部分数据的“数据管理者”