Лучшая архитектура для 30 + запрос часа

У меня есть интересная проблема для решения. У одного из моих клиентов есть я разрабатывающий аналитическую программу запаса с близко к 50 годам данных запаса почти для тысячи символов. Я разработал серию фильтров, которые применяются в любой данный день, чтобы видеть, выпадает ли что-нибудь для торговли.

Мы хотим выполнить этот фильтр в течение каждого дня данных, которые мы имеем для каждого запаса. В основном Ваш начинаться и дата окончания вводят отчет. Однако требуется 6 минут для фильтрации каждую неделю для каждого символа. Мы изображаем, что приблизительно приблизительно 40 часов выполняют отчет о нашем всем наборе данных.

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

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

У кого-либо есть какие-либо общие представления или опыт с веб-архитектурой, которая будет поддерживать ультрадолгие процессы asychronous?

Спасибо

11
задан MikeMalter 7 July 2010 в 21:01
поделиться

10 ответов

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

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

Лучше всего ограничивать веб-запросы максимум одной-двумя минутами - они никогда не предназначались для длительной обработки. Таким образом, вы можете «проверять» статус задания примерно каждую минуту (с помощью веб-службы).

Если у вас есть какие-либо вопросы обо мне или об идее, оставьте комментарий, и я буду рад помочь, уточнить или предложить ..

Надеюсь, что это поможет!


(Дополнительно: я считаю, что службы Windows используются недостаточно! Все, что требуется, - это быстрый базовый класс или набор многоразовых вспомогательных методов, и у вас есть регистрируемый, надежный, автоматический, настраиваемый и быстро реализуемый процесс, работающий под вашим контроль. Быстрое создание прототипа!)

17
ответ дан 3 December 2019 в 01:33
поделиться

Есть ли причины, по которым нельзя просто запустить службу в фоновом режиме и архивировать отдельные наборы результатов в таблицу результатов только для чтения по мере их запроса? Нужно ли вам выполнять запрос в реальном времени? Приложение могло бы получать страницы результатов по мере их генерации службой.

6
ответ дан 3 December 2019 в 01:33
поделиться

Похоже, что вы выполняете SQL-запросы непосредственно к этим данным. Рассматривали ли вы возможность загрузки данных, например, в службы Анализа .SQL сервера и настройки куба с (для начала) размерами времени, запаса и символа? В зависимости от характера ваших запросов, вы можете получить вполне разумное время ответа. Реляционные базы данных хороши для оперативной обработки транзакций (в пределах определенных параметров нагрузки и времени отклика), но аналитическая работа иногда требует методов и технологий хранилищ данных. (Или, может быть, ассоциативные базы данных... есть альтернативы.)

Однако, учитывая Мерфи, у вас, вероятно, будут некоторые длительные запросы. Различаются ли данные для разных конечных пользователей? Если нет, то почему бы не заранее вычислить ответы? Ничто на основе http не должно занимать больше минуты для обработки, если при этом - по крайней мере, не по замыслу!

5
ответ дан 3 December 2019 в 01:33
поделиться

Вообще, сверхдлинные асихронные процессы не попадают в веб.

Его запрос должен быть поставлен в очередь, а другой процесс должен выполнить задание и сохранить данные в том формате, в котором пользователь будет их использовать.

2
ответ дан 3 December 2019 в 01:33
поделиться

В зависимости от специфики вашего фильтра это звучит как задача, которая может выиграть от распараллеливания - разделения запроса между несколькими вычислительными узлами, которые запускают фильтр на подмножестве (сегменте) данных. Если ваш фильтр ориентирован на анализ одной акции по множеству временных данных, вы можете разделить работу над символом акции и иметь несколько вычислительных узлов, обрабатывающих разные символы акций одновременно. Если вам нужно изучить отношения между символами акций с течением времени, возможно, имеет смысл разделить работу по временным интервалам и объединить результаты после операции (mapreduce). Это тот случай, когда добавление большего количества оборудования для решения проблемы может значительно улучшить время отклика. Рассмотрим один из примеров поисковой системы Google.

Применяются обычные предостережения: сначала проверьте текущую реализацию фильтра на предмет узких мест в производительности. Убедитесь, что таблицы, с которыми вы обращаетесь, соответствующим образом проиндексированы и т. Д. Заранее просчитайте взаимосвязи и дайджесты часто необходимых вычислений. Хранение стоит недорого, если оно сэкономит время.

Ваш веб-запрос может запустить операцию запроса с разбросом / сбором, распределяющую запрос по доступным вычислительным узлам в облаке (Windows Azure, Google Apps, Amazon). При наличии достаточного количества вычислительных узлов и надлежащего распределения работы вы, вероятно, сможете получить ответ почти в реальном времени.

3
ответ дан 3 December 2019 в 01:33
поделиться

Шесть минут на фильтрацию данных за неделю? Похоже, ваша база данных нуждается в правильной настройке индекса.

2
ответ дан 3 December 2019 в 01:33
поделиться

Я рекомендую вам прочитать эту статью о Асинхронном выполнении процедуры . Если ваша логика связана с базой данных (что наверняка так и есть), то это дает полностью надежный способ запуска вычислительной задачи в асинхронном режиме, устойчивом к аварийному переключению. Учитывая, что ваша нагрузка очень парализуема, вы можете запускать несколько задач, например. по одному для каждого тикера, см. следующую статью Передача параметров в фоновую процедуру .

Кстати, этот метод использования встроенной асинхронной активации SQL Server используется по крайней мере двумя известными мне крупными финансовыми корпорациями для точно такого же сценария, что и ваш.

2
ответ дан 3 December 2019 в 01:33
поделиться

Думали ли вы об использовании решения ETL, такого как SSIS, для предварительного заполнения ваших данных?

0
ответ дан 3 December 2019 в 01:33
поделиться

Я не знаю, почему все здесь ответившие хотят, чтобы вся работа выполнялась в базе данных, но управление заданиями должно быть внешним. Это как положить ключ зажигания в машину снаружи. На самом деле, я знаю почему. Вы отметили этот вопрос с помощью wcf.

И предложение использовать «вычислительные узлы» только что завершило мое модное слово «бинго», спасибо, dthorpe! вам не нужны «вычислительные узлы», только ядра. Большинство СУБД имеют встроенный PX (параллельное выполнение). Зачем платить за облачные вычисления, которыми вы пользуетесь каждый день, просто купите сервер с достаточным количеством процессоров, и все будет в порядке ... Нет необходимости в запросах "scatter-gather", просто включите PX ...

Pontus указывает вам на правильное направление. Ваша проблема - быть довольным 6-минутным выступлением и беспокоиться о расписании. Существует множество стратегий для преобразования ваших данных в форматы, повышающие скорость. Индексы, партиционирование, кубы, IOT. Возможно, вы выполняете двухпроходную сортировку вместо сортировки по памяти. Ваша статистика могла быть устаревшей, что привело к плохому плану.

Я предполагаю, что вы не выполнили целую тонну настройки дБ, исходя из сути этого вопроса. Вам действительно следует опубликовать вопрос (вопросы) по настройке базы данных и сообщить нам, какую СУБД вы используете, и как далеко вы уже настроились.

1
ответ дан 3 December 2019 в 01:33
поделиться

Майк,

Есть много способов ответить на этот вопрос, но более важный вопрос, который я вижу, что вы должны задать: почему требуется 6 минут для фильтрации акций?

Да, я знаю, что у вас 50 лет данных и много акций, НО это не должно занимать 6 минут. Поэтому, что более важно, я бы посмотрел на структуру этой конкретной таблицы, индексы в ней, запрос и то, что он делает.

Я работал в похожей компании, с таблицами, каждая из которых занимает почти 100 Гб. Да, размер таблицы, а не всей базы данных, и после некоторой тонкой настройки получил запросы, которые раньше занимали 15 минут + до 3 секунд.

Я с удовольствием помогу вам, особенно если вы работаете на SQL Server. Напишите мне ryk99[at]hotmail[dot]com, и мы посмотрим, что можно сделать дальше.

1
ответ дан 3 December 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: