Архитектура сервисов на блокчейне Minter

Архитектура сервисов на блокчейне Minter

webcounters
Архитектура сервисов на блокчейне Minter

Всё начинается с нод и простейших балансеров или шлюзов для HTTP API и gRPC. Далее парсер событий (транзакции, ивенты) загоняет все данные в RabbiMQ с нужными ключами в нужные топики, которые играют ключевую роль в распределении (minter-amqp) событий на все сервисы. Большинство сервисов получают информацию о нужных им событиям от сервера RabbitMQ, что экономит массу трафика и системных ресурсов.В качестве примера разберём телеграм бота нотификации событий блокчейна. Бот получает от RabbitMQ все метаданные (откуда, кому, какие монеты, тип транзакции и т.д.) событий и в случае совпадения с пользовательскими отслеживания делает запрос конкретной транзакции в API. Так же бот заранее сохраняет некоторую информацию по типу id ордера, чтоб по ней выдать более информационное сообщение, чем можно получить из определённой транзакции. Таких мелочей полно, но это уже другая история.

Так-же и прочие сервисы: сервис авторизации получает только транзакции с payload на один кошелёк, торговый бот-аудитор и сервис API мульти-трейда все торговые транзакции (ордера, купля/продажа и т. д.), защита валидатора второго типа только блоки с пропусками подписи, сервис статуса всю мета-информацию по типу ТГ бота,

Дискорд бот пошёл дальше и получает более высокоуровневую информацию используя сервис статуса по gRPC и HTTP, что убирает какие-либо постоянные соединения и как следствие нагрузку. Подробнее тут.

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

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


Немного о коде

Сервисы написаны на Kotlin, TypeScript, Javascript и даже PHP. Отдельное внимание уделяю моему Kotlin SDK, который уже скорее фреймворк для построение приложений, так-как приводит все данные в нужный формат и тип, что избавляет от хождение по сырому Json и находит ошибки на этапе компиляции, а точнее даже прямо в IDE. Так-же уже приватно существует SDK на TypeScript с теми-же преимуществами, но с ограниченным количеством методов (делаю только то что нужно для продукта). Напомню что все SDK работают по HTPP и gRPC без переписывания кода. А значит и все сервисы могут работать по обоим протоколам. Некоторый открытый код по Minter можно посмотреть тут.

RabbitMQ, Kafka, ArangoDB всё реплицируемое, масштабируемое и кластеризуемое из коробки, что в перспективе обеспечивает бескомпромиссную надёжность всей инфраструктуре.


И напоследок козырь!

Сервисы можно разбросать даже по разным географическим зонам и это будет работать так-же эффективно. Сервера/VPS с ограничение трафика? не беда, так-как минимизируется трафик за счёт amqp событий от RabbitMQ и/или «сервиса статуса».

Большинство сервисов можно запускать в докере, в том числе в режиме Docker Swarm, а значит и в Kubernetes. Имеют возможность к подгрузке конфига и чтение секретов для безопасного запуска в публичных облаках.
Благодаря этому я могу за минуту, в случае необходимости отдать ресурсы любого компьютера с установленным докером

Для разработки и отладки удобно: один Yaml файл или длинная команда и компьютер с докером уже содержит полноценную копию сервиса или группы сервисов, с которой можно безопасно работать. Обновлять и устанавливать стало ещё проще.

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

P/s Изображение стоящего человека означает доступность сервиса для конечного пользователя.


Поддержка: @webcounters_chat, @WebCountersBot (приватно)
Паблик: @webcounters_public




Report Page