【问题标题】:How to solve race conditions among K8s pods如何解决 K8s pod 之间的竞争条件
【发布时间】: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


【解决方案1】:

我认为您应该重新考虑您的表架构。

通过在 id_2/created_data 上有一个以 id_2 作为散列、没有排序键和全局二级索引的表

当然,这仅适用于 id_2 在表中是唯一的,而不是每个 id

唯一的

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 2013-10-11
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2016-11-16
    相关资源
    最近更新 更多