【问题标题】:data sync between 2 instances of same microservice using kafka使用 kafka 在同一微服务的 2 个实例之间进行数据同步
【发布时间】:2021-09-16 16:41:42
【问题描述】:

我们有一个微服务充当缓存服务,并决定只启动并运行该微服务的 2 个实例。该微服务通过 kafka topic 接收数据,并作为内存缓存存储在其中。但是我们在这两个微服务之间同步数据时遇到了挑战。我们决定为每个实例使用不同的消费者组来接收相同的数据,这样两个实例就会同步。同一个代码库,如何实现在启动时订阅不同的消费者组。例如,如果 instance#1 订阅了 consumergrp1,那么其他 instance2 应该能够订阅 consumergrp2。请建议我如何实现这一目标。

【问题讨论】:

    标签: apache-kafka microservices


    【解决方案1】:

    您没有详细说明您使用 kafka 的方式(语言/第三方)等。所以,“总的来说”,您可以:

    • 指定一个随机(或部分随机)的消费者组 ID。它不会那么“干净” 作为“consumergrp1”和“conumergrp2”,但它毕竟是一个字符串,所以你可以随机生成它。这个想法包括在消费者组的名称中生成进程的标识,例如,如果微服务实例应该在不同的机器上运行,您可以将机器的名称作为消费者组名称的一部分。

    • 更复杂,但仍然:如果您有一些共享存储,则可以将其用作“同步”并存储“当前要创建的消费者组”的单调递增计数器。一旦读取该值,就必须增加它。当然,实现细节取决于您实际使用的共享存储(DB、Redis 之类的东西,等等)。

    因此有许多不同的可能解决方案。作为建议,在您采取的任何解决方案中,不要依赖于您恰好拥有两个服务实例这一事实,也许您将来会重新考虑这一点。

    【讨论】:

    • 希望,如果我去新的消费组,我仍然应该能够根据需要从主题接收旧数据?
    【解决方案2】:

    当您从流式系统获取数据或多次获取数据时,您无法在多个实例中同步微服务中的内存中数据。如果您在 pod 生命周期中仅获取一次数据,则可以实现内存中同步数据。例如,例如。当服务启动时,您可以从源中获取数据并保存在内存中。在这种情况下,两个 pod 具有相同的数据。

    你需要使用分布式缓存数据库,如redis,couchbase cache。这将是更干净整洁的方法。

    【讨论】:

    • 这个答案似乎忽略了Kafka GlobalKTable的目的
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-06-18
    • 2017-10-19
    • 2020-03-23
    • 2021-12-11
    • 2021-09-17
    • 2017-08-16
    相关资源
    最近更新 更多