asp.net Kubernetes中多个Pod中的后台服务

cld4siwp  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(142)

我在dot net中有一个后台服务微服务,我将它作为容器部署到Kubernetes。如果我有两个pod,那么每个pod将同时执行相同的数据库操作,我如何避免这种情况?请帮
我期望,如果我的一个pod正在访问数据库并获取少量记录,那么我的另一个pod不应该获取相同的记录,如果它们获取相同的记录,那么它们将在不同的pod中执行相同的操作两次

w3nuxt5m

w3nuxt5m1#

我认为有三种解决办法:

  • 仅运行一个示例。
  • 配置worker,以便每个记录都由给定的worker处理。将环境变量“rank=0”传递给第一个worker,将“rank=1”传递给第二个worker。您需要对一个示例进行两次部署才能做到这一点。两个worker都得到所有记录,但只处理id模2等于rank的记录。如果你不想硬编码示例的数量,你可以传递“rank=0”和“total=2”,然后worker只处理id模total等于rank的记录。好:它平衡了工人之间的处理。坏:如果你在一个部署中设置了两个示例,你仍然会遇到这个问题。
  • 在数据库中实现一种锁。创建一个包含三列的锁表:锁名称、工人ID和日期时间。当worker“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秒之前获得的,那么它可以获得锁。因此,获得锁的工人通常会保留它,直到它死亡。

第一个解决方案是https://en.wikipedia.org/wiki/KISS_principle

相关问题