Simba 旨在提供易用、灵活的分布式锁服务,支持多种存储后端实现:关系型数据库、Redis、Zookeeper。
安装
Gradle
Kotlin DSL
val simbaVersion = "0.3.2"; implementation("me.ahoo.simba:simba-spring-boot-starter:${simbaVersion}")
Maven
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0 demo 0.3.2 me.ahoo.simba simba-spring-boot-starter ${simba.version}
application.yaml
simba: jdbc: enabled: true # redis: # enabled: true spring: datasource: url: jdbc:mysql://localhost:3306/simba_db username: root password: root
Optional-1: JdbcMutexContendService
Kotlin DSL
val simbaVersion = "0.3.2"; implementation("me.ahoo.simba:simba-jdbc:${simbaVersion}")
create table simba_mutex ( mutex varchar(66) not null primary key comment 'mutex name', acquired_at bigint unsigned not null, ttl_at bigint unsigned not null, transition_at bigint unsigned not null, owner_id char(32) not null, version int unsigned not null );
Optional-2: RedisMutexContendService
Kotlin DSL
val simbaVersion = "0.3.2"; implementation("me.ahoo.simba:simba-redis:${simbaVersion}")
Optional-3: ZookeeperMutexContendService
Kotlin DSL
val simbaVersion = "0.3.2"; implementation("me.ahoo.simba:simba-zookeeper:${simbaVersion}")
Examples
使用入门
MutexContender
MutexContendService contendService = contendServiceFactory.createMutexContendService(new AbstractMutexContender(mutex) { @Override public void onAcquired(MutexState mutexState) { log.info("onAcquired"); } @Override public void onReleased(MutexState mutexState) { log.info("onReleased"); } }); contendService.start();
SimbaLocker
try (Locker locker = new SimbaLocker("mutex-locker", this.mutexContendServiceFactory)) { locker.acquire(Duration.ofSeconds(1)); /** * doSomething */ } catch (Exception e) { log.error(e.getMessage(), e); }
Scheduler
public class ExampleScheduler extends AbstractScheduler implements SmartLifecycle { public ExampleScheduler(MutexContendServiceFactory contendServiceFactory) { super("example-scheduler", ScheduleConfig.ofDelay(Duration.ofSeconds(0), Duration.ofSeconds(10)), contendServiceFactory); } @Override protected String getWorker() { return "ExampleScheduler"; } @Override protected void work() { if (log.isInfoEnabled()) { log.info("do some work!"); } } }
Use Cases