Exactly once передача данных без материализации Архитектуры, масштабируемость

Доклад принят в программу конференции
Юрий Печатнов
Яндекс

Занимаюсь высоконагруженными реалтаймовыми процессингами

Тезисы

Доклад будет о том, как мы научились более эффективно передавать данные между нашими сервисами.
С сохранением exactly once и отказоустойчивости мы уменьшили материализацию потока промежуточных данных на дисках на 90% и примерно на столько же снизили latency.

Подробнее на простом примере:
Пусть у нас есть много входных очередей (например, kafka) с событиями, каждое событие содержит идентификатор стейта StateId и относится к соответствующему стейту. И мы хотим в реальном времени считать аггрегаты произвольной сложности (= обновлять стейты) по входным событиям с семантикой exactly once.
Для эффективной работы такой схемы для обновления стейтов в хранилище нужна какая-то локальность по ключам, поэтому входные данные нужно сначала пошардировать примерно так же, как шардированы данные в хранилище.
Тогда в этом простом случае получается, что нужно два сервиса: один читает входные события и пишет их в промежуточную очередь пошардированно (resharder), другой читает уже шардированные события и обновляет стейты в соответствии с ними (aggregator).
Что плохо в этой схеме? В том, что весь поток событий необходимо писать через промежуточную очередь, а это большой поток на записи на диски и соответственно много железа! А ведь еще есть небольшая задержка.

То есть мы решаем проблему: как передать данные от resharder'а arrgegator'у с наименьшей материализацией на дисках, с наименьшими задержками и при этом отказоустойчиво и с exactly once.

Другие доклады секции Архитектуры, масштабируемость