Kubernetes - 当观察者有多个服务副本时,如何防止重复工作?

Kubernetes - How do I prevent duplication of work when there are multiple replicas of a service with a watcher?

我正在尝试将事件导出器构建为玩具项目。它有一个观察者,每次发生事件时都会收到 Kubernetes API 的通知,作为一个简单的例子,我们假设它想将事件存储在数据库或其他东西中。

只有一个 运行 实例可能容易出现故障,所以理想情况下我想要两个。在这种情况下,天真的实现会让两个实例都尝试将事件存储在数据库中,因此它会被复制。

  1. 去重有哪些策略?我是否必须在数据库级别执行此操作(例如,通过使用某种 eventId 或事件内容的哈希)并接受额外的数据库负载,或者是否有一种方法可以在实例级别进行重复数据删除,也许内置于Kubernetes 客户端代码?或者我是否需要实施某种领导选举?

  2. 我认为这是一个很常见的问题。是否有针对此问题的更通用的术语,我可以搜索以了解更多信息?

我查看了 GKE 事件导出器的代码作为参考,但我找不到任何重复数据删除,所以我假设它发生在接收端。

您应该在观察者级别同时使用领导者选举和 de-duplication。只有一个是不够的。

为什么需要leader选举?

如果高可用性是您的主要关注点,您应该在观察程序实例之间进行领导者选举。只有 leader pod 会将事件写入数据库。如果不使用领导者选举,实例将相互竞争写入数据库。

你可以检查一下事件是否已经写入数据库,然后再写入。但是,您不能保证在您检查事件和写入事件之间其他实例不会写入数据库。在这种情况下,数据库级锁/事务可能会有所帮助。

为什么需要de-duplication?

光是leader选举救不了你。您还需要实施 de-duplication。如果您的 leader pod 重新启动,它将重新同步所有现有事件。所以,你应该检查是否处理事件。

此外,如果发生故障转移,您如何从新领导者那里知道哪些事件已被前任领导者成功导出?