Всем привет,
возникла необходимость в передаче сообщений от одного приложения к другому.
Схема такая: есть основное приложение (WCF-сервис на IIS), в котором работает бизнес-логика, время от времени ей нужно запульнуть сообщение о каком-то событии в другое приложение. То другое приложение как-то обрабатывает такие сообщения, там своя логика.
Первым решением данной задачи было использовать RPC: приложение-приёмник было реализовано самостоятельным WCF-сервисом, а запуливание сообщения сводилось к вызову его метода.
У этого решения есть ряд недостатков, самым важным из которых оказалось отсутствие поддержки транзакций: вызов происходил внутри транзакции, которая после вызова могла откатиться, в итоге приложение-приёмник получало недействительное сообщение.
Вариант использовать распределённые транзакции не рассматривается как слишком дорогой и не необходимый, т.к. не требуется чтобы сообщение было обработано в одной транзакции с основной бизнес-операцией.
Подумав, пришли к выводу что нужен какой-то механизм, реализующий следующее поведение:
— основное приложение бросает событие на шину в рамках транзакции
— если транзакция завершилось успехом, то сообщение попадает в какую-то персистентную очередь
— из этой очереди в фоновом режиме сообщение передаётся другому приложению для обработки
— передача должна исключать потерю сообщений и их повторную обработку
Есть мнение что эта задача неуникальна и что-то такое уже давно реализовано. В голову приходят всякие ESB, но опыта работы с ними ни у кого в команде нет.
Прошу совета — какие готовые решения посмотреть? Естественно, интересуют максимально удовлетворяющие заявленным требованиям.
В идеале видится такой компонент, который умеет складывать (с учётом существующей транзакции) сообщения в указанную ему таблицу базы SQL Server, а потом как-то доставлять их обработчикам в другом процессе.