Lignum: распределенная очередь сообщений

Nov 24 2022
В промежутках между всей путаницей WFH и изолированной ситуацией я решил изучить распределенные блокировки с помощью Consul, простая тестовая программа вскоре стала путем к созданию распределенной очереди сообщений под названием Lignum. Это вводная статья об очереди сообщений Lignum.

В промежутках между всей путаницей WFH и изолированной ситуацией я решил изучить распределенные блокировки с помощью Consul, простая тестовая программа вскоре стала путем к созданию распределенной очереди сообщений под названием Lignum .

Обзор Лигнум

Это вводная статья об очереди сообщений Lignum.

Что такое распределенная система?

Существует множество определений, простой поиск в Google даст несколько ответов. Я могу определить распределенную систему как набор автономных или отдельных программ или систем, которые работают для достижения общей цели.

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

Что такое очередь сообщений?

Система, которая предоставляет структуру данных очереди для других служб, чтобы читать и записывать сообщения в порядке FIFO.
Очередь позволяет службе-производителю писать сообщения, а потребителю — асинхронно потреблять. Производитель и потребитель не должны знать друг друга.

очередь сообщений

Две основные характеристики очереди сообщений:

  1. Тема
    Сообщения отправляются в именованный буфер, они называются темами. Мы производим и потребляем сообщения из темы.
  2. Сообщение
    Это фактическое сообщение, которое мы пишем в тему для других.

Что такое распределенная очередь сообщений?

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

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

  1. Надежность и высокая доступность
  2. Отказоустойчивость
  3. Спектакль
  4. Разделение нагрузки чтения с несколькими узлами

Lignum был запущен как тестовая программа для изучения распределенной блокировки с использованием Consul session lock , которая начала разворачиваться в сторону очереди сообщений, когда я в то время работал над Kafka.
Это написано на Go. Я начал его с разработки через тестирование, но вскоре все закончилось беспорядком.

Лигнум Архитектура

Lignum — это не полноценная очередь сообщений, над ней ведется работа. Ты можешь

  • Отправляйте сообщения в тему
  • Потреблять сообщения из темы
  • Сообщение реплицируется на все узлы, то есть любой узел может использоваться для чтения сообщения из темы.
  • Сохранять сообщения на диске
  • Lignum может работать в кластерном режиме без специальной настройки
  • Управление кластером облегчается Consul с блокировкой сеанса.
  • Каждый узел будет подключаться к Consul, чтобы получить лидера. Если лидер не найден, один из узлов будет выбран в качестве лидера.
  • Все остальные узлы зарегистрируют себя как последователи лидера.
  • Сообщение, отправленное ведущему, будет реплицировано на узел-последователь.
  • Он имеет два режима репликации
    : а. репликация WAL
    б. Живая репликация
  • Если лидер проигрывает, любой из последователей избирается лидером.

В настоящее время lignum реализует два режима стратегии репликации.

  1. репликация WAL
  2. Живая репликация.

репликация WAL

Файл журнала создается для каждой темы, когда сообщение превышает размер буфера, определенный в config( message.initial-szie-per-topic). Lignum создает файл WAL( .qwal) для каждой темы. Когда количество сообщений достигает размера буфера, этот файл сбрасывается на диск как logфайл. Lignum часто следит за созданием этих файлов журнала и отправляет подписчикам. Все последователи периодически синхронизируются с лидером, обеспечивая консистентность в конечном счете или с задержкой.

Живая репликация

Это потоковая репликация, когда подписчик уже зарегистрирован у лидера, нам не нужно беспокоиться о синхронизации сообщений, если тема создана после. Мы можем просто пересылать сообщения, полученные в лидере, как последователю. В этой стратегии сообщения отправляются зарегистрированному подписчику немедленно. Таким образом, Lignum может обеспечить сильную консистенцию.

Как запустить Лигнум

  • Обязательное условие
    — Consul
    . Вы можете использовать Dockerfile, как указано в README .
  • Клонировать репозиторий
  • https://github.com/NishanthSpShetty/lignum.git
    

  • update config.yml, вы можете обратиться к этой документации для получения более подробной информации о конфигурациях.
  • бегmake run
  • Отправить сообщение
  • curl --request POST \
      --url http://localhost:8080/api/message \
      --header 'Content-Type: application/json' \
      --data '{
       "topic": "test",
       "message":"this is a test message"
       }'
    

    curl --request GET \
      --url http://localhost:8080/api/message \
      --header 'Content-Type: application/json' \
      --data '{
       "topic": "test",
       "from": 0,
       "to": 3
       }'
    

Какую гарантию доставки он предлагает?
Поскольку сообщения сохраняются и потребитель может прочитать любое смещение в любое время, гарантия доставки лежит на потребителе. Lignum гарантирует порядок сообщений.

Давайте добавим узел в существующий кластер

  • Измените конфигурацию в соответствии с вашим хостом.
  • Если вы работаете на том же хосте, что и предыдущий запуск, измените значения порта, каталога данных и порта репликации в файле конфигурации.
  • Бегmake run

Это краткое введение в Lignum. Я придумаю отдельный документ о его внутренностях и деталях разработки в будущем.

Код находится на Github: Lignum .

Оформить заказ и оставить отзыв, вклады приветствуются.

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

Свяжитесь со мной в LinkedIn

https://www.linkedin.com/in/nishanthspshetty/