如何有效地加入一个大的,非共分区存储/主题

2admgd59  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(287)

我们有一连串的网络活动。
事件按(域,uid)分区。
这里解释的所有事件都来自同一个域。有成千上万个域,流量非常不均匀(因此分区)。
假设我们有来自一个未注册用户(uid1)的事件。我们有来自同一个未注册用户的事件,这些事件来自一个单独的设备,该设备创建了一个新的uid(我们称之为uid2)。
当我们在uid1上注册时,它会通过电子邮件(email1)注册。稍后,从第二个设备登录,这样我们就可以知道两个uid来自同一个用户。
当这种情况发生时,我们可以在登录时检查状态存储中的用户标识符(例如电子邮件),看看它是否存在,从而获得正确的用户。
但是,因为它们是不同的uid,所以它们不会被共分。只按域而不是(域,uid)分区是不可取的。
另外,这样一个用户存储的大小可能非常大,无法保存在每个应用程序示例中(数百万条记录),因此对于globalktable存储来说可能太大了。
如何解决这个问题?

fnvucqvd

fnvucqvd1#

我想到的是,如果我们有对应于uid2的uid1,那么我们可以将uid1的用户数据存储在uid2示例的本地ktable中。因为uid2总是指向该示例,所以我们只需要将uid1存储在该示例的ktable中(而不是全局ktable中)。
因此,您可以在kafka之外有一个全局存储,也许在一个分布式内存中的键/值存储中。在收到uid2并且不知道用户但是有电子邮件地址时,您检查ktable,如果它不在那里,那么您在kafka外面的全局存储中查找它,然后将它存储在ktable中以供将来的本地访问。从那时起,uid2的用户数据将始终位于其示例的本地。
这样,您只需在第一次看到来自未知uid的新登录时支付对键/值存储的网络调用的费用。

相关问题