【问题标题】:Kafka Streams - How to efficiently join with a large, non-copartitioned store/topicKafka Streams - 如何有效地加入大型非分区存储/主题
【发布时间】:2018-05-08 14:40:18
【问题描述】:

我们有一系列网络事件。

事件按(域,uid)划分。

这里解释的所有事件都来自同一个域。有数千个域,流量非常不均匀(因此进行了分区)。

假设我们有来自一个未注册用户 (uid1) 的事件。 我们有来自不同设备的同一未注册用户的事件,这会创建一个新的 uid(我们称之为 uid2)。

当我们在 uid1 上进行注册时,它会使用电子邮件 (email1) 进行注册。 稍后,它会从第二台设备登录 - 因此我们可以知道两个 uid 来自同一个用户。

发生这种情况时,我们可以在登录时检查用户标识符(例如电子邮件)的状态存储,以查看它是否存在,从而获取正确的用户。

但是,由于它们是不同的uid,它们不会被共分。仅按域而不是 (domain, uid) 分区是不可取的。

另外,这种用户存储的大小可能非常大,无法保存在每个应用程序实例中(数百万条记录),因此对于 GlobalKTable 存储来说可能太大了。

如何解决这个问题?

【问题讨论】:

    标签: apache-kafka apache-kafka-streams data-partitioning


    【解决方案1】:

    我想到的是,如果我们有对应于 uid2 的 uid1,那么我们可以将 uid1 的用户数据存储在 uid2 实例上的本地 KTable 中。因为 uid2 总是去那个实例,所以我们只需要将 uid1 存储在该实例的 KTable 中(而不是全局 KTable 中)。

    因此,您可以在 Kafka 之外拥有一个全局存储,也许在分布式内存键/值存储中。在收到 uid2 并且不知道用户但拥有电子邮件地址时,您检查 KTable,如果它不存在,那么您在 Kafka 之外的全局存储中查找它,然后将其存储在 KTable 中以供将来本地访问。从那时起,您将始终拥有其实例本地的 uid2 用户数据。

    这样,您只需在第一次看到来自未知 uid 的新登录时支付对键/值存储的网络调用费用。

    【讨论】:

    • ...作为 kv 存储 (uid -> customerId)。似乎解决了这个问题,并以一种明智的方式利用了本地商店中的缓存。如果需要在那里刷新客户信息,那么就会出现问题,但我认为在我们的案例中可以在外部完成。我会接受答案。谢谢!
    猜你喜欢
    • 2019-03-15
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2018-11-28
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多