Софт

Sequin - поток сообщений с открытым исходным кодом, построенный на Postgres

Sequin - поток сообщений с открытым исходным кодом, построенный на Postgres

Sequin - это инструмент для захвата изменений и потоковой передачи данных из базы данных Postgres, гарантирующий однократную обработку. Что это значит?

Sequin использует журнал записи Postgres (WAL) для преобразования его в поток или очередь сообщений, обеспечивая более эффективную альтернативу Kafka и Simple Queue Service (SQS). Это означает, что вы можете:

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

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

В первом случае Sequin выступает в качестве замены:

  • триггеры Postgres
  • SQS
  • крючки ORM
  • события WAL

а во втором - как замена:

  • Kafka
  • COPY
  • Ручная синхронизация

В любом случае ему удается заменить многие случаи самостоятельной или сложной настройки, например, с использованием Kafka или Debezium, одним всеобъемлющим сервисом.

Для потоковой передачи данных с помощью Sequin вы создаете «последовательности» для каждой таблицы, которую вы хотите передавать, чтобы на другом конце вы могли использовать эти строки из последовательности с помощью клиентов, работающих с HTTP Push, например Webhooks, или HTTP Pull, например SQS. Sequin заботится и о клиентах, поскольку позволяет создавать их внутри платформы, гарантируя однократную обработку.

По этому поводу можно сказать, что хотя ни одна система не может гарантировать доставку «точно в один раз», доставка «хотя бы в один раз» и обработка «точно в один раз» могут работать вместе:

Обработка - это полный жизненный цикл сообщения: сообщение было доставлено получателю, получатель выполнил свою работу, а затем получатель подтвердил сообщение.

При таком определении SQS, Kafka и Sequin - это системы, которые гарантируют обработку точно в одно и то же время. Термин «обработка» включает в себя как доставку сообщения, так и его успешное подтверждение; «обработка точно в один раз» означает, что это система обмена сообщениями, в которой доставка и подтверждение происходят как минимум один раз.

Практически, при использовании Sequin :

  • Вы никогда не пропустите ни одной строки или изменения: Sequin гарантирует, что все изменения в базе данных будут доставлены и обработаны потребителями ровно один раз.
  • Вы получаете маршрутизацию на основе SQL: Фильтруйте и направляйте сообщения потребителям с помощью условий SQL where.
  • Вы можете перемотать потребителей к любой строке таблицы. Или повторно опубликовать выбранные сообщения, соответствующие SQL-запросу.
  • Возможность запуска из любого места: Потребители могут начать обработку строк с любой точки таблицы.
  • Возможность написания приложений: вам не придется использовать хранимые процедуры и триггеры для определения бизнес-логики вашего приложения, поскольку потребители могут быть написаны на выбранном вами языке.

Отклоняясь от обычной практики расширения функциональности Postgres с помощью расширений, Sequin предлагает образ Docker с веб-консолью/интерфейсом для настройки, который можно запустить рядом с базой данных Postgres. Он работает с любой базой данных Postgres версии 12+ и выше.

Конечно, это open source, поэтому самый простой способ начать работу - это взять файл docker/docker-compose.yaml из репозитория, который содержит экземпляр Postgres и Redis, а также сервер Sequin. Обратите внимание, что Sequin также предлагается в качестве облачного сервиса.

Поскольку Sequin написан на языке Elixir, существует также сопутствующий легкий Elixir SDK для отправки, получения и подтверждения сообщений в потоках Sequin. Используя его, пример отправки, получения и подтверждения сообщений в потоках Sequin выглядит следующим образом:

Я оставил самые интересные функции, которые еще предстоит анонсировать, - трансформации; то есть вы можете преобразовывать полезную нагрузку сообщений, написав функции на Lua, JavaScript или Go, прежде чем они будут доставлены вашим потребителям. Это полезно для преобразования данных в формат, более подходящий для принимающей стороны приложения.

То есть вместо того, чтобы конечная точка вашего приложения потребляла json в формате wal2json (выходящем из Sequin), вы можете написать код, который преобразует пакет в пользовательский формат, с которым ваше приложение сможет работать до того, как он выйдет из Sequin.

Напротив, мне пришлось пройти через трудности, когда я вручную реализовывал функциональность CDC/Webhook, которая включала сложный конвейер триггеров, событий базы данных и кода преобразования Perl под управлением Ingres dbms, чтобы преобразовать и манипулировать данными, собранными SQL-запросами, в пакеты HL7, прежде чем они автоматически отправлялись в веб-сервис в конце конвейера. То есть GUI/App-->Enter Data-->SQL-->HL7-->Web Service, автоматически при вводе значения. Прочитайте статью «Connecting To The Outside World with Perl and Database Events», если хотите узнать, как это было сделано.

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

Читайте также