我想了解Apache Ignite用于缓存和PME更新的内部锁定机制:
场景1:持久缓存
对于持久缓存,在检查点和放操作期间需要锁。我试图了解在什么级别点燃这个锁,如果它是读或写锁。是针对所有对象的整个缓存,还是跨所有缓存,还是仅针对通过检查点和缓存更新而更新的对象/对象?
场景2:在内存缓存
对于内存缓存,将没有检查点。因此,只有在缓存更新期间才会发生锁定。这个锁是在缓存级别上还是在所有缓存上,或者只是在被缓存更新的对象上。是读锁还是写锁?
由于PME要求在所有缓存上写锁,我试图弄清楚由于缓存操作引起的锁。
以上几点的提示都是有帮助的。
检查点锁定
我猜检查点锁实际上对启用持久性的Ignite操作非常重要,你特别问了这个问题,所以让我们详细讨论一下。
Ignite将在看跌操作和大量其他操作中占用checkpoint read lock
。任何需要访问数据或元数据的操作都将首先获取checkpoint read lock
。
checkpoint write lock
仅由一个启动检查点进程的线程获取,默认情况下每3分钟(checkpointTimeout
属性)。它只会在创建待检查点页面列表时持有写锁,这通常最多需要几毫秒。
所有这一切的目的是确保检查点进程可以安全地找到需要写入磁盘的脏页。
<标题>其他锁实际上,在进行读写操作时,您需要获得许多不同的锁——段锁、页锁、条目锁……Ignite是一个用线程模型编写的高度并发系统,正因为如此,它需要大量的锁。基本上,每个组件都为整个系统引入了自己的并发性和锁。
如果你真的想了解细节,我建议你从Ignite wiki上的设计文档开始。这里有一些特别有趣的:
- 持久性
- 内存页
- 分区映射交换(PME) <
- 事务/gh>