2010-05-05 4 views
1

Позвольте мне определить проблему в первую очередь и почему выбрана опция messagequeue. У меня есть datalayer, который будет транзакционным и EXTREMELY вставлять тяжелым, а затем попытаться решить эти проблемы, когда они произойдут. Я надеюсь реализовать это приложение с самого начала с учетом этого.MSMQ - Абстракция и шаблон очереди сообщений

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

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

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

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

Любые и все входные будут высоко оценены и серьезно рассматривать ...

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

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

ответ

1

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

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

+0

Hi Codeka, Спасибо за ответ. Не могли бы вы определить «большой-иш»? Я намерен запустить отдельный сервер для сообщения. Это каким-либо образом изменяет ваш ответ? Наконец запросы, что этот сценарий я задающая будет в основном работает очень просто выберите заявления вдоль линий .. SELECT * FROM RegisterTransactionHeader INNER JOIN RegisterTransactionDetail .... Еще раз спасибо –

+0

Расположение очереди на самом деле не влияет на него. Это всего лишь акт перечисления всех сообщений. Как и в случае с любой из связанных с производительностью, трудно дать жесткий и быстрый ответ, но я бы сказал, если бы у вас было более 100 сообщений, вы, вероятно, начнете это замечать.Вы также должны учитывать тот факт, что при перечислении сообщений другие процессы будут отключать сообщения, что также может усложнить ситуацию. –

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