1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/HappyChicken-Distributor

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Дистрибьютор (часто используемые распределённые компоненты)

Введение (why)

Распределённые технологии повысили эффективность работы системы, но также создали новые проблемы (например, распределённая блокировка, глобальный уникальный идентификатор и т. д.).

Эти проблемы не могут быть решены напрямую с помощью собственных технологий Java, но они необходимы в распределённой системе.

Дистрибьютор основан на Redis для реализации часто используемых распределённых компонентов, он прост, надёжен и готов к использованию.

Добро пожаловать на мой личный веб-сайт.

Реализация функций (what)

  1. Lock (распределённая блокировка на основе Redis, поддержка повторной блокировки).
  2. Sequence (генератор последовательностей, основанный на алгоритме снежинки и Redis).
  3. Limit (инструмент ограничения потока).
  4. CacheClient (клиент кэширования, в настоящее время поддерживает Redis).
  5. Поддержка использования аннотаций (TODO).

Как использовать (how)

Подробные документы здесь.

Инициализация дистрибьютора:

    // Получение экземпляра
    Distributor distributor = Distributor.getInstance();

    /* Конфигурация подключения (можно выбрать разные способы конфигурации в зависимости от реальной ситуации)
    Можно выбрать различные способы настройки в соответствии с фактическими условиями */

    // Конфигурация 1: хост + порт + пароль (если есть) + конфигурация пула соединений по умолчанию
    distributor.initJedisConfig("xxx", 6379, "");

    // Конфигурация 2: хост + порт + пароль + пользовательская конфигурация пула подключений
    distributor.initJedisConfig(String host, int port, String auth, JedisPoolConfig jedisPoolConfig);

    // Конфигурация 3: пользовательский пул подключений
    distributor.initJedisConfig(JedisPool jedisPool);

Освобождение ресурсов дистрибьютора:

    // Освобождение ресурсов, вызов при завершении использования
    distributor.destory();

Использование блокировки:

    // Получить объект блокировки, указать только имя блокировки
    ILock lock = Distributor.newRedisLock("myLock");
    // Также можно вручную указать срок действия блокировки
    ILock lock = Distributor.newRedisLock("myLock", 2000);

    /* Есть три способа блокировки */

    // 1. Метод lock(), блокируется до тех пор, пока блокировка не будет успешно получена
    String lockId = lock.lock();
    // 2. Метод tryLock(), попытка получить блокировку, возврат через 2 секунды, если не удалось
    String lockId = lock.tryLock();
    // 3. Метод tryLock(long tryLockTime, TimeUnit unit), попытка получения блокировки, указание времени попытки
    String lockId = lock.tryLock(2000, TimeUnit.MILLISECONDS);

    // ----> Обработка бизнес-логики

    // Наконец, снять блокировку
    lock.unLock(lockId);

Создание глобального уникального идентификатора:

    /* Если используется генератор последовательностей на основе алгоритма снежинки, то нет необходимости инициализировать Redis
    Просто создайте его, и вы можете использовать его
Также поддерживается пользовательский рабочий ID и ID центра обработки данных */

    // Метод инициализации 1
    ISequence sequence = Distributor.newSnowflakeSeq();
    // Инициализационный метод 2
    ISequence sequence = Distributor.newSnowflakeSeq(long workerId, long datacenterId);
    // Можно сразу получить id
    long id = sequence.nextId();

    /* Если вы используете генератор последовательностей Redis, вам необходимо сначала инициализировать Distributor
    Вы можете обратиться к примеру инициализации выше, а затем создать его, чтобы использовать */

    // Способ инициализации 1: указать только ключ
    ISequence sequence = Distributor.newRedisSeq("seq");
    // Способ инициализации 2: указать ключ, длину шага, начальное значение
    ISequence sequence = Distributor.newRedisSeq(String key, int step, long stepStart);

Ограничение потока:

    /* Поскольку используется Redis, обратитесь к разделу инициализации для получения экземпляра
И настройте соединение Redis */

    // Получаем ограничитель потока
    ILimit limit = Distributor.newAccessLimit();

    // Ограничение потока, возвращает true, если ограничение потока не превышено, иначе возвращает false
    // Три параметра означают: ключ Redis, количество выполнений за единицу времени, единица времени
    limit.accessLimit("limit", 2, 1)

Тестирование (test)

Код теста можно найти в тестовом классе (src/test).

  • Блокировка: запуск 20 потоков, каждый поток получает блокировку 10 раз, работает нормально без тупика.

Изображение блокировки теста

  • Последовательность:

1. Использование алгоритма снежинки для генерации последовательности, для создания 50W последовательностей требуется примерно 1,2 секунды.

Алгоритм снежинки тестирования

2. Используйте Redis для генерации последовательностей (установите интервал шага равным 5000), подключитесь к удалённому серверу Redis и создайте 50W последовательностей примерно за 0,2 секунды.

Тестирование последовательности Redis

Ссылки на друзей (friends)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/HappyChicken-Distributor.git
git@api.gitlife.ru:oschina-mirror/HappyChicken-Distributor.git
oschina-mirror
HappyChicken-Distributor
HappyChicken-Distributor
master