Skip to content

Ahoo-Wang/Simba

Folders and files

NameName
Last commit message
Last commit date
Nov 14, 2024
Nov 25, 2021
Feb 27, 2025
Nov 12, 2022
Nov 25, 2021
Nov 3, 2022
Apr 25, 2025
Nov 3, 2022
Mar 22, 2025
Mar 22, 2025
Jun 19, 2023
Mar 22, 2025
Jan 10, 2025
Mar 22, 2025
Jun 27, 2023
Mar 22, 2025
Sep 3, 2021
Nov 26, 2021
Nov 24, 2022
Nov 24, 2022
Mar 22, 2025
Nov 3, 2022
Apr 10, 2025
Apr 25, 2025
Apr 25, 2025
Apr 13, 2022
Jul 1, 2023

Repository files navigation

Simba(Distributed Mutex)

License GitHub release Maven Central Codacy Badge codecov

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

    implementation("me.ahoo.simba:simba-spring-boot-starter:${simbaVersion}")

Maven

<?xml version="1.0" encoding="UTF-8"?>

<project 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">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>demo</artifactId>
    <properties>
        <simba.version>simbaVersion</simba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>me.ahoo.simba</groupId>
            <artifactId>simba-spring-boot-starter</artifactId>
            <version>${simba.version}</version>
        </dependency>
    </dependencies>
    
</project>

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

JdbcMutexContendService

Kotlin DSL

    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

    implementation("me.ahoo.simba:simba-redis:${simbaVersion}")

Optional-3: ZookeeperMutexContendService

Kotlin DSL

    implementation("me.ahoo.simba:simba-zookeeper:${simbaVersion}")

Examples

Simba-Examples

Usage

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