Транзакционные очереди - PullRequest
       44

Транзакционные очереди

5 голосов
/ 03 октября 2008

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

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 03 октября 2008

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

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

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

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

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

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

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

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy
4 голосов
/ 03 октября 2008

Я видел 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/

1 голос
/ 03 октября 2008

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

1 голос
/ 03 октября 2008

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

0 голосов
/ 08 ноября 2008

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

0 голосов
/ 03 октября 2008

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

...