MSMQ - Абстракция и шаблон очереди сообщений - PullRequest
1 голос
/ 05 мая 2010

Позвольте мне сначала определить проблему и почему была выбрана очередь сообщений. У меня есть слой данных, который будет транзакционным, и ЧРЕЗВЫЧАЙНО вставлять тяжелые данные, и вместо этого я попытаюсь справиться с этими проблемами, когда они возникнут. Я надеюсь реализовать свое приложение с нуля с учетом этого.

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

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

Однако это то, где вещи становятся немного неприятными ... Я разобрался, как вернуть сообщения и тому подобное (достаточно тривиальная проблема), но я застрял; как создать общий (или, по крайней мере, несколько общий) способ запроса моей очереди сообщений? Один, где я могу минимизировать дублирование между запросами SQL и запросами MessageQueue. Я рассмотрел использование LINQ (но очень ограниченно разбирался в технологии), а также попытался реализовать его с помощью Predicates, что пока довольно вонючее.

Есть ли шаблоны для такой проблемы, которые я могу использовать? Я поступаю об этом неправильно? У кого-нибудь есть свои идеи о том, как я могу решить эту проблему? Кто-нибудь вообще понимает о чем я? : -)

Любой и ВСЕ вклад будет высоко оценен и серьезно рассмотрен…

Еще раз спасибо.

Для всех, кто заинтересован. Я решила в конец просто кешировать транзакция в другом месте и использовать MSMQ, как задумано и описано ниже.

1 Ответ

1 голос
/ 05 мая 2010

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

Ответ в значительной степени зависит от вида запросов, которые вы собираетесь выполнять, но ответ может быть некой базой данных без SQL (CouchDB или BerkeleyDB и т. Д.)

...