Kafka和微服务-架构问题

时间:2019-09-19 05:45:50

标签: apache-kafka

在基于微服务的体系结构中,谁来写Kafka?服务本身还是微服务数据库?我一直在考虑这个问题,并且看到两种方法的利弊,但倾向于将数据库写入Kafka主题,因为

  1. 如果由于某种原因写入Kafka失败,Kafka主题中的数据库和数据不会不同步
  2. 应用团队不必再担心了
  3. 应用程序可以继续关注核心功能,而不必担心Kafka。

感谢您的投入

2 个答案:

答案 0 :(得分:0)

并非所有服务都需要数据库,它们只是发出数据(日志,指标,传感器等)

因此,答案将是。

另外,我不确定哪个数据库可以直接导出到Kafka,因此您将部署Debezium之类的其他服务,该服务将从数据库中轮询这些CDC记录

应用程序开发人员仍然必须“担心”如何反序列化其数据,该主题中有多少分区,以便他们可以扩展使用量,管理偏移量

答案 1 :(得分:0)

正如cricket_007所说,数据库通常无法自己向Apache Kafka写入数据。相反,您需要更改数据捕获服务(例如Debezium)才能将数据更改从数据库流式传输到Kafka(免责声明:我是Debezium的负责人)。

这种方法可以确保服务自己的数据库和发送给其他服务的Kafka消息之间的(最终)一致性。我建议在特定的CDC应用程序中使用outbox pattern。此处的想法是不捕获对服务的实际业务表的更改,而是使用单独的“发件箱表”,服务在其中写入要供其他服务使用的特定消息。然后将使用CDC将这些事件从该表发送到Kafka。

这种方法避免了将内部数据结构暴露给外部使用者,同时还避免了服务在直接写入其数据库 Kafka时会遭受的“双重写入”问题。在Debezium中,通过消息转换提供了对发件箱模式的内置支持,该功能有助于将事件从发件箱表路由到特定于事件类型的Kafka主题。