Сценарий за опашка за съобщения - опашка и отдалечена уеб услуга

(Моля, вижте връзките към слайдове по-долу) Опитвам се да създам и подлежаща на одит услуга за заявки и отговори, която взаимодейства с отдалечена уеб услуга. Имам известен проблем с вземането на решение за правилната реализация на моя подход. По принцип как имам нужда внедряването да работи е както следва.

  • Приложението Requester (A) ще генерира XML заявка и ще я добави към „опашката“ на заявка. След това процесорът за обработка на заявки ще получи необработен запис от „опашката“ и ще го изпрати ПОСТ до отдалечена уеб услуга (X) с уникален идентификатор, ако заявката не е успешна, заявката се запазва/(requestComplete флаг = 0) в „опашката“ на заявката, за да бъде повторен опит по-късно.

  • Ако заявката е успешна, тя се запазва/(флаг за завършване на заявката = 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 трябва да се опита отново)
  • Трябва да мога да поддържам одитна пътека за заявките/отговорите.
  • Използвам C#, 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).

Бих съхранил регистрационните файлове с резултати в база данни, за да улесня заявките и докладите. Също така бих предпочел да използвам servicebus с MSMQ (или всяка друга опашка), отколкото да използвам таблица на база данни като "опашка" - първата е проектирана точно за вашия сценарий, докато втората е много по-общ продукт за обработка на много различни сценарии и следователно няма да бъде толкова ефективен като внедряване на опашка (напр. MSMQ) (въпреки че може да го направи - но мащабирането става по-трудно).

person Martin Ernst    schedule 10.06.2013