apache-kafka - 如何在带有商店和处理器 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等基于加密的解决方案——不过,这很有见地。
解决方案
但是,这样做,我需要关联的状态存储来保持与源主题相同的分区,即(clientId,userId),但不是相同的键。这可行吗?
是的。如果输入主题是按 (clientId, userId) 划分的,则商店将以相同的方式进行分区。如果您在应用程序中重新分区数据,则可以传递自定义StreamPartitioner
以保留 (clientId, userId) 分区方案。
如何从状态存储主题中删除?对处理器代码中的“null”值做出反应非常麻烦(因为您的数据来自 (clientId, userId),而不是 (clientId, userId, eventId))。
不知道为什么这会很麻烦?即使输入主题被(clientId,userId)分区,key仍然是(clientId,userId,eventId),并且在存储中使用完整的key。
推荐阅读
- node.js - 如果通过 Mongo 驱动程序运行,如何确定 mongo 聚合是否完成
- python - AttributeError:类型对象“”没有属性“写”
- rest - 如何为 Prime Trust 的 API 创建 JWT 令牌?
- php - PHP检查日期是否在数组中重叠
- java - 我希望我的计算器重新启动,直到我按下“q”字母
- kubernetes - 如何在 Kubernetes Horizontal Pod Autoscaling 中排除某些容器的指标
- android - 是否可以仅针对指定测试运行 Android Test Orchestrator?
- javascript - 如何在没有 Internet Explorer 修改的情况下在字符串中使用双引号?
- javascript - 做出反应。尝试从 onClick 事件调用自定义钩子
- ruby - clientMutationId 如何在前端进行乐观更新?