【发布时间】:2019-09-19 20:18:55
【问题描述】:
这可能不需要对 K8s pod 做任何事情,但我怀疑是更算法的事情。但这是我们面临的完整情况。
假设我们有 2 个 pod -> 正在运行 java 应用程序。
我们有 1 个 Dynamo 表 -> 有 id(hash_key)(not unique)、created_date(sort_key)、id_2
程序的预期行为是检查给定id(最新)的存在并获取它的id_2。如果不存在这样的id,则生成一个新的id_2。
现在是比赛条件 -->
两个 pod 并行开始执行逻辑,都开始查询 Dynamo,巧合的是相同的id。现在他们没有找到任何这样的id .. 因为它们都没有插入到 Dynamo 中,因此它们创建了完全独立的新 id_2.. 并且两个 pod 最终都为相同的id_2 插入了新的id..不应该是这样的。
我们如何解决这种竞争条件。
任何线索将不胜感激。谢谢
【问题讨论】:
-
您可以查看事务是否适合协调表中的插入。
-
对我来说,这根本不像是 kubernetes 问题。你需要在这里使用事务来摆脱这个问题。在使用 spring-boot 时,看看如何覆盖一种特定方法的事务隔离。
-
@PrateekJain 但是 nosql 如何支持事务呢?此外,即使事务是管理的,我们也会在同一个 pod 内而不是跨 pod。我的理解正确吗?请帮我理解
-
不,事务不在 pod 级别。他们在数据库级别。我不是 dynamodb 专家,但我可以看到他们确实支持交易 aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions。否则,您可以在表中引入一个名为“版本”的列,并使用它来处理并发问题。基本上,当您阅读和应用更新时,版本的值应该是相同的。
标签: algorithm spring-boot java-8 kubernetes amazon-dynamodb