amazon-dynamodb - 竞争条件:竞争外部资源
问题描述
一、问题背景
我正在开发一个在后台运行三个实例的项目。他们都在争夺外部资源。为了更具体,假设每个实例代表一个library
。他们正在争夺资源book
。三个进程在三个不同的主机上运行。没有可用的共享变量或全局锁。该项目的目的是维护预订过程。
1.1library
实体
- 它将接收来自用户的预订请求,其中用户指定他们想要预订的书籍的标准。然后图书馆会自动找到一本书并尝试为用户保留它。
1.2book
实体
- 这是一项外部服务,我无权为其添加功能。
- 每一本书都是独一无二的。他们有属性
book_id
。 - 没有可靠的接口/服务来检查一本书是否被一个人预订。
- 我可以查询
book
实体并获取书籍记录列表。
1.3Reservation
表
- 有一张表,其中包括三个实体
Reservation
所做的所有预订。library
- 每个预订都是独一无二的。他们有属性
reservation_id
。 - 初始化预订时,没有为其分配一本书。
- 图书馆将尝试根据用户标准查找一本书。只有这样一本书才会分配给预订记录。
2.比赛条件
多个图书馆实例可能会尝试同时预订一本书。由于book
实体没有提供可靠的方法来检查一本书是否被保留,library
因此必须处理竞争条件。
3. 提出的解决方案
3.1 在library
侧边添加一个新表
一个简单而幼稚的解决方案是在library
旁边创建一个新表。主键是book_id
. 只有当新表中library
不存在时,实例才能将一本书分配给预订记录。book_id
3.2 乐观锁
我们可以直接将图书分配到预订记录中。然后查询数据库,得到一个相同的预订记录列表book_id
。只有属性最早的人才能date_modified
赢得比赛并获得书籍。其他相同的预留记录book_id
必须回滚操作。
4. 最佳实践?
非常感谢更好的解决方案!
解决方案
推荐阅读
- sql - 如何获取分组列具有最大值的组
- python - Python:如何在现有 xlsx 上写入而不覆盖其他列
- hive - Jow 在 hive 中使用 json serde 提取字段
- kubernetes - Kubernetes 中的负载均衡器
- java - 如何过滤列表
用java流收集? - javascript - 通过 JSON 循环获取地理坐标(d3 和传单)
- installation - 无法安装下载的 rpm 包
- c++ - Lcov 单元覆盖报告上传到 SonarQube
- python - pandas hwo to groupby create other columns by counting values of existing columns
- javascript - 重新加载页面后 Tampermonkey Checkbox 停止工作