Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ahoo-wang/simba
Distributed lock service | 分布式锁服务
https://github.com/ahoo-wang/simba
distributed java kotlin lock mutex mutex-lock redis scheduler spring spring-boot zookeeper
Last synced: 3 months ago
JSON representation
Distributed lock service | 分布式锁服务
- Host: GitHub
- URL: https://github.com/ahoo-wang/simba
- Owner: Ahoo-Wang
- License: apache-2.0
- Created: 2021-09-03T13:08:22.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-10-24T21:35:17.000Z (3 months ago)
- Last Synced: 2024-10-30T05:36:10.940Z (3 months ago)
- Topics: distributed, java, kotlin, lock, mutex, mutex-lock, redis, scheduler, spring, spring-boot, zookeeper
- Language: Kotlin
- Homepage:
- Size: 907 KB
- Stars: 17
- Watchers: 3
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Simba(Distributed Mutex)
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
[![GitHub release](https://img.shields.io/github/release/Ahoo-Wang/Simba.svg)](https://github.com/Ahoo-Wang/Simba/releases)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/me.ahoo.simba/simba-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/me.ahoo.simba/simba-core)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/41f28a111d9c457ab7a9aae6861185eb)](https://www.codacy.com/gh/Ahoo-Wang/Simba/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Ahoo-Wang/Simba&utm_campaign=Badge_Grade)
[![codecov](https://codecov.io/gh/Ahoo-Wang/Simba/branch/main/graph/badge.svg?token=P9EMJKJ2I5)](https://codecov.io/gh/Ahoo-Wang/Simba)## Introduction
Simba aims to provide easy-to-use and flexible distributed lock services and supports multiple storage implementations: relational databases, Redis, and Zookeeper.
## Installation
### Gradle
> Kotlin DSL
``` kotlin
implementation("me.ahoo.simba:simba-spring-boot-starter:${simbaVersion}")
```### Maven
```xml
4.0.0
demo
simbaVersion
me.ahoo.simba
simba-spring-boot-starter
${simba.version}
```
### application.yaml```yaml
simba:
jdbc:
enabled: true
# redis:
# enabled: truespring:
datasource:
url: jdbc:mysql://localhost:3306/simba_db
username: root
password: root
```### Optional-1: JdbcMutexContendService
![JdbcMutexContendService](docs/JdbcMutexContendService.png)
> Kotlin DSL
``` kotlin
implementation("me.ahoo.simba:simba-jdbc:${simbaVersion}")
``````sql
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
``` kotlin
implementation("me.ahoo.simba:simba-redis:${simbaVersion}")
```### Optional-3: ZookeeperMutexContendService
> Kotlin DSL
``` kotlin
implementation("me.ahoo.simba:simba-zookeeper:${simbaVersion}")
```## Examples
[Simba-Examples](https://github.com/Ahoo-Wang/Simba/tree/main/simba-example)
## Usage
### MutexContender
```java
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
```java
try (Locker locker = new SimbaLocker("mutex-locker", this.mutexContendServiceFactory)) {
locker.acquire(Duration.ofSeconds(1));
/**
* doSomething
*/
} catch (Exception e) {
log.error(e.getMessage(), e);
}
```### Scheduler
```kotlin
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
- [Govern-EventBus](https://github.com/Ahoo-Wang/govern-eventbus/tree/master/eventbus-core/src/main/java/me/ahoo/eventbus/core/compensate)
- [CoSky](https://github.com/Ahoo-Wang/CoSky/blob/main/cosky-rest-api/src/main/kotlin/me/ahoo/cosky/rest/stat/StatServiceScheduler.kt)