Кафка проверяет сообщения в состоянии с обработкой
У меня есть приложение, в котором несколько пользователей могут отправлять операции REST для изменения состояния общих объектов. Когда объект модифицируется, происходит несколько действий (БД, аудит, ведение журнала...).
Не все операции действительны, например, вы не можете изменить объект после его удаления.
Используя Кафку, я думал о следующей архитектуре:
- Остальные операции стоят в очереди в теме Кафки.
- Операции над одним и тем же объектом идут в один и тот же раздел. Таким образом, все операции объекта будут в последовательности и обработаны потребителем
- Потребители прослушивают раздел и проверяют операцию, используя базу данных в памяти
- Если операция была действительной, то отправляется в "Действительную тему операции", в противном случае отправляется в "Недопустимая тема операции"
- Другие потребители (DB, Log, Audit) прослушивают "Действительная тема"
Я не очень уверен насчет пункта № 3. Мне не нравится идея сохранять состояние всех моих объектов. (Уменя есть миллиарды объектов, и даже если объект может иметь размер 10 МБ, то, что мне нужно сохранить, чтобы проверить его состояние, это всего лишь несколько Кбайт...)
Тем не менее, это общая картина? В противном случае, как вы можете проверить достоверность определенных операций?
И что бы вы использовали в качестве базы данных в памяти? Конечно, он должен быть высокодоступным, отказоустойчивым и поддерживать транзакции (чтение и запись).
1 ответ
Я полагаю, что это очень правильный шаблон и, по сути, является вариацией шаблона CQRS, полученного из событий.
Например, Lagom реализует свою устойчивость CQRS очень похожим образом (хотя и на основе совершенно другого набора инструментов)
Несколько моментов:
- вы правы относительно необходимости последовательных операций: поскольку все ваши мутации состояния должны основываться на результате предыдущей мутации, в их выполнении должен быть строгий порядок. Это очень часто имеет место для таких вещей, поэтому мы хотели бы иметь возможность масштабировать эти операции как можно более горизонтально, чтобы каждая из этих последовательностей выполнялась параллельно со многими другими последовательностями. В вашем случае у нас есть одна такая последовательность на общий объект.
Хорошим способом для этого является использование разделов Kafka по ключам (при условии, что вы не установили
max.in.flight.requests.per.connection
выше значения по умолчанию 1). Здесь снова Lagom имеет аналогичный подход, так как их постоянная сущность распределена и однопоточна. Я не говорю, что Лагом лучше, я просто успокаиваю вас тем, что подход используется другими:)Ключевым аспектом вашего паттерна является преобразование Команды в Событие: в этом жаргоне команда рассматривается как запрос на воздействие на состояние и может быть отклонена по разным причинам. Событие - это описание обновления состояния, которое произошло в прошлом, и оно неопровержимо с точки зрения тех, кто его получает: событие всегда говорит правду. Процесс, который вы описываете, будет контроллером, который находится на границе между ними: он отвечает за преобразование команд в события.
- В этом смысле "Правильная тема работы", которую вы упоминаете, будет источником событий, описывающих обновления состояния вашего процесса. Так как все это поддерживается Kafka, оно будет произвольно разделено и, следовательно, масштабируемо, что потрясающе:)
- Не беспокойтесь о размере всего вашего объекта, он должен где-то сидеть. Поскольку у вас есть этот контроллер, который преобразует команды в события, он становится основным источником истины, относящейся к этому объекту, и этот отвечает за его хранение: этот контроллер обрабатывает основное хранилище для ваших событий, поэтому вы должны освободить место для Это. Вы можете использовать хранилище значений ключей Kafka Streams: они локальны для каждого вашего экземпляра обработки, хотя, если вы сделаете их постоянными, у них не возникнет проблем с обработкой данных, значительно превышающих доступную оперативную память. За кулисами данные попадают на диск благодаря RocksDB, а еще больше за кулисами - все происходит из событий, связанных с темой kafka, поэтому ваше хранилище состояний копируется и при необходимости будет прозрачно воссоздано на другом компьютере.
Я надеюсь, что это поможет вам завершить ваш дизайн:)