![]() |
|
сделать стартовой | добавить в избранное |
![]() |
MSSQL 2005 (Yukon) – работа с очередями и асинхронная обработка данных |
Iva Bodyagi Несколько общих слов Этот очерк посвящен трудностям, с которыми сталкивается разработчик при попытке построить полноценное асинхронное приложение, а также той посильной помощи, которую может оказать компания Microsof в этом нелегком предприятии благодаря следующей версии SQL Server с кодовым именем Yuko и сопутствующих библиотек. Безусловно, тема асинхронности весьма обширна, и ее невозможно охватить в одной статье, даже если ограничиваться исключительно рамками SQL Server-а, но я и не ставил перед собой задачи охватить все. Здесь будет дан краткий обзор новой функциональности, которая появится в MS SQL Server с выходом новой версии, наиболее важной на мой взгляд, и несколько примеров использования этой функциональности. Асинхронность Я несколько раз подкрадывался к своим знакомым и пытался неожиданно спросить, что же они понимают под асинхронностью – выяснилось, что все понимают, что это такое, но никто не может дать четкого определения. Так что же такое асинхронность? Формальное определение говорит, что это такая характеристика процессов, не совпадающих во времени. Коротко, емко, но непонятно. Если же упростить, то это возможность свалить часть работы на кого-то другого, а за результатом прийти потом, занимаясь в промежутке своими делами. И это относится как к однотипной работе, так и к совершенно разноплановой. Наверное, уместно было бы прибегнуть к аналогии. Допустим, существует два способа отдать автомобиль в сервис – синхронный и асинхронный. В синхронном варианте можно приехать на сервис, пообщаться с механиком, загнать вместе с ним машину в бокс, помочь ему дружеским советом, рассказать пару свежих анекдотов или услышать их от него. Тоже в общем-то с пользой проведенное время. Если же просто отдать ключи механику при встрече и забрать машину, когда она будет готова, проведя промежуток времени между двумя этими событиями по своему усмотрению, то это уже будет асинхронный способ ремонта. Точно так же обстоит дело и в приложении. Поток можно распараллелить на несколько потоков, как выполняющих одну и ту же работу, разделив ее на части, так и совершенно разную, например, одновременно считывать что-то с диска и решать вычислительные задачи. Интуитивно все ощущают, что асинхронные приложения во всех отношениях лучше, но почему-то пишут их только в самом крайнем случае. Асинхронное приложение снижает зависимость между процессами – вы в достаточно широких пределах не зависите от того, как долго механик возится с вашей машиной, если вернуться к нашей аналогии. Оно лучше масштабируется – при увеличении нагрузки достаточно подключить второй процессор или второй сервер. В общем случае оно надежнее – если один сервер вышел из строя, то остальные продолжают выполнять работу. Этот список можно продолжать довольно долго. Но всю эту радужную картину рушит одно – асинхронные приложения чертовски сложно разрабатывать. Главная проблема асинхронных приложений состоит в сложности коммуникации между независимыми процессами. Вот такой забавный парадокс: выясняется, что асинхронные приложения необходимо уметь правильно синхронизировать, и от качества этой синхронизации зависит очень многое.
В идеальном варианте обмен информации между асинхронными потоками сам по себе должен быть асинхронным, обеспечивать транзакционность, гарантию доставки, гарантию очередности, групповую обработку и много других скучных вещей. В одном отдельно взятом приложении может и не потребоваться вся эта функциональность, но практически любой крупный проект с поддержкой асинхронной работы включает в себя разработку некоего фреймфорка для реализации асинхронности, что само по себе задача не тривиальная. Однако Microsof с выпуском SQL Server 2005 и сопутствующих клиентских библиотек решил взять часть этой нудной работы на себя. Асинхронные возможности сервера Для начала рассмотрим, какие возможности предоставляет новый SQL Server сам по себе, без учета возможностей клиента и ADO. e 2.0 Начнем, пожалуй, издалека. Фраза о работе с очередями недаром вынесена в название этой статьи, так как механизм очередей является неотъемлемой частью хорошей реализации асинхронности. Как правило, в асинхронном приложении есть, условно говоря, «основной поток», который раздает некоторые задания «служебным потокам» и впоследствии забирает от них результаты. Одним из важных моментов является именно процесс выдачи задания и получения результатов. Дело в том, что служебные потоки не всегда находятся в распоряжении главного. Тому есть множество причин. Число потоков, с которыми можно работать эффективно, ограничено, и свободных потоков, готовых выполнить задание, может просто не быть, или же служебный поток может вовсе находиться на другой машине. Если основной поток при обмене информацией будет взаимодействовать непосредственно со служебными, то ему придется ждать служебные потоки, а это подрывает саму идею асинхронности. И тут на помощь приходят очереди. Они позволяют разорвать зависимость основного потока от служебных. Основному потоку достаточно поместить задания в очередь и идти дальше по своим делам. Служебные потоки, как только у них появится такая возможность, заберут из очереди задание и будут его выполнять, после чего опять-таки поместят результаты в соответствующую очередь, дабы основной поток забрал их, когда у него появится время. И даже если служебный поток находится на другой машине, то при наличии очередей не составит никакого труда инициировать транспортную транзакцию при поступлении задания в очередь, опять-таки не заставляя основной поток ждать В грядущей версии SQL Server есть готовый механизм очередей (как одна из основных частей Service Broker). Однако если по каким-то причинам разработчику приходится строить очередь самостоятельно, то и для этого появились некоторые новые возможности. Ou pu или расширения обработки очередей Посвященная этой функциональности глава в разделе BOL «новые возможности» называется Queue Processi g Ex e sio s - расширения обработки очередей. Но на самом деле, это всего лишь одно из самых очевидных применений данного механизма. Суть функциональности заключается в следующем: теперь у ряда операторов, занимающихся манипуляцией с данными, а именно I SER , UPDA E и DELE E, появилось новое ключевое слово OU PU . С помощью этой конструкции можно после выполнения оператора получить результат его работы и перенаправить этот результат в какую-нибудь таблицу или просто вернуть клиентскому приложению.
Если говорить проще, появился доступ к триггерным псевдотабличкам i ser ed и dele ed прямо из запроса. Иными словами, теперь есть возможность узнать, что же именно было изменено DML-оператором, не обращаясь лишний раз к серверу. Основное предназначение данной конструкции, как следует из названия раздела, это работа с очередями, но подробнее об этом будет сказано чуть позже, а пока разберем непосредственно механику. Простейший пример может выглядеть примерно так: -- создаем тестовую таблицу: -- CREA E ABLE Ou pu es ( ID i IDE I Y, da e ime defaul ge Da e(), Limi as Lef (Da a, 8), Da a char(50)) -- собственно, проверяем, как оно работает: -- I SER I O Ou pu es (Da a) OU PU I SER ED. VALUES ( ewID()) -- наслаждаемся результатом: -- ID ime Limi Da a 1 2005-05-21 19:40:43.087 5C1D39E9 5C1D39E9-8E28-4ED7-B5E8-938EA84FFE18 Как легко заметить, вся магия заключается в конструкции OU PU I SER ED. , обратите внимание, что в тестовой таблице присутствует колонка ide i y, колонка со значением по умолчанию и колонка с вычисляемым значением. При этом данные, полученные из i ser ed-таблички, содержат уже посчитанные значения в этих колонках. То есть табличка i ser ed содержит фактические значения вставляемых данных уже после внутренних вычислений, однако триггеры не учитываются, то есть отработка ou pu происходит после внутренних вычислений, но перед выполнением триггеров. Например, при наличии триггера I S EAD OF на таблице, изменяющая эту таблицу операция в ou pu вернет все данные, которые должны там быть, даже если в результате работы триггера никаких изменений не произойдет. ПРЕДУПРЕЖДЕНИЕ На самом деле тут есть одно исключение, если на табличке висит триггер I S EAD OF, то значение IDE I Y в OU PU I SER ED вычислено не будет. К выборке ou pu можно применять различные выражения и подзапросы, в том случае если они возвращают одно значение. Например, если есть необходимость в момент изменения записи узнать, сколько времени прошло с момента последнего обновления, то запрос может выглядеть примерно так: UPDA E Ou pu es SE Da a = ewID(), = Ge Da e() OU PU Da eDiff(ss, DELE ED.) Diff В результате выполнения такого запроса получится рекордсет с одной записью, в которой будет содержаться количество секунд, прошедшее между изменениями записи. В предыдущих примерах результат работы ou pu отправлялся прямо в клиентское приложение, но можно перенаправить его и в таблицу – обычную, временную и табличную переменную. Сделать это довольно просто: DECLARE @ mp ou pu ABLE ( ID i , ime da e ime, Limi varchar(8), Da a varchar(50)) I SER I O Ou pu es (Da a) OU PU i ser ed. I O @ mp ou pu VALUES ( ewid()) В данном случае вывод был перенаправлен в табличную переменную. В то же время, на таблицы, в которые производится вывод, наложено несколько ограничений: На них не должно быть назначено триггеров. В принципе, триггер может быть назначен, но должен быть в состоянии Disabled. Они не должны быть связаны внешним ключом с другими таблицами, и на эту таблицу не должны ссылаться внешние ключи. Не должно быть CHECK-ограничений и правил (rules) в состоянии E abled.
Некоторые системы находились в заключительной стадии разработки и требовали окончательной доводки при работе по самолету. Я увидел здесь наряду со знакомыми мне звукоулавливателями и прожекторами такие устройства, как теплообнаружитель, о котором раньше мне почти ничего не было известно, дифференциально-интерференционный пеленгатор, установку для пассивного подслушивания. Всего набралось что-то около шестнадцати различных систем. Задача заключалась в том, чтобы в ходе испытаний получить данные, которые позволили бы объективно сравнить между собой тактико-технические характеристики различных приборов, выявить достоинства и недостатки каждого из них, определить возможность и целесообразность их использования для обнаружения самолетов. Программа была обширной, сложной, с большим объемом математической обработки данных. Для выполнения задания в назначенные сроки (а они были весьма сжатыми) приходилось напряженно трудиться с раннего утра до позднего вечера, прихватывая иной раз и значительную часть ночи. Принцип проведения испытаний оставался прежним
1. Разработка приложений на языке VBA в среде MS EXCEL по обработке данных для заданных объектов
2. Выставка: последующая обработка данных
3. Алгоритмизация и программирование процессов обработки данных в среде СУБД типа Fox
4. Классификация систем параллельной обработки данных
5. Некоторые аспекты обеспечения эффективности работы системы управления базами данных
9. Обработка данных методом преломленных волн
10. Обработка данных в автоматизированных системах
11. Параллелизм как способ параллельной обработки данных
12. Создание формул для обработки данных в электронной таблице Excel
13. Структуры и алгоритмы обработки данных
14. Защита информации в автоматизированных системах обработки данных: развитие, итоги, перспективы
15. Вычислительная система обработки данных в реальном времени
17. Методы компьютерной обработки статистических данных. Проверка однородности двух выборок
18. Анализ пакетов обработки экспериментальных данных SABR и BOOTSTRAP
19. Системы обработки информации - язык баз данных SQL со средствами поддержания целостности
20. Статистическая обработка экспериментальных данных
25. Форматы данных и команды их обработки процессоров Pentium III, Pentium IV
26. Работа с бинарными данными и реестром Windows на платформе .NET
28. Информационно-справочная система, обеспечивающая работу с базой данных Bit
30. Технологический процесс лесосечных работ и обработка сырья
31. Автоматизированная система обработки структур данных
32. Информационные технологии создания и обработки баз данных с помощью MS Access XP
34. Программы для работы с архивами данных
35. Работа с базами данных Microsoft Access 2000
36. Работа с базами данных в MS Excel
37. Работа с базой данных MySQL средствами PHP
41. Специфика создания баз данных и работы в Microsoft Access
42. Разработка канала обработки и сбора данных
43. Режимы работы асинхронных двигателей
44. Методы обработки статистических данных
47. Производство отделочных работ
48. Штукатурные работы с основами охраны труда
49. Производство работ по возведению жилого кирпичного здания
50. Общие виды работ, выполняемых на воздушных судах
51. Структура и алгоритмы работы спутниковых радионавигационных систем
52. Анализ медико-биологических данных с использованием Excel и СПП STADIA
53. Отчёт по лабараторным работам по биологии за 1 семестр
57. Организация и проведение спасательных работ в чрезвычайных ситуациях
58. Применение ЭВМ для повышения эффективности работы штаба ГО РАТАП
59. Спасательные и неотложные аварийно-восстановительные работы в очагах поражения
60. Итоги работы портов: Одесса, Ильичёвск, Николаев, Мариуполь и Херсон за 2003 год
61. Экономическая система Дании
63. Безработица в России /данные на 1992г/
64. Состав нормативных документов, регламентирующих организацию работы с документами
65. Контрольная работа по всеобщей истории государства и права
66. Контрольная работа по всеобщей истории государства и права
67. Государственный бюджет 2005 года
68. Контрольная работа по муниципальному праву Вариант 2
69. Контрольная работа по Римскому праву
73. Контрольная работа по экологическому праву
74. Контрольная работа по Английскому языку
75. Контрольная работа по английскому языку (Тюмень)
77. База данных для проекта досугового учреждения в городе Муроме Владимирской области
78. Художественная обработка металлов
79. "О культуре" по работе Н.А. Бердяева "Философия неравенства" (Windows)
80. Билеты и ответы по обществознанию (2004-2005 уч. год)
81. Судьба и творчество Даниила Хармса
82. О развитии навыков работы над полифонией
83. Начальный этап работы над музыкальным произведением
85. Классовый и сословный характер общества по данным древневосточных судебников
89. Построение сети передачи данных
90. Системы, управляемые потоком данных. Язык "Dataflow Graph Language"
91. Электронная почта и факсимильная связь. Структура и прицип работы
92. Системы и сети передачи данных
93. Диагностика и устранение неисправностей при работе в локальной сети
94. Создание автоматизированной системы обработки экономической информации
95. Информационные потоки в ЭВМ. Алгоритм работы процессора
96. Модемы, модемные стандарты, принцип работы
97. Принцип программного управления. Микропроцессор. Алгоритм работы процессора
98. Информация, информатика, базы данных. Периферийные устройства