【发布时间】:2019-08-02 10:09:30
【问题描述】:
在一个微服务架构中,我们通常有两种方式让 2 个微服务进行通信。假设服务 A 需要从服务 B 获取信息。第一个选项是远程调用,通常通过 HTTPS 同步,因此服务 A 查询服务 B 托管的 API。
第二种选择是采用事件驱动的架构,服务B的状态可以被服务A以异步的方式发布和消费。使用此模型,服务 A 可以使用来自服务 B 事件的信息更新其自己的数据库,并且所有查询都在此数据库中本地进行。这种方法的优点是可以更好地解耦微服务,从开发到运营。但它有一些与数据复制相关的缺点。
第一个是磁盘空间的高消耗,因为相同的数据可以驻留在需要它的微服务的数据库中。但在我看来,第二个是最糟糕的:如果服务 B 无法按需要尽快处理其订阅,或者在服务 B 创建它的同时它不能用于服务 A,则数据可能会变得陈旧,鉴于模型的最终一致性。
假设我们使用 Kafka 作为事件中心,其主题配置为使用 7 天的数据保留期。服务 A 在服务 B 发布其状态时保持同步。两周后,部署了一个新的服务 C,并且需要使用服务 B 所拥有的所有信息来丰富它的数据库。由于最旧的事件已经消失,我们只能从 Kafka 主题中获取部分信息。我的问题是我们可以使用哪些模式来丰富这个微服务的数据库(除了要求服务 B 将其所有当前状态重新发布到事件中心)。
【问题讨论】:
标签: apache-kafka microservices database-replication event-driven eventual-consistency