Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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 | 分布式锁服务

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: true

spring:
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)