【问题标题】:How to implement GDPR right-to-forget (delete) in Kafka Streams with stores and Processor API?如何在带有商店和处理器 API 的 Kafka Streams 中实现 GDPR 的遗忘权(删除)?
【发布时间】:2018-05-22 16:44:12
【问题描述】:

这个问题是关于在 Kafka Streams 应用程序中实现 GDPR 的,其中包含使用处理器 API 进行状态处理的完整保留主题。

假设应用程序接收事件。有不同的客户端,客户端有用户,这些用户对“事件”主题产生事件。

为了允许“遗忘权”,您必须能够根据需要删除(clientId,userId)对的数据,而不仅仅是基于保留删除。您可以通过“紧凑”策略来获得它。

如果我(就像我在非压缩主题中所做的那样)将键保留为 (clientId, userId),压缩会将所有 (clientId, userId) 记录减少到一个,显然不是我想要的。

我知道我可以有一个这样的记录键:(clientId, userId, eventId) 和一个使用 (clientId, userId) % numPartitions 的分区器,为了从用户中删除记录,我可以通过阅读来做到这一点从一开始,使用 (clientId, userId) 过滤这些记录,它们将在同一个分区中,然后在那里添加一个 ( (clientId, userId, eventId) -> null ) 记录。

但是,这样做,我需要关联的状态存储来保持与源主题相同的分区,即(clientId,userId),但不是相同的键。这可行吗?

如何从状态存储主题中删除?对处理器代码中的“null”值做出反应非常麻烦(因为您的数据来自 (clientId, userId),而不是 (clientId, userId, eventId))。


参考一般 GDPR on Kafka,请不要包含基于加密的解决方案,如 Daniel Lebrero's - 不过很有见地。

【问题讨论】:

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


    【解决方案1】:

    但是,这样做,我需要关联的状态存储来保持与源主题相同的分区,即(clientId,userId),但不是相同的键。这可行吗?

    是的。如果输入主题是(clientId,userId)的分区,则商店将以相同的方式进行分区。如果您在应用中重新分区数据,您可以传递自定义 StreamPartitioner 以保留 (clientId, userId) 分区方案。

    如何从状态存储主题中删除?对处理器代码中的“null”值做出反应非常麻烦(因为您的数据来自 (clientId, userId),而不是 (clientId, userId, eventId))。

    不知道为什么这会很麻烦?即使输入主题被(clientId,userId)分区,key仍然是(clientId,userId,eventId)并且在store中使用完整的key。

    【讨论】:

    • "即使输入主题被(clientId,userId)分区,key仍然是(clientId,userId,eventId),并且在存储中使用完整的key。 >> 我从here 了解到,状态存储中的键决定了它们的分区,所以我明白在状态存储中我的状态存储中的记录键必须与分区相同,在这种情况下,(客户端,用户),并且如果是(客户端、用户、事件),它将破坏分区。
    • 另一个问题是您使用整个密钥对数据进行分区的一般情况。因此,答案并不完全准确:商店是根据相应的输入主题分区模式进行分区的。因为默认情况下,主题分区模式是基于键的,另一个答案本身并没有“错误”——只是不精确。
    • 我会尽量简化。我不想使用完整的密钥(clientId、userId、evenId)作为商店的密钥。我希望 (clientId, userId) 作为 store 的键(否则事件不会关联),这与输入主题的 partitioning 相同,但与 record 键不同 的输入主题。这样可以吗?
    • 我认为您不能在商店中使用 (clientId, userId),因为——据我了解——商店需要在同时。因此,类似于防止日志压缩删除具有相同(clientId,userdId)的记录,您也需要将 eventId 添加到存储中。分区仍然可以,因为本地存储首先对分区一无所知,只会接受数据。
    • 对于底层变更日志主题,我们不使用基于键的分区,而是将变更日志分区“固定”到输入主题分区(即,在写入时,我们明确指定分区号为与输入主题分区相同---写入更改日志主题时不使用基于键的哈希)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多