Я только что прочитал эту статью , и я в замешательстве.
Давайте представим 1 веб-приложение и 1 отдельное приложение, выступающие в роли «работника», которые совместно используют одну и ту же базу данных .
О, я сказал "делиться" .. но о чем статья предупреждает? :
В-четвертых, разделение базы данных между приложениями (или службами) - это плохо. Просто слишком заманчиво помещать аморфное общее состояние туда, и, прежде чем вы это узнаете, у вас будет чудовищно связанный монстр.
=> не согласен. В некоторых случаях отдельные приложения все еще являются частью одного и того же устройства, и, следовательно, понятие «проблема соединения» не имеет смысла в этом случае.
Давайте продолжим: веб-приложение обрабатывает клиентские HTTP-запросы и может в любое время обновлять некоторые агрегаты (термин DDD), генерируя соответствующие доменные события.
Целью работника будет обработка этих событий домена путем обработки необходимых заданий.
Дело в том:
Как данные о событиях должны быть переданы работнику?
Первое решение, о котором говорится в прочитанной статье, заключается в использовании RabbitMQ, являющегося отличным промежуточным программным обеспечением, ориентированным на сообщения.
Рабочий процесс будет простым:
Каждый раз, когда веб-dyno генерирует событие, оно публикует его через RabbitMQ, который передает работнику.
Недостатком было бы то, что ничто не гарантирует немедленной согласованности между фиксацией совокупного обновления и публикацией события, не имея дело с потенциальными сбоями отправки ... или аппаратными проблемами; это еще одна главная проблема.
Пример. Возможно, что событие было опубликовано без успешного обновления агрегата ... что привело к событию, представляющему ложное представление модели предметной области.
Можно утверждать, что глобальная XA (двухфазная фиксация) существует, но это не решение, которое подходит для всех баз данных или промежуточного программного обеспечения.
Итак, что может быть хорошим решением для обеспечения этой немедленной согласованности? :
IMO, хранящий событие в базе данных, в той же локальной транзакции, что и сводное обновление.
Будет создан простой асинхронный планировщик, который будет отвечать за запросы текущих неопубликованных событий из базы данных и отправлять их в RabbitMQ, который, в свою очередь, заполняет рабочий.
Но зачем нужен дополнительный планировщик на стороне веб-приложения и, между прочим, зачем нужен RabbitMQ в этом случае?
При таком решении кажется логичным, что RabbitMQ может быть ненужным, особенно потому, что база данных является общей.
Действительно, как бы то ни было, мы увидели, что немедленная согласованность предполагает опрос из базы данных.
Таким образом, почему работник не будет нести ответственность непосредственно за этот опрос?
Поэтому мне интересно, почему так много статей в Интернете критикует организацию очередей баз данных, в то время как продвигает промежуточное ПО, ориентированное на сообщения.
Выдержка из статьи:
Просто, используйте правильный инструмент для работы: этот сценарий требует системы обмена сообщениями. Это решает все проблемы, описанные выше; больше нет опроса, эффективной доставки сообщений, нет необходимости удалять завершенные сообщения из очередей и нет общего состояния.
А немедленная согласованность игнорируется?
Подводя итог, действительно кажется, что в любом случае, то есть с базой данных, совместно используемой или нет, нам нужен опрос базы данных .
Я пропустил некоторые критические понятия?
Благодарность