(Пожалуйста, см. Ссылки на слайды ниже) Я пытаюсь создать и проверить службу запросов и ответов, которая взаимодействует с удаленной веб-службой. У меня возникли проблемы с выбором правильной реализации моего подхода. По сути, мне нужно, чтобы реализация работала следующим образом.
Приложение Requester (A) создаст XML-запрос и добавит его в «очередь» запросов. Затем обработчик запросов получит необработанную запись из «очереди» и отправит ее в удаленную веб-службу (X) с уникальным идентификатором. Если запрос не выполнен успешно, запрос сохраняется/(requestComplete flag = 0) в «очереди» запросов для повторной попытки позже.
Если запрос выполнен успешно, он сохраняется/(флаг requestComplete = 1) и не повторяется.
Позднее веб-служба получателя (B) получает ответ от службы «X», которая была вызвана в запросе.
Затем «B» просматривает записи запроса, чтобы найти исходный запрос, и сопоставляет запрос «A» и ответ «X» (сопоставление с использованием уникального идентификатора).
С ответом выполняется некоторая дополнительная обработка, и запись из «очереди» обновляется как завершенная.
Таким образом, существует полный аудиторский след от запроса до ответа. Я могу увидеть, когда был сделан первоначальный запрос, если есть ошибка с запросом, просмотрев запись «очереди». Аналогично с ответом, я могу видеть, когда он был получен, если вообще был.
Я придумал два способа реализовать это.
- Сценарий 1 С таблицей базы данных, которая действует как очередь запросов, очередь ответов, а также аудиторский след в одном. Одна строка в таблице с идентификатором GUID, на который можно ссылаться на любом этапе процесса (запрос-> обработка-> получение) и обновлять по ходу. Проблема в том, что эта реализация, насколько я понимаю, не действует как настоящая очередь, такая как MSMQ (push/pop), транзакционная и не такая масштабируемая.
- Сценарий 2 Для фактической реализации очереди я провел небольшое исследование и решил использовать MSMQ, который, возможно, несколько очередей; очередь процессора, чтобы справиться с обработкой и отправкой запроса, а затем отправить этот завершенный запрос в очередь получателя, чтобы дождаться ответа от «X». Единственная проблема с этим методом — нет четкого контрольного журнала, т.е. запрос удаляется из очереди после его получения, как и ответ. Если только я не использую таблицу базы данных для хранения очередей запросов и ответов в целях аудита. Я читал, что в MSMQ есть транзакции типа журнала, в которых хранятся записи, поставленные в очередь, но я ищу более полное решение или действительно совет по этому вопросу.
Всего несколько замечаний:
- Запрос «A» отправляет «X» с уникальным идентификатором, «X» отправляет ответ «B» со ссылкой на этот уникальный идентификатор. Это позволяет «B» отслеживать запись запроса «A».
- Мне нужно иметь возможность повторить неудачные попытки «X» (любая ошибка 400 или 404 должна быть повторена)
- Мне нужно иметь возможность отслеживать запросы/ответы.
- Я использую С#, WCF, MSMQ, SQL Server 2008 R2, VS 2012.
Если у кого-то есть какие-либо предложения или рекомендации о том, какой путь выбрать, какие-либо комментарии или какие-либо знания о передовых методах работы с описанными выше сценариями, это было бы очень полезно.