Вопрос

Мне нужно ставить в очередь события и задачи для внешних систем надежным / транзакционным способом. Использование таких вещей, как MSMQ или ActiveMQ, выглядит очень соблазнительно, но транзакционная часть усложняется (MSDTC и т. Д.).

Мы могли бы использовать базу данных (SQL Server 2005+, Oracle 9+) и добиться более легкой поддержки транзакций, но часть очередей становится уродливее.

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

Может ли кто-нибудь предложить практическое руководство по этому вопросу?

Подумайте: E / C / A или механизм запланированных задач, который периодически просыпается, и посмотрите, есть ли какие-либо запланированные задачи, которые нужно запустить в это время (т. е. прошла следующая дата выполнения, но дата окончания срока действия еще не был достигнут).

Это было полезно?

Решение

наша система имеет 60 компьютеров, на каждом из которых выполняется 12 задач (потоков), которые должны "получить следующую работу". В общем, речь идет о 50 тысячах «рабочих мест». в день. посчитайте, сколько транзакций в минуту, и поймите, что время задачи является переменным, так что можно получить несколько «pop» события в одно и то же время.

У нас была первая версия с использованием MSMQ. Вывод: держись подальше . Хотя с нагрузкой и синхронизацией все в порядке, у него было 2 проблемы. один раздражающий и один прерыватель сделки.

Раздражает: как программное обеспечение Enterprise, MSMQ имеет потребности в безопасности, которые просто делают его еще одним средством настройки и борьбы с сетевым администратором клиентов.

Deal Breaker: пришло время, когда мы хотели взять следующую работу, но не с помощью простого всплывающего окна, а что-то вроде " get next BLUE job " или "получить следующую ЖЕЛТУЮ работу". не могу это сделать!

Мы перешли к плану B: реализовали наш собственный Q с одной таблицей SQL 2005. не может быть счастливее

Я подчеркнул, протестировать его с 200K сообщений в день, работал. Мы можем сделать " далее " логика настолько сложна, насколько мы хотим.

Подвох: вы должны быть очень осторожны с SQL, который принимает следующий элемент. Так как вы хотите, чтобы это было быстро и без блокировки. есть два очень важных SQL подсказки , которые мы использовали, основываясь на некоторых исследованиях. Волшебство происходит примерно так:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

Другие советы

Я видел, как MSMQ использовался транзакционно, и это не казалось особенно сложным - транзакция SCope обертывала вызовы очереди или очереди вместе с доступом к базе данных, и все было в порядке, пока очередь была определена как транзакционная после ее создания. Я не думаю, что это верно для ActiveMQ, который является брокером сообщений, но MSMQ устанавливается локально на каждом компьютере конечной точки, поэтому для получения элемента транзакционно в очередь не требуется сложная распределенная транзакция.

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

nServiceBus: www.nservicebus.com

Общественный транспорт: http://code.google.com/p/masstransit/

Кроме того, у Орен Эйни есть интересная экспериментальная очередь транзакций на основе файловой системы. Преимущество этой библиотеки в том, что, в отличие от MSMQ, ее можно развернуть как библиотеку и не требует головной боли от обслуживания развертывания MSMQ.

Вы можете прочитать об этом здесь: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

Кроме того, SQL Server 2005 довольно элегантно обрабатывает очереди, используя SQL Server Service Broker, но вам понадобится установить SQL Server на каждой конечной точке, и я не знаю, пересекает ли SSB брандмауэр.

Наконец, если вы не получили ответ на свой вопрос, я настоятельно рекомендую дискуссионный форум nSErviceBus. Уди Дахан отвечает на подобные вопросы вместе со своей небольшой группой последователей, ориентированных на сообщения, и это лучший ресурс, который я нашел на сегодняшний день, чтобы быстро и компетентно ответить на вопросы, ориентированные на очередь. Этот форум находится здесь: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net - это система планирования заданий с открытым исходным кодом.

Для этого MSMQ предназначен для постановки в очередь с транзакциями. Если это не работает для вас, обратитесь к " Service Broker " особенность SQL Server - его «очередь в таблице SQL» что «csmba» описывает в своем ответе, но это интегрированный компонент SQL Server, красиво упакованный и представленный для вашего использования.

Является ли WebSphere MQ (серия MQ) опцией? Поддерживает транзакционные сообщения.

Вы можете посмотреть на функцию Oracle с именем Расширенные очереди

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top