我们有一系列网络活动。
事件由(domain,uid)分区。
此处说明的所有事件均来自同一个域。有数千个域,流量非常不均匀(因此划分)。
假设我们有来自一个未注册用户(uid1)的事件。 我们有来自同一个未注册用户的事件来自一个单独的设备,它会创建一个新的uid(我们称之为uid2)。
当我们在uid1上注册时,它会注册一个电子邮件(email1)。 之后,它从第二台设备登录 - 所以我们可以知道两个uid来自同一个用户。
当发生这种情况时,我们可以在登录时检查状态存储以获取用户标识符(例如电子邮件)以查看它是否存在并因此获得正确的用户。
但是,由于它们是不同的uid,因此它们不会被分割。仅通过域而不是(域,uid)进行分区是不可取的。
另外,这样的用户商店的大小可能非常大,无法保存在每个应用程序实例中(数百万条记录),因此对于GlobalKTable商店来说可能太多了。
如何解决这个问题?
答案 0 :(得分:0)
对我来说,如果我们有uid1对应uid2,那么我们可以将uid1的用户数据存储在uid2实例的本地KTable中。因为uid2总是去那个实例,所以我们只需要将uid1存储在该实例的KTable中(而不是全局KTable中)。
因此,您可以在Kafka之外拥有一个全局存储,可能位于分布式内存中的键/值存储中。在收到uid2并且不知道用户但是拥有电子邮件地址时,您检查KTable,如果它不在那里,那么您在Kafka之外的全球商店中查找它,然后将其存储在KTable中以供将来本地访问。从那时起,您将始终将uid2的用户数据本地化为其实例。
这样,您只需在第一次看到来自未知uid的新登录时支付键/值存储的网络调用费用。