使用 Kafka 在两个微服务之间同步数据

Posted

技术标签:

【中文标题】使用 Kafka 在两个微服务之间同步数据【英文标题】:Using Kafka for syncing data between two microservices 【发布时间】:2020-02-14 04:43:18 【问题描述】:

我正在尝试使用 kakfa 为两个微服务 A 和 B 同步数据。

A 将公司中一组员工的一些数据存放在数据库表中。然后最终用户将从 UI 触发一个事件到 A 的后端服务,在该服务中它将 kakfa 消息发送到 B 订阅的主题。

B 然后从消息或暂存表中获取数据,对其进行验证并保存到自己的数据库表中。

我的问题是..

    每家公司的员工人数可以从 10 到 1000 人不等,并且可能有多家公司尝试在一年中的某个时间同步数据。所以性能是一个问题。什么是分配负载的好方法?意思是..我应该将信息设计为员工级别的吗?这意味着可能有数千条消息,尽管从设计上讲这将是最简单的。还是应该在公司层面?或公司内的一组员工?微服务没有做太多的处理和持久化到表中。它能够处理负载吗?限制因素是什么?

    我们正在处理的数据是存储在 DB 中的 JSON。有一个临时表并使用消息中的某种主键从 B 查找会更好吗?还是让消息中的所有数据都可以?每个员工的 JSON 数据并没有那么大,但如果汇总到一组员工,比如说 100 人,它可能是 10-100 千字节。我们是否通过从表格中查找数据来购买很多东西?

    我们需要能够跟踪状态/错误,以便最终用户了解任何问题并执行操作以更正数据和/或尝试重新同步。我想到的一些方法是创建一个表,将其称为 BATCH_JOBBATCH_TASK 表以跟踪工作级别的请求(如前所述,一组员工的 UI 事件触发重新同步过程)和任务(员工级别)。还是有更清洁的方法?

任何帮助/设计提示将不胜感激。

【问题讨论】:

为什么 A 不能同时写入一个主题,该主题会被下沉到数据库中? 【参考方案1】:

什么是分配负载的好方法?

简短的回答是使用具有大量分区的自定义分区方案。说 100。

或者您可以为每个公司创建一个主题,具体取决于您是否为每个主题使用不同的记录架构

我们是否通过从表格中查找数据来购买很多东西?

好吧,您不能像查询表格那样轻松地查询主题,所以这就是好处……您还可以使用 KTable 和交互式查询

我们正在处理的数据是存储在 DB 中的 JSON

我假设您不只是将一个 BLOB 列放入数据库(而且您也没有明确说明您使用的是什么数据库)。

就个人而言,我建议您使用 Avro 和 Kafka Connect 将主题放入数据库。这是 Kafka API 中此类任务的推荐解决方案,无需引入其他项目(如 Spark)或编写自己的数据库代码

我们需要能够跟踪状态/错误,以便最终用户了解任何问题并采取措施纠正数据

表可以工作,但是如果您可以将记录写入表,您还可以将事件写入另一个 Kafka 主题并从中获取“通知”

【讨论】:

以上是关于使用 Kafka 在两个微服务之间同步数据的主要内容,如果未能解决你的问题,请参考以下文章

Redis、Kafka或RabbitMQ:哪个作为微服务消息代理最合适?

微服务之间的安全

Kafka集群数据同步至另一个Kafka集群

怎么在一个 mysql 服务的两个不同数据库 database或者是表 之间作同步

SQL Server 在两个数据库之间同步数据

在两个数据库之间同步