Посоветуйте ServiceBus
От: Poul_Ko Казахстан  
Дата: 12.04.17 15:47
Оценка:
Всем привет,
возникла необходимость в передаче сообщений от одного приложения к другому.

Схема такая: есть основное приложение (WCF-сервис на IIS), в котором работает бизнес-логика, время от времени ей нужно запульнуть сообщение о каком-то событии в другое приложение. То другое приложение как-то обрабатывает такие сообщения, там своя логика.

Первым решением данной задачи было использовать RPC: приложение-приёмник было реализовано самостоятельным WCF-сервисом, а запуливание сообщения сводилось к вызову его метода.
У этого решения есть ряд недостатков, самым важным из которых оказалось отсутствие поддержки транзакций: вызов происходил внутри транзакции, которая после вызова могла откатиться, в итоге приложение-приёмник получало недействительное сообщение.
Вариант использовать распределённые транзакции не рассматривается как слишком дорогой и не необходимый, т.к. не требуется чтобы сообщение было обработано в одной транзакции с основной бизнес-операцией.

Подумав, пришли к выводу что нужен какой-то механизм, реализующий следующее поведение:
— основное приложение бросает событие на шину в рамках транзакции
— если транзакция завершилось успехом, то сообщение попадает в какую-то персистентную очередь
— из этой очереди в фоновом режиме сообщение передаётся другому приложению для обработки
— передача должна исключать потерю сообщений и их повторную обработку

Есть мнение что эта задача неуникальна и что-то такое уже давно реализовано. В голову приходят всякие ESB, но опыта работы с ними ни у кого в команде нет.


Прошу совета — какие готовые решения посмотреть? Естественно, интересуют максимально удовлетворяющие заявленным требованиям.


В идеале видится такой компонент, который умеет складывать (с учётом существующей транзакции) сообщения в указанную ему таблицу базы SQL Server, а потом как-то доставлять их обработчикам в другом процессе.
Brainbench transcript #6370594
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.