使用 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_JOB 和 BATCH_TASK 表以跟踪工作级别的请求(如前所述,一组员工的 UI 事件触发重新同步过程)和任务(员工级别)。还是有更清洁的方法?
任何帮助/设计提示将不胜感激。
【问题讨论】:
为什么 A 不能同时写入一个主题,该主题会被下沉到数据库中? 【参考方案1】:什么是分配负载的好方法?
简短的回答是使用具有大量分区的自定义分区方案。说 100。
或者您可以为每个公司创建一个主题,具体取决于您是否为每个主题使用不同的记录架构
我们是否通过从表格中查找数据来购买很多东西?
好吧,您不能像查询表格那样轻松地查询主题,所以这就是好处……您还可以使用 KTable 和交互式查询
我们正在处理的数据是存储在 DB 中的 JSON
我假设您不只是将一个 BLOB 列放入数据库(而且您也没有明确说明您使用的是什么数据库)。
就个人而言,我建议您使用 Avro 和 Kafka Connect 将主题放入数据库。这是 Kafka API 中此类任务的推荐解决方案,无需引入其他项目(如 Spark)或编写自己的数据库代码
我们需要能够跟踪状态/错误,以便最终用户了解任何问题并采取措施纠正数据
表可以工作,但是如果您可以将记录写入表,您还可以将事件写入另一个 Kafka 主题并从中获取“通知”
【讨论】:
以上是关于使用 Kafka 在两个微服务之间同步数据的主要内容,如果未能解决你的问题,请参考以下文章
Redis、Kafka或RabbitMQ:哪个作为微服务消息代理最合适?