Сценарий очереди сообщений — очередь и удаленная веб-служба

(Пожалуйста, см. Ссылки на слайды ниже) Я пытаюсь создать и проверить службу запросов и ответов, которая взаимодействует с удаленной веб-службой. У меня возникли проблемы с выбором правильной реализации моего подхода. По сути, мне нужно, чтобы реализация работала следующим образом.

  • Приложение Requester (A) создаст XML-запрос и добавит его в «очередь» запросов. Затем обработчик запросов получит необработанную запись из «очереди» и отправит ее в удаленную веб-службу (X) с уникальным идентификатором. Если запрос не выполнен успешно, запрос сохраняется/(requestComplete flag = 0) в «очереди» запросов для повторной попытки позже.

  • Если запрос выполнен успешно, он сохраняется/(флаг requestComplete = 1) и не повторяется.

  • Позднее веб-служба получателя (B) получает ответ от службы «X», которая была вызвана в запросе.

  • Затем «B» просматривает записи запроса, чтобы найти исходный запрос, и сопоставляет запрос «A» и ответ «X» (сопоставление с использованием уникального идентификатора).

  • С ответом выполняется некоторая дополнительная обработка, и запись из «очереди» обновляется как завершенная.

Таким образом, существует полный аудиторский след от запроса до ответа. Я могу увидеть, когда был сделан первоначальный запрос, если есть ошибка с запросом, просмотрев запись «очереди». Аналогично с ответом, я могу видеть, когда он был получен, если вообще был.

Я придумал два способа реализовать это.

  1. Сценарий 1 С таблицей базы данных, которая действует как очередь запросов, очередь ответов, а также аудиторский след в одном. Одна строка в таблице с идентификатором GUID, на который можно ссылаться на любом этапе процесса (запрос-> обработка-> получение) и обновлять по ходу. Проблема в том, что эта реализация, насколько я понимаю, не действует как настоящая очередь, такая как MSMQ (push/pop), транзакционная и не такая масштабируемая.
  2. Сценарий 2 Для фактической реализации очереди я провел небольшое исследование и решил использовать MSMQ, который, возможно, несколько очередей; очередь процессора, чтобы справиться с обработкой и отправкой запроса, а затем отправить этот завершенный запрос в очередь получателя, чтобы дождаться ответа от «X». Единственная проблема с этим методом — нет четкого контрольного журнала, т.е. запрос удаляется из очереди после его получения, как и ответ. Если только я не использую таблицу базы данных для хранения очередей запросов и ответов в целях аудита. Я читал, что в MSMQ есть транзакции типа журнала, в которых хранятся записи, поставленные в очередь, но я ищу более полное решение или действительно совет по этому вопросу.

Всего несколько замечаний:

  • Запрос «A» отправляет «X» с уникальным идентификатором, «X» отправляет ответ «B» со ссылкой на этот уникальный идентификатор. Это позволяет «B» отслеживать запись запроса «A».
  • Мне нужно иметь возможность повторить неудачные попытки «X» (любая ошибка 400 или 404 должна быть повторена)
  • Мне нужно иметь возможность отслеживать запросы/ответы.
  • Я использую С#, WCF, MSMQ, SQL Server 2008 R2, VS 2012.

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


person gorillapower    schedule 10.06.2013    source источник


Ответы (1)


Я бы посоветовал посмотреть на служебную шину с сагами (я предпочитаю Rhino Service Bus). , но NServiceBus также пользуется большой популярностью, и есть также Общественный транспорт)

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

Проблемы с повторными попытками позже можно довольно элегантно решить с помощью отложенных сообщений в Rhino Service Bus и тайм-аутов в NServiceBus (у меня нет опыта работы с Mass Transit).

Я бы сохранил журналы результатов в базе данных, чтобы упростить запрос и отчетность. Я также предпочел бы использовать служебную шину с MSMQ (или любую другую очередь), чем использовать таблицу базы данных в качестве «очереди» — первая предназначена именно для вашего сценария, тогда как вторая — гораздо более общий продукт для обработки множества различных сценариев и таким образом, он не будет таким эффективным, как реализация очереди (например, MSMQ) (хотя он может это сделать, но масштабирование становится сложнее).

person Martin Ernst    schedule 10.06.2013