【问题标题】:Allocation of data to Concurrent users将数据分配给并发用户
【发布时间】:2019-11-30 07:27:59
【问题描述】:

在我们的应用程序中,我们使用微服务架构。微服务之一是分配微服务。 这个分配微服务功能是从 Postgres DB 中为登录我们应用程序的用户分配 100 条不同的记录,其中一张表中有 100 万条记录。

目前我们正在使用弹簧靴,我们正在使用乐观锁定机制来处理它。甚至,当大约 100 个并发用户在使用应用程序时,应用程序的性能会非常缓慢,分配微服务大约需要 2 多分钟才能将数据分配给用户。一旦分配了数据,我们就将数据存储在 redis 中。

(这是一个数据库更新,我们将状态从“已分配”更改为“已分配”,并将“已分配给”字段更新为特定用户。用例是,不应将两条相同的记录分配给同一用户,为避免这种情况,我们使用了“乐观锁”,在这种情况下系统的性能非常慢。还有其他提高性能的解决方案吗?)

除了乐观锁还有其他提高性能的解决方案吗?

【问题讨论】:

  • “将记录分配给用户”是什么意思?是数据库更新还是将它们加载到内存中?请添加此块的代码。目前还不清楚。
  • 这是一个数据库更新,我们将状态从“已分配”更改为“已分配”,并将“已分配到”字段更新为特定用户。用例是,不应该将两条相同的记录分配给同一个用户,为避免这种情况,我们使用“乐观锁”,在这种情况下系统的性能非常慢。还有其他提高性能的解决方案吗?
  • 您是逐个更新记录还是批量更新?您是否将相同的记录分配给不同的用户?
  • 我们不应该将相同的记录分配给不同的用户。我们一个一个地更新......一组 100 条记录给一个用户。

标签: java spring-boot design-patterns database-design concurrency


【解决方案1】:

将任务分配给用户是一种作业队列模式。

对于数据库中的并发用户来说,很容易出错或使其变得非常慢。 但在已知的解决方案中很常见,在数据库事务期间对数据库行使用悲观锁,例如在 spring-boot 中使用 spring-data 或使用 native sql

如果您在每个事务中选择并锁定许多行而不是逐一(限制为 1),则可以在主键上添加 order by 以避免潜在的死锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2020-11-10
    • 2014-04-07
    • 2016-04-01
    • 1970-01-01
    • 2014-07-17
    • 2017-02-04
    • 2018-10-25
    相关资源
    最近更新 更多