LMAX Disruptor обычно реализуется с использованием следующего подхода:
Как и в этом примере, Replicator отвечает за репликацию входных событий\команд на подчиненные узлы. Репликация через набор узлов требует от нас применения алгоритмов консенсуса на тот случай, если мы хотим, чтобы система была доступна при сбоях в сети, отказах главного и подчиненных устройств.
Я думал о применении алгоритма консенсуса RAFT к этой проблеме. Одно наблюдение заключается в следующем: «RAFT требует, чтобы входные события\команды сохранялись на диск (долговременное хранение) во время репликации» (см. эту ссылку)
Это наблюдение, по сути, означает, что мы не можем выполнять репликацию в памяти. Следовательно, кажется, что нам, возможно, придется объединить функциональные возможности репликатора и журнала, чтобы иметь возможность успешно применять алгоритм RAFT к LMAX.
Есть два варианта сделать это:
Вариант 1. Использование реплицированного журнала в качестве очереди входных событий
- Получатель будет считывать из сети и помещать событие в реплицированный журнал вместо кольцевого буфера.
- Отдельный «читатель» может читать журнал и публиковать события в кольцевом буфере.
- Журнал может быть реплицирован между узлами с помощью RAFT. Нам не нужны репликатор и журналлер, так как функциональность уже реализована в реплицированном журнале RAFT.
Я думаю, что недостаток этого варианта связан с тем, что мы делаем дополнительный шаг копирования данных (получатель в очередь событий вместо кольцевого буфера).
Вариант 2: Используйте Replicator для передачи входных событий\команд в файл журнала ввода подчиненного устройства
Мне интересно, есть ли другое решение для дизайна Replicator? Какие различные варианты конструкции репликаторов люди использовали? В частности, любой дизайн, который может поддерживать репликацию в памяти?