Ruby on Rails concurrency 并发处理
背景
系统使用分布式部署, 在提高并发的同时, 也引入了并发问题.
并发问题往往较难调试和处理.
所幸, Rails 和 ruby 社区提供一些优秀的方案可以用来解决并发问题.
这里做一个总结, 分享给大家.(受到个人的局限性, 文章后续会根据自己的经验再次更新.)
概要
并发问题的处理方式,大致分为2类 机制
和 分布式锁
- 机制
- Uniqueness constraint 唯一性约束
- Optimistic Locking 乐观锁
- 分布式锁 distributed lock
- Pessimistic Locking
- Advisory lock
- Redis
Locking is helpful for preventing race conditions when updating records in the database and ensuring atomic updates.
下面分别给大家分享一下具体的使用
Uniqueness constraint 唯一性约束
唯一性约束, 是我个人认为最为常用, 最为有效的处理并发的一种方式.
能够在数据库层面限制住冗余数据的产生.
使用场景:
- 新增用户, 新增邮箱等
- 保障幂等
优势
- 实现简单,使用方便
不足:
- 仅适用于新增数据, 且需要指定列
- 后期变动不易
- 索引占据一定空间
Rails的使用:
SchemaStatements.html#method-i-add_index
add_index(:accounts, [:branch_id, :party_id], unique: true)
对应的sql:
CREATE UNIQUE INDEX index_accounts_on_branch_id_and_party_id ON accounts(branch_id, party_id)
要特别注意: rails 的validate uniqueness 是不靠谱的. rails 不会帮忙我们创建唯一性约束的.