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

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

在分布式系统中,数据操作的一致性通常依赖于锁机制。简单的对象锁或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/

你可能感兴趣的文章
Node-RED中使用JSON数据建立web网站
查看>>
Node-RED中使用json节点解析JSON数据
查看>>
Node-RED中使用node-random节点来实现随机数在折线图中显示
查看>>
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
node.js 配置首页打开页面
查看>>
node.js+react写的一个登录注册 demo测试
查看>>
Node.js中环境变量process.env详解
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
Node.js的循环与异步问题
查看>>
Nodejs express 获取url参数,post参数的三种方式
查看>>
nodejs libararies
查看>>
nodejs npm常用命令
查看>>
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 读取xlsx文件内容
查看>>