首页 > 解决方案 > 如何在带有商店和处理器 API 的 Kafka Streams 中实现 GDPR 的遗忘权(删除)?

问题描述

这个问题是关于在 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))。


Kafka上的通用GDPR参考,请不要包括Daniel Lebrero等基于加密的解决方案——不过,这很有见地。

标签: apache-kafkastreamingpartitioningapache-kafka-streams

解决方案


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

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

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

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


推荐阅读