Помимо обработки сообщений в правильном порядке, у вас также есть проблема возобновления проекции после ее перезапуска - как вы гарантируете, что начинаете с правильного места при перезапуске?
Самый простой вариант - использовать хранилище событий или брокер сообщений, который одновременно гарантирует порядок и предоставляет какое-то глобальное поле позиции потока (такое как глобальный номер события или упорядоченная временная метка с компонентом устранения неоднозначности, таким как тип временной метки MongoDB). Хранилища событий, куда вы извлекаете события непосредственно из хранилища (например, eventstore.org или доморощенные, созданные на основе базы данных), как правило, гарантируют это. Кроме того, некоторые брокеры сообщений, такие как Apache Kafka, гарантируют порядок (опять же, это основано на запросах). Вы хотите заказать доставку хотя бы один раз, в идеале.
Этот подход ограничивает масштабируемость записи (отлично масштабируется при чтении, используя реплики чтения) - вы можете по-разному разделять потоки между несколькими экземплярами хранилища событий, а затем вам нужно отслеживать положение на основе каждого сегмента, что добавляет сложности. .
Если у вас нет этих гарантий заказа, доставки и размещения, ваша жизнь намного сложнее, и может быть трудно сделать систему полностью надежной. Вы можете:
- Удерживайте сообщения на некоторое время после их получения, прежде чем обрабатывать их, чтобы позволить другим приходить
- Наличие кода для обнаружения пропущенных или вышедших из строя сообщений. Как вы упомянули, это работает только в том случае, если вы получаете все события с глобальным порядковым номером или если вы отслеживаете все номера версий потоков, и даже тогда это не надежно во всех случаях.