kubernetes 中多个 pod 中的后台服务

问题描述 投票:0回答:1

我在 dot net 中有一个后台服务微服务,我将其作为容器部署到 Kubernetes。如果我有两个 pod,那么每个 pod 将同时执行相同的数据库操作,我该如何避免这种情况?请帮忙

我期望,如果我的一个 pod 正在访问数据库并获取少量记录,那么我的另一个 pod 不应该获取相同的记录,如果它们获取相同的记录,那么它们将在不同的 pod 中执行相同的操作两次

asp.net .net-core microservices background-service hl7-dotnetcore
1个回答
0
投票

我看到三种解决方案:

  • 仅运行一个实例。
  • 配置worker,以便每条记录都由给定的worker处理。将环境变量“rank=0”传递给第一个worker,将“rank=1”传递给第二个worker。您需要对一个实例进行两次部署才能做到这一点。两个worker都获取所有记录,但只处理id模2等于rank的记录。如果你不想硬编码实例的数量,你可以传递“rank=0”和“total=2”,然后worker只处理id模total等于rank的记录。好:它平衡了工人之间的处理。不好:如果在部署中设置两个实例,问题仍然存在。
  • 在数据库中实现一种锁。创建一个包含三列的锁表:锁名称、工作人员 ID 和日期时间。当工作线程“1234”启动时(“1234”是 pod id),它会每 10 秒尝试通过以下请求获取锁“database_lock”:
    UPDATE lock SET worker_id="1234", date_time=CURRENT_TIMESTAMP() WHERE lock="database_lock" AND (worker_id="1234" OR date_time < CURRENT_TIMESTAMP() - 30000);
    。如果可以更新该行,则工作线程已成功“获取”锁并可以处理数据库。如果没有,则它保持空闲状态。在这两种情况下,它都会在 10 秒后尝试再次获取锁。如果worker已经拥有锁,或者已经在30秒前获取锁,则可以由worker获取锁。因此,获得锁的工作人员通常会保留它直到其死亡。

我建议第一个解决方案(https://en.wikipedia.org/wiki/KISS_principle)。

© www.soinside.com 2019 - 2024. All rights reserved.