博客
关于我
论分布式系统中单一锁控制的优化
阅读量:371 次
发布时间:2019-03-05

本文共 2399 字,大约阅读时间需要 7 分钟。

在分布式系统中,数据操作的一致性通常依赖于锁机制。简单的对象锁或ReadWriteLock虽然能提供线程安全,但在高并发场景下表现不足。单一锁的主要问题在于其粗粒度,容易引发严重的竞争和性能瓶颈。例如,HDFS NN中的FSN锁在高并发下会导致大量请求被阻塞。

为了优化单一锁的性能,可以采用锁粒度细化的方法。这种优化不仅仅是将ReadWriteLock分离为更细粒度的锁,而是根据实际资源进行控制。例如,在元数据更新中,将数据库锁拆分为表锁。这种方式能更精确地控制锁粒度,减少锁竞争。

细化锁粒度后,需要引入锁管理器。锁管理器负责对锁的生命周期进行管理,包括借出和归还锁。同时,可以对锁的活跃状态进行引用计数管理,避免资源泄漏。为了进一步优化,可以设置锁的最大容量限制,控制并发度。

另一个需要注意的问题是锁的资源优先级。假设系统中有三个资源类别A、B、C,A包含多个B,B又包含多个C。资源优先级应遵循:持有低优先级锁时,不能获取其上级资源锁;持有高优先级锁时,可以获取下级资源锁。例如,持有A锁时,可以获取B或C锁,但持有C锁则不能获取B或A锁。

以下是一个Hadoop Ozone中的锁管理器实现示例:

package org.apache.hadoop.ozone.lock;import org.apache.commons.pool2.impl.GenericObjectPool;import org.apache.hadoop.conf.Configuration;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class LockManager {    private static final Logger LOG = LoggerFactory.getLogger(LockManager.class);    private final Map
activeLocks = new ConcurrentHashMap<>(); private final GenericObjectPool
lockPool = new GenericObjectPool<>(new PooledLockFactory()); public LockManager(Configuration conf) { int maxPoolSize = conf.getInt(HddsConfigKeys.HDDS_LOCK_MAX_CONCURRENCY, HddsConfigKeys.HDDS_LOCK_MAX_CONCURRENCY_DEFAULT); lockPool.setMaxTotal(maxPoolSize); } public void lock(Object resource) { activeLocks.compute(resource, (k, v) -> { ActiveLock lock; try { if (v == null) { lock = lockPool.borrowObject(); } else { lock = v; } lock.incrementActiveCount(); } catch (Exception ex) { LOG.error("Unable to obtain lock.", ex); throw new RuntimeException(ex); } return lock; }).lock(); } public void unlock(Object resource) { ActiveLock lock = activeLocks.get(resource); if (lock == null) { LOG.warn("Trying to release the lock on {}, which was never acquired.", resource); return; } lock.unlock(); activeLocks.computeIfPresent(resource, (k, v) -> { v.decrementActiveCount(); if (v.getActiveLockCount() != 0) { return v; } lockPool.returnObject(v); return null; }); }}

ActiveLock类是一个包装了ReentrantLock的锁管理器,维护锁的活跃计数。通过这种方式,可以更精确地控制锁的使用,并优化系统性能。

转载地址:http://ymng.baihongyu.com/

你可能感兴趣的文章
python | xlsxwriter,一个实用的 Python 库!
查看>>
python | xlwings,一个非常实用的 Excel 相关的 Python 库!
查看>>
python | xmltodict,一个非常厉害的 关于XML数据 Python 库!
查看>>
python | xonsh,一个超酷的 Python 库!
查看>>
python | yagmail,一个实用的 Python 库!
查看>>
python | 一文掌握Python的上下文管理器和with语句
查看>>
python | 一文看懂Python闭包机制与变量作用域规则
查看>>
python读取含中文的json
查看>>
python | 如何用Python锁避免并发错误?
查看>>
python | 提升代码迭代速度的Python重载方法
查看>>
python | 深入理解Python并发编程中的GIL限制与解决方案
查看>>
Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
查看>>
python | 高效使用Python工具自动生成模块文档的秘诀
查看>>
python 一个list去除另一个list中的值
查看>>
python 三大框架的 介绍。
查看>>
Python 下载的 11 种姿势,一种比一种高级!
查看>>
python读取一个文件夹下所有图片_初学Python-找出文件夹下的所有图片
查看>>
Python 中 3 个不可思议的返回功能
查看>>
python 中 dict 的另一种用法
查看>>
Python 中 PIL 读取图片出现异常旋转的解决方法
查看>>