2016-07-10 4 views
0

Мы работаем над заменой нашей старой VB6-системе, использующей SQL-сервер. Большая часть бизнес-логики находится в хранимых процедурах и триггерах. В настоящее время мы имеем некоторые функции NServiceBus, используя триггеры в базе данных для размещения сообщений в очереди (SQLTransport).Архитектура приложения с API NServiceBus и REST

Я хотел бы создать новую чистую api, которая использует все те же таблицы и хранимые процедуры за кулисами. Когда все приложения и службы используют новые системы api и messaging, мы можем начать очищать бэкэнд.

Новый интерфейс вызовет REST api для извлечения данных. То, с чем я борюсь, - это лучшие практики, выполняющие операции, которые создают/обновляют/удаляют данные. Для автоматизированных процессов, которые не требуют немедленного ответа, они могут просто отправить команду по шине. Однако для конечных пользователей, которые будут использовать приложение, они ожидают немедленных результатов. Если что-то вызывает сообщение в FLR/SLR, очевидно, что клиент не может сидеть там, ожидая чего-то.

Одна из идей - иметь библиотеку, которая обрабатывает все вызовы в базу данных, которые могут использовать как API, так и любые обработчики сообщений NServiceBus. Проблема, которую я вижу, - это когда операция должна публиковать событие. Из обработчика сообщений можно просто публиковать сообщение. Если я обрабатываю простую команду из REST api, я не могу просто опубликовать одно и то же событие (так как ничто не подписывается на REST api, и это может быть

Одним из решений может быть предоставление REST api send (не публиковать) сообщение конечной точке (тот, на который подписаны другие конечные точки), который затем опубликует событие всем подписчикам.

Как другие реализуют что-то вроде этого? Основные случаи использования, которые я думаю из простых операций create/update/delete, которые клиент ожидает от результатов в реальном времени, но бэкэнду, возможно, потребуется опубликовать событие, указывающее на то, что что-то произошло.

+0

http://docs.particular.net/nservicebus/hosting/publishing-from-web-applications –

+0

Спасибо, я прочитал это несколько раз. В нем говорится о том, что я упомянул: «Учитывая эти факты, общепринятая мудрость предположила, что, когда в контексте веб-приложения лучше отправлять команды только конечной точке службы, которая затем может опубликовать подобное событие.«но еще один вариант, о котором он также говорит, - это возможность иметь отдельную конечную точку диспетчера подписки, а веб-приложения используют одно и то же хранилище подписки. – Mark

ответ

1

Что вы описываете, является ch allenge, и я не буду пытаться предоставить решение здесь, однако, пару указателей ...

Синхронная связь (запрос/отклик на том же канале) является ортогональным для обмена сообщениями, стиль обмена сообщениями является огнем и забыт.

Концепция CQS (Command Query Separation), когда операции изменения состояния не отвечают данными измененного состояния, операции считывания, поэтому выполняются на отдельном канале, являются хорошим руководством для построения систем, использующих обмен сообщениями.

Также я бы избегал использовать обмен сообщениями для операций чтения (используйте прямой ADO).

CRUD-операции - это запах (я понимаю, что это устаревшая база кода), поскольку эти операции скрывают любые намерения или ценность для бизнеса.

Решение вы будете в конечном итоге с, вероятно, будет сочетание сообщений и синхронной связи (я предполагаю, что вы не пытаетесь переписать с нуля в это время)

Я был бы счастлив иметь более глубокий обсуждение (напишите мне sean.farmar на specific.net)

+0

Спасибо, Шон. Я приступлю. Я согласен, что обмен сообщениями не подходит для операций чтения, REST api будет просто использовать ADO для чтения из базы данных. Я пытаюсь понять, как все хорошо работает для бэкэнд-услуг, которые нужно запускать и забывать, а также для пользователей, ожидающих результатов в реальном времени. – Mark

+0

Я хочу подчеркнуть Шон его аргумент: избегайте использования сообщений для операций чтения, не делайте запросов по обмену сообщениями, если вызывающая сторона является пользовательским интерфейсом или блокировкой. Это очень распространенная яма. Запрос как можно более родной, добавляя API, который преобразует JSON в SQL добавляет только слои преобразования. Чем меньше слоев, тем лучше. –

Смежные вопросы