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

OSCHINA-MIRROR/FishGoddess-Lighter

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

Lighter: объектный кеш-сервис, облегчённая версия

(В настоящее время основная ветка — rebuild. Если есть проблемы с дизайном и стилем кода, пожалуйста, оставьте комментарий.)

Этот проект больше не поддерживается, рекомендуется перейти на переписанную версию Go kafo — 码云 / Github.

В данный момент идёт перестройка на Go! Будет добавлена функция сохранения данных, а также сервис будет преобразован в настоящий распределённый кеш.

  • Ветви master и rebuild представляют собой однопользовательскую версию на Java. Версия для разработки находится в ветке develop и сейчас перестраивается.
  • Используется протокол HTTP, кроссплатформенный и межъязыковой.
  • Может быть напрямую подключён к клиенту или использоваться как первый уровень кеш-сервиса на сервере.
  • Поддерживает пользовательские реализации узлов, по умолчанию поставляется с одним узлом.
  • По умолчанию узел имеет два механизма очистки просроченных элементов: ленивая очистка и очистка часовым.

1. Применение:

  1. В основном используется как кеш объектов с реализацией кеша по умолчанию и поддержкой нескольких узлов, что обеспечивает балансировку нагрузки и распределённое кеширование.
  2. Используется Tuz для контейнеризации (Tuz — это ещё один мой открытый проект: Tuz Resource Container, опубликованный в центральном репозитории Maven), и его технологии IOC и перехватчиков используются для разделения бизнес-логики.
  3. Для сетевого взаимодействия используется Netty, и реализован протокол передачи HTTP.
  4. Все компоненты проекта могут быть настроены, включая реализацию кеша, выбор узла, анализ протокола и сетевой протокол связи. Вам нужно только реализовать простой интерфейс.

2. Использование:

Подробности см. в файле HowToUse.md.

  1. Сначала скачайте сжатый пакет Lighter.

  2. После успешной загрузки вы почти закончили!

    • Как запустить сервис Lighter на Linux?

      a. Используйте команду ls для просмотра загруженных файлов.

      b. Используйте команду tar для распаковки файлов.

      c. После распаковки вы получите каталог. Используйте команду cd, чтобы войти в каталог, и после входа вы увидите три каталога.

      • Сначала посмотрите на каталог bin. Это каталог двоичных файлов, в котором находятся сценарии запуска и остановки службы.

      • Давайте запустим службу!

      • Выполните ./startup.sh, чтобы запустить её. Конечно, мы рекомендуем использовать фоновый режим запуска, как показано на рисунке ниже:

      • Вы можете беспокоиться, что не увидите журнал, если запустите его в фоновом режиме. Не беспокойтесь, позже мы расскажем, где найти журнал.

      • Если вам повезёт, вы увидите значок Lighter:

      • Теперь служба полностью запущена!

      • Обратите внимание: поскольку для запуска требуются права доступа, если вы видите сообщение «нет прав доступа» при запуске, сначала используйте chmod для предоставления прав доступа.

      • Если вы хотите остановить службу, конечно, мы не рекомендуем вам делать это таким образом, но если вы настаиваете, выполните shutdown.sh.

  3. Как запустить службу Lighter на Windows?

    a. Также необходимо загрузить сжатый пакет Lighter, здесь мы не будем повторять его. Распакуйте его в каталог.

    b. Войдите в этот каталог, там также есть три каталога, войдите в каталог bin и дважды щёлкните startup.bat, чтобы запустить его.

    c. Если вам нужно остановить службу, дважды щёлкните shutdown.bat.

  4. Где находится журнал во время работы службы?

    В полученном каталоге есть три каталога: bin, conf и logs.

    Я думаю, вы уже догадались, что журналы хранятся в каталоге logs, они разделены по времени, каждый день — отдельный файл журнала.

    Если вам нужно настроить службу, перейдите в каталог conf, откройте файл config.properties и настройте его.

    Если вы хотите настроить информацию журнала, перейдите в bin/classes, откройте файл logback.xml и настройте его.

Пример запроса:

Полный пример протокола, используемого Lighter, можно найти в HttpProtocol.md.

Этот протокол в настоящее время реализует протокол HTTP и рекомендует использовать стиль Restful для отправки запросов:

  1. Действие get для получения объекта:

    • Пример: http://127.0.0.1:9669/get/testKey
    • testKey — значение ключа объекта.
    • Рекомендуется использовать запрос GET.
    • Примечание: возвращаемое значение представляет собой массив объектов JSON.
  2. Действие set для сохранения объекта:

    • Пример: http://127.0.0.1:9669/set/testKey
    • testKey — значение ключа объекта.
    • Рекомендуется использовать POST-запрос.
    • Рекомендуется использовать Content-Type: application/json;charset=utf-8.
    • Примечание: возвращаемое значение представляет собой массив объектов JSON.

Запрос тела:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4"
}

или:

Любая строка
  1. Действие setAbsent для сохранения только при отсутствии объекта:
    • Пример: http://127.0.0.1:9669/setAbsent/testKey
    • testKey — значение ключа объекта.
    • Только сохранение, когда ключ не существует.
    • Рекомендуется использовать POST-запрос.
    • Рекомендуется использовать Content-Type: application/json;charset=utf-8.
    • Примечание: возвращаемое значение представляет собой массив объектов JSON.

Запрос тела:

{
   "key1": "value1",
   "key2": "value2",
   "key3": "value3",
   "key4": "value4"
}

или:

Любая строка
  1. Действие remove для удаления объекта: Пример: http://127.0.0.1:9669/remove/testKey
    • testKey — значение ключа объекта.
    • Рекомендуется использовать запрос DELETE.
    • Возвращает удалённый объект.

5. Действие exists, проверка существования объекта по ключу: + Пример: http://127.0.0.1:9669/exists/testKey + testKey — значение ключа объекта. + Рекомендуется использовать GET-запрос. + Ответ: true, если ключ существует.

6. Действие expiredTime, определение времени жизни объекта по ключу: + Пример: http://127.0.0.1:9669/expiredTime/testKey + testKey — значение ключа объекта. + Рекомендуется использовать GET-запрос. + Значение ответа: + -2 — ключ не существует или уже истёк срок его действия. + -1 — этот ключ никогда не истечёт. + положительное число — время жизни ключа, больше 0. Когда это значение становится равным 0, ключ считается истёкшим.

7. Действие lighter, получение информации о работе сервиса Lighter: + Пример: http://127.0.0.1:9669/lighter/info + В настоящее время поддерживаются ключи, значения, numberOfKeys и info. + info — информация о системе, включая функции нескольких системных действий. + Рекомендуется использовать GET-запрос. + Ответ — системная информация.

{
  "code": 0,
  "data": [
    {
      "keys": {
        "node_15": [],
        "node_14": [],
        "node_0": [],
        "node_1": [],
        "node_2": ["tehjhs"],
        "node_3": ["bsdf"],
        "node_4": [],
        "node_5": [],
        "node_13": ["gdsgas"],
        "node_6": ["%E5%B9%BF%E6%B3%9B%E7%9A%84%E5%99%B6"],
        "node_12": ["tyret"],
        "node_7": [],
        "node_11": ["gdsa"],
        "node_8": [],
        "node_10": [],
        "node_9": ["ghfdhfd"]
      },
      "values": {
        "node_15": [],
        "node_14": [],
        "node_0": [],
        "node_1": [],
        "node_2": "{  \"key1\": \"value1\",  \"key2\": \"value2\"}",
        "node_3": "{  \"key1\": \"value1\",  \"key2\": \"value2\"}",
        "node_4": [],
        "node_5": [],
        "node_13": "{  \"gsda\": \"gsdfga\",  \"风格的yrtruhjm放大\": \"gdfgad灌水广\"}",
        "node_6": "{  \"key1\": \"value1\",  \"key2\": \"value2\"}",
        "node_12": "{  \"key1\": \"value1\",  \"key2\": \"value2\"}",
        "node_7": [],
        "node_11": "{  \"key1\": \"value1\",  \"风格的放大\": \"gdfgad灌水广\"}",
        "node_8": [],
        "node_10": [],
        "node_9": "{  \"key1\": \"value1\",  \"key2\": \"value2\"}"
      },
      "numberOfKeys": {
        "total": 7,
        "details": {
          "node_15": 0,
          "node_14": 0,
          "node_0": 0,
          "node_1": 0,
          "node_2": 1,
          "node_3": 1,
          "node_4": 0,
          "node_5": 0,
          "node_13": 1,
          "node_6": 1,
          "node_12": 1,
          "node_7": 0,
          "node_11": 1,
          "node_8": 0,
          "node_10": 0,
          "node_9": 1
        }
      },
      "numberOfNodes": 16
    }
  ],
  "msg": "Done",
  "success": true
}

3. Используемые зависимости:

<properties>
    <tuz.version>0.6.6-FINAL</tuz.version>
    <netty.version>4.1.33.Final</netty.version>
    <fastjson.version>1.2.56</fastjson.version>
    <logback.version>1.2.3</logback.version>
</properties>

i. Tuz используется как контейнер для всего проекта, с применением технологий IOC и перехватчиков. ii. Netty используется в качестве сетевого коммуникационного модуля для всего проекта, используя NIO для сетевых услуг. iii. FastJson используется как часть протокола разбора, являясь библиотекой для разбора JSON-протокола. iiii. LogBack используется как модуль логирования проекта, применяя интерфейс SLF4J для подключения.

4. Архитектура проекта:

  • Тестирование производительности:

    • Аппаратное обеспечение компьютера:

    firstTest.png

    • Однократная операция, 1000 потоков, 100 000 запросов, пропускная способность: в среднем 11 000 операций в секунду.

    firstTest.png

    firstTest.png

    • Смешанные операции, несколько основных операций выполняются одновременно, 1000 потоков, 100 000 запросов, средняя пропускная способность составляет 8000 операций в секунду.

    firstTest.png

Конкретные тестовые файлы находятся в папке images и представляют собой JMeter-тест Lighter.jmx. Это план тестирования.

  • Конкретные настройки файла можно найти в resources/conf/config.properties. Lighter 服务配置文件 v1.3.3

Lighter 服务配置文件 v1.3.3

Ниже приведена конфигурация, предназначенная для настройки Lighter-сервиса. Если такой необходимости нет, не следует вносить изменения в файл.

2019-4-15 Вода без рыбы

Сервер слушает порт

Этот порт используется встроенным сервером для связи и по умолчанию реализуется с помощью Nio-сервера Netty.

server.port=9669

Порт закрытия сервера

Поскольку сервер работает и блокируется в ожидании, необходимо использовать сетевое взаимодействие для закрытия сервера.

По умолчанию будет запущен поток мониторинга, который закроет сервер, как только обнаружит соединение клиента на этом порту.

server.closePort=9999

Инициализатор сервера

Конкретный сетевой режим, используемый этим сервером для взаимодействия с клиентом, также может быть настроен.

Вы можете создать собственный инициализатор сервера для реализации желаемого способа связи.

Однако, поскольку весь сервер использует Netty для связи, если вы планируете переписать этот инициализатор сервера,

рекомендуется иметь опыт программирования с использованием Netty, иначе это может привести к недоступности сервиса.

Кроме того, поскольку по умолчанию используется HTTP-протокол, при запросе может генерироваться большое количество избыточной информации.

Это может привести к потере сетевых ресурсов при высоком уровне параллелизма.

С точки зрения использования, HTTP-протокол более удобен, и он обеспечивает кроссплатформенность, межъязыковую совместимость и высокую степень совместимости.

Поэтому HTTP-протокол был выбран в качестве протокола приложения по умолчанию.

ChannelInitializer=cn.com.fishin.lighter.net.http.HttpServerInitializer

Анализатор протокола

Когда клиентский запрос получен, его необходимо проанализировать в объект задачи и предоставить исполнителю задач для выполнения.

Можно настроить анализатор протоколов для реализации специальных бизнес-анализов или собственных протоколов.

Вам нужно только реализовать интерфейс cn.com.fishin.lighter.protocol.RequestParser,

а затем переопределить метод parse, чтобы вернуть объект задачи после анализа запроса клиента.

RequestParser=cn.com.fishin.lighter.protocol.http.HttpRequestParser

Свойства пула потоков

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

Обратите внимание: для внесения изменений в свойства пула потоков в JDK требуется понимание работы пулов потоков.

Подробнее см. java.util.concurrent.ThreadPoolExecutor.

Исполнитель задач использует пул потоков для выполнения задач. Вы можете установить количество основных и максимальных потоков в пуле.

Эти значения должны соответствовать производительности системы и уровню параллелизма конкретного бизнеса.

В JVM можно настроить размер стека потоков, что влияет на количество доступных потоков.

corePoolSize=8 maximumPoolSize=64

Время жизни потока должно быть примерно равно времени выполнения задачи, так как эти задачи обычно выполняются быстро.

Рекомендуется устанавливать значение вдвое больше времени выполнения задачи для повторного использования большого количества потоков.

keepAliveTime=30

Размер очереди ожидания и стратегия отказа очереди обычно связаны. Когда очередь заполнена, будут созданы новые потоки.

Когда количество потоков достигнет максимального значения, пул выполнит стратегию отказа.

Поскольку Lighter является сервисом кэширования объектов, разрешены промахи кэша.

waitQueueSize=4096 RejectedExecutionHandler=cn.com.fishin.lighter.core.DefaultRejectedExecutionHandler

Количество узлов

Lighter-сервер поддерживает управление несколькими узлами, каждый из которых представляет собой отдельный сервер или кластер.

Не следует устанавливать слишком большое количество узлов, оно должно соответствовать требованиям бизнеса.

Если бизнесу требуется большое количество узлов, вы можете настроить большее количество.

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

numberOfNodes=16

Класс реализации узла

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

Постарайтесь максимально адаптировать реализацию к бизнес-сценарию, так как универсальная реализация не может удовлетворить все сценарии, особенно в отношении производительности.

Данные хранятся с использованием java.util.concurrent.ConcurrentHashMap по умолчанию для обеспечения безопасности параллельного доступа.

Чтобы предотвратить расширение данных, приводящее к снижению производительности при большом объёме данных, начальное значение было скорректировано в коде.

Node=cn.com.fishin.lighter.core.node.DefaultNode

Выбор узла

При получении задачи необходимо выбрать узел для её выполнения с помощью этого выбора узла.

Существует две встроенные реализации по умолчанию: балансировщик нагрузки и выбор ключа хеширования.

Балансировщик нагрузки выполняет задачи на всех узлах. Поскольку данные кэша не требуют строгой согласованности,

балансировка нагрузки здесь не использует высокую масштабируемость, то есть, если один из серверов выйдет из строя, другие серверы не заметят этого.

Даже если выполнение не будет успешным, повторных попыток не будет, что может привести к несогласованности данных на всех серверах.

Выбор ключа хеширования использует алгоритм хеширования для распределения задач по различным узлам.

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

Вероятность сбоя в реализации узла по умолчанию невелика, но она существует, если используется пользовательская реализация, такая как Redis.

NodeSelector=cn.com.fishin.lighter.core.selector.KeyHashNodeSelector

Разрешить доступ к хостам домена службы

Необходимо настроить этот заголовок ответа HTTP, чтобы разрешить доступ только к указанным хостам.

AccessControlAllowOrigin=*

Интервал очистки просроченных ключей, в секундах

Этот параметр применим только к реализации узла по умолчанию. Из-за устаревших данных в памяти,

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

Значение не должно быть слишком маленьким, иначе сервис превратится в сервис очистки.

GcPerSecond=60

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

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

Введение

Lighter — это легковесное промежуточное ПО для сервисов кэширования объектов. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

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

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