• Stars
    star
    180
  • Rank 206,276 (Top 5 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created almost 2 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A high-reliable, high-throughput distributed lock service based on the consensus algorithm component WPaxos.

WLock

WLock是一套基于一致性算法组件WPaxos 实现的高可靠、高吞吐分布式锁服务,可应用于分布式环境下协调多进程/线程对共享资源的访问控制、多节点Master选主等业务场景。

核心能力

  • 丰富的锁类型: 互斥锁、可重入锁、公平锁、优先级锁、读写锁;
  • 灵活的锁操作: 支持阻塞/非阻塞、同步/异步watch等方式获取锁,支持锁续约,TTL等机制;
  • 获取锁粒度: 进程、线程;
  • 多租户隔离: 提供秘钥作为集群分配、锁操作隔离、权限控制的租户单位,支持单个秘钥跨集群动态平滑迁移;
  • 配置管理: 提供集群节点扩/缩容,主从切换配置变更推送,客户端秘钥配置管理,秘钥归属集群平滑迁移等能力;

特性

  • 高可靠性:
    基于paxos算法实现多副本数据同步,Master节点故障时主从自动切换,在无Master或者Master漂移过程仍可保证锁状态的持续一致性,不影响正常锁操作;

  • 高吞吐:
    集群多节点互为主备部署,多paxos分组的Master均匀分布在所有集群节点,不同paxos分组的锁操作并行处理,相同paxos分组锁操作批量合并处理,大大提升了系统的吞吐量;

  • 易用性: 丰富的锁接口封装,开箱即用;

为什么选择WLock

在分布式领域中,分布式锁已经是一种比较成熟的技术,现有的实现方案也有很多,例如基于Redis封装的Redisson Lock、RedLock,以及基于Zookeeper、Etcd等系统的封装实现,既然已经存在这么多分布式锁方案,为什么还开发WLock,优势又有哪些?接下来我们从功能、服务特性、性能三个维度,介绍下这几种分布式锁的差异化。

功能差异

实现 wlock redis(redisson) zookeeper(curator) etcd (jetcd)
锁类型 公平锁/优先级锁/读写锁 公平锁/非公平锁/读写锁 公平锁/读写锁 公平锁
锁续约 支持(自动/主动触发) 仅支持watchdog自动续约 不支持 支持
异步watch机制 支持 不支持 支持 支持
TTL机制 支持 支持 不支持 支持
锁粒度 进程/线程 线程 线程 进程/线程

服务特性

实现 wlock redis(redisson) redis (redlock) zookeeper(curator) etcd (jetcd)
可用性 N/2 + 1可用 主从(异步) N/2 + 1可用 N/2 + 1可用 N/2 + 1可用,但是在leader发生切换期间,不提供服务
可靠性 低,主从切换数据可能丢失 略高,对节点间时钟一致性要求高,单节点挂掉数据不能同步恢复
单客户端并发 最高到5.5W左右 最高到3W左右 最高到2.9W左右 最高到6.5K左右 最高到5.5K左右
系统吞吐量 13.6万+ 3万 3万 8750 6793
响应延迟 700微妙+ 200微妙+ 600微妙+ 2毫秒+ 2毫秒+
接入复杂度 简单,已封装接口 简单,已封装接口 简单,已封装接口 简单,已封装接口(非curator sdk需自行封装) 需要封装

性能

测试运行环境

机器配置:
CPU:20 x Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz  
内存:192 GB  
硬盘:ssd  
网卡:万兆网卡  
服务端集群机器个数:3台

测试结果

单客户端qps:

相同并发下,请求响应延迟(单位ms)

说明:以上对比测试的中数据,redis、zk、etcd相关非官方数据,均由我们在相同环境下实际压测得到。其中,对于qps的统计,客户端请求一次加锁再请求一次释放锁合并为一次计数,更详细的压测数据及压测条件可查看开源对比文档。

通过以上几个维度的测试分析,WLock的优势在于可靠性与系统吞吐量比较高,处理延迟略低于redis,但明显高于zookeeper与etcd,为此,对于分布式锁选型有以下建议:

  1. 对可靠性要求不高,响应延迟比较敏感的场景,锁并发低于3W时可使用redis,高于3W建议用WLock;
  2. 对可靠性要求比较高,同时锁并发高于500的场景,可使用WLock;

快速使用

本地运行 WLock

WLock 运行在所有主流操作系统上,只需要安装Java JDK 8 或更高版本。

快速部署与启动 :

通过该启动方式,会创建默认集群(default_cluster)与默认秘钥(default_key),可快速部署注册中心与服务节点进行测试,参考文档

常规部署与启动 :

以下为生产环境正常服务部署、启动流程:

  1. 创建数据表
    • wlock注册中心为方便快速启动,使用 H2 数据库,线上建议使用mysql,建表请参考 SQL.
  2. 调整数据库配置详情
  3. 部署注册中心并启动 - 详情
  4. 创建集群 - 详情
  5. 添加节点 - 详情
  6. 节点上线 - 详情
  7. 服务端初始化 - 详情

客户端初始化

1. 注册秘钥

# 访问注册中心节点通过 swagger 快速注册秘钥
http://localhost:8888/swagger-ui/index.html#/key-rest/addKeyUsingPOST

2. 依赖客户端jar包

# 客户端 jar 包位置
cd target/client
<dependency>
  <artifactId>wlock.client</artifactId>
  <groupId>com.wuba.wlock</groupId>
  <version>{project.version}</version>
</dependency>

3. 查看秘钥配置

http://localhost:8888/swagger-ui/index.html#/key-rest/getKeyListUsingPOST

4. 初始化

wLockClient = new WLockClient("D484FEEF4F6E564920FABD0DE3C58D77", "127.0.0.1", 22020);
String lockKey = "my_test_lock";
WDistributedLock wdLock = wlockClient.newDistributeLock(lockKey);

参数说明 :
keyHash :秘钥hash key,从秘钥配置中获取
registryIp :注册中心 ip
registryPort :注册中心端口 lockKey :分布式锁名称
WDistributedLock :分布式锁对象封装

互斥锁示例

String keyPath = "/opt/wlock.key";
WLockClient wlockClient = new WLockClient(keyPath);
String lockKey = "my_test_lock";
WDistributedLock wdLock = wlockClient.newDistributeLock(lockKey);

AcquireLockResult lockResult = wdLock.tryAcquireLock(30000, 10000, new LockExpireListener() {
	@Override
	public void onExpire(String key) {
		System.out.println("key expired");
	}
});

读写锁示例

WLockClient wlockClient= new WLockClient("test123_8", "127.0.0.1", 22020);
WReadWriteLock wReadWriteLock = wlockClient.newReadWriteLock("test_key" );
WReadLock readLock = wReadWriteLock.readLock();
WWriteLock  writeLock = wReadWriteLock.writeLock();
AcquireLockResult readResult = readLock.tryAcquireLock(1000 * 60, 1000 * 60);
AcquireLockResult writeResult = writeLock.tryAcquireLock(1000 * 60, 1000 * 60);

以上只是简单使用demo,详细使用说明请参考使用文档

文档

开源对比
部署文档
接口文档
分布式锁源码实现对比
其它实现原理介绍文档

参考

How to do distributed locking

未来规划

  1. 提供go、php等多语言sdk
  2. 开源web管控中心、监控模块
  3. 支持分布式信号量机制

如何贡献

诚挚邀请对分布式锁感兴趣的同学一起参与WLock项目的开发建设,或提出宝贵意见和建议,参与方式可参考文档CONTRIBUTING。Star&Fork也是对我们最大的支持。

开源许可

WLock项目基于Apache License 2.0协议开源

Stargazers over time

Stargazers over time

联系我们

欢迎添加58技术微信账号,加入wlock技术讨论群~

More Repositories

1

Fair

A Flutter package used to update widget tree dynamically. Fair提供一整套Flutter动态化解决方案
Dart
2,498
star
2

WBBlades

基于Mach-O的ObjC & Swift无用类、无用协议、无用资源检测,包大小分析,点对点崩溃解析。
Objective-C
1,440
star
3

Picasso

一款UI自动生成代码插件,提供UI自动生成代码全流程解决方案。
TypeScript
1,090
star
4

Antenna

Antenna是58同城安全团队打造的一款辅助安全从业人员验证网络中多种漏洞是否存在以及可利用性的工具。其基于带外应用安全测试(OAST)通过任务的形式,将不同漏洞场景检测能力通过插件的形式进行集合,通过与目标进行out-bind的数据通信方式进行辅助检测。
JavaScript
704
star
5

react-native-echarts

📈 React Native ECharts Library: An awesome charting library for React Native, built upon Apache ECharts and leveraging react-native-svg and react-native-skia. Offers significantly better performance compared to WebView-based solutions.
TypeScript
656
star
6

Oceanus

58同城数据库中间件
Java
548
star
7

dl_inference

通用深度学习推理工具,可在生产环境中快速上线由TensorFlow、PyTorch、Caffe框架训练出的深度学习模型。
Java
399
star
8

Taro-Mortgage-Calculator

首个 Taro 3 多端统一实例 - 支持 React Native,Weapp,H5。
TypeScript
349
star
9

qa_match

A simple effective ToolKit for short text matching
Python
327
star
10

FairPushy

FairPushy 基于Dart三端一体化动态更新平台,为Flutter Fair设计的动态化框架提供动态分发能力
Dart
260
star
11

taro-playground

The Taro Playground App is a cross-platform application developed using Taro, to help developers develop and debug Taro applications.
TypeScript
225
star
12

WPaxos

A production-grade java implementation of paxos consensus algorithm
Java
198
star
13

metro-code-split

Further split the React Native code based on Metro build to improve performance, providing `Dll` and `Dynamic Imports` features
JavaScript
186
star
14

magpie

Magpie is a visualized platform which designed to create, develop and compile your standalone flutter module.
Dart
124
star
15

wwto

WWTO,小程序跨端迁移解决方案,低成本将微信小程序转为其他平台(百度、支付宝、头条)小程序。
JavaScript
105
star
16

LPA-Detector

Optimize and improve the Label propagation algorithm
Java
88
star
17

Zucker

An easier way to automatically calculate the size of AAR in apk based on APP module
Python
86
star
18

mp-monitor

mp-monitor脱胎于58内部前端质量监控系统“北斗”。致力于为小程序异常采集和性能统计分析提供采集方案和统一的数据指标,适配多端小程序(微信,头条,支付宝,百度,QQ,360,JD)。 如果开发者想要在自己的项目中快速搭建小程序的异常采集和性能监控数据分析。mp-monitor将能帮助用户快速采集到相关的数据用于分析和监控。
TypeScript
67
star
19

magpie_sdk

A Native-Futter hybrid development solution. Native developers do not need to install FlutterSDK. This Flutter plugin provides general capabilities such as routing management and dynamic protocol registration.
Objective-C
49
star
20

magpie_log

A visualized dynamic programming for log collection based on flutter.
Dart
48
star
21

magpie_fly

Magpie-fly is a component library produced by 58 Group, which encapsulates a variety of common components to meet the needs of developers
Dart
39
star
22

json-model-validator

A flexible, lightweight JSON Data validator and formatter
TypeScript
30
star
23

taro-visualization

TypeScript
28
star
24

wsilk

wsilk是一个辅助开发人员的代码生成框架(wsilk is a framework that assists developers to generate code)
Java
24
star
25

Taro-Code-In-React-Native

Taro React Native 参考样例。支持在 React Native 初始化的项目中引入 Taro 3 代码。
JavaScript
21
star
26

EasyAOP

EasyAOP是基于ASM实现切面通用能力的工具。EasyAOP提供的通用切面能力,可以使用配置文件方式来配置使用。(EasyAOP is a tool based on ASM to realize the general capability of AOP. General faceting capabilities provided by EasyAOP,You can use the yaml file format to configure the use of EasyAOP.)
Kotlin
20
star
27

first-meaning-paint

首次有效绘制表示当前页面最想展示给用户的元素渲染的时间点,即主元素渲染点。
JavaScript
11
star
28

FairTemplate

FairTemplate 是为Fair 开发者设计的常用基础组件库及代码模板,结合Fair 团队自研的IDE 插件,快速地搭建Fair 动态化页面,提升Fair 的开发效率。
Dart
4
star
29

ideaPlugin-MavenManager

Manage dependencies of maven project to resolve jar conflicts
Java
3
star