Я щойно прочитав цю статтю , і я розгублений.
Уявімо собі 1 веб-сервер та 1 окрему програму, яка виступає "працівником", які мають спільну базу даних .
О, я сказав "ділитися" .. але про що попереджає стаття? :
По-четверте, обмін базою даних між додатками (або послугами) - погана річ. Просто надто спокусливо розмістити там аморфний загальний стан, і перш ніж ви дізнаєтесь про це, у вас буде надзвичайно пов'язане чудовисько.
=> не згоден. Є деякі випадки, коли окремі додатки все ще є частиною одного блоку, і тому поняття "проблема з'єднання" в цьому випадку не має сенсу.
Продовжимо: webapp обробляє HTTP-запити клієнта і може в будь-який час оновити деякі агрегати (термін DDD), генеруючи відповідні події домену.
Метою працівника було б обробляти ці події в домені, обробляючи необхідні завдання.
Справа в тому:
Як слід передавати працівникові дані про події?
Першим рішенням, як пропагує прочитана стаття, було б використовувати RabbitMQ, будучи чудовим програмним забезпеченням, орієнтованим на повідомлення.
Робочий процес буде простим:
Щоразу, коли веб-дино генерує подію, вона публікує її через RabbitMQ, яка годує працівника.
Недолік може полягати в тому, що ніщо не гарантує негайну узгодженість між зобов'язаннями сукупного оновлення та публікацією події, не маючи справу з потенційними помилками надсилання… або технічними проблемами; це ще одне головне питання.
Приклад: Можливо, подія була опублікована без успіху сукупного оновлення ... в результаті чого подія представляла помилкове представлення доменної моделі.
Ви можете стверджувати, що глобальна XA (двофазна комісія) існує, але це не рішення, яке відповідає всім базам даних або середнім.
Отже, що може бути хорошим рішенням для забезпечення цієї негайної послідовності? :
IMO, зберігання події в базі даних, в тій же локальній транзакції, що і сукупне оновлення.
Простий асинхронний планувальник створив би і відповідав за запит поточних неопублікованих подій з бази даних та надсилає їх у RabbitMQ, який, у свою чергу, заповнює працівника.
Але навіщо потрібен додатковий планувальник на стороні webapp і до речі: навіщо потрібен RabbitMQ в цьому випадку?
Таким рішенням логічно виявляється, що RabbitMQ може бути непотрібним, тим більше, що база даних спільна.
Дійсно, як би це не було, ми побачили, що негайна послідовність передбачає опитування з бази даних.
Отже, чому працівник не несе відповідальності безпосередньо за це опитування?
Тому мені цікаво, чому так багато статей в Інтернеті критикує ледве чергування баз даних, просуваючи при цьому програмне забезпечення, орієнтоване на повідомлення.
Витяг із статті:
Просте, скористайтеся правильним інструментом для роботи: цей сценарій кричить для системи обміну повідомленнями. Він вирішує всі описані вище проблеми; немає більше опитування, ефективної доставки повідомлень, немає необхідності очищати завершені повідомлення з черг і немає загального стану.
І негайна послідовність, ігнорована?
Підводячи підсумок, насправді здається, що в будь-якому випадку, значить, база даних спільна чи ні, нам потрібно опитування бази даних .
Я пропустив якісь критичні поняття?
Спасибі