dr-mart

нужен технический совет по котировкам Мосбиржи

Привет всем! Нужна помощь техспецов. Хочу на смартлабе сделать вот такую табличку:

http://quote.rbc.ru/exchanges/demo/micex.0/intraday
 

Эта табличка у квоты обновляется автоматом раз в 5 сек.
Насколько я понял по API интерфейсу биржи, собирается она из вот таких запросов: 

http://moex.com/iss/engines/stock/markets/shares/securities.xml?securities=GAZP 

Как это лучше реализовать технически на стороне сервера?

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

+ я хочу ещё сохранять данные раз в 5-10 минут и делать с таким же интервалом определенные вычисления… результат которых будет в этой же табличке + сделать фильтры, по которым можно будет показывать бумаги

p.s. договор с биржей подписал
нужен технический совет по котировкам Мосбиржи

★3
44 комментария

habrahabr.ru/company/dnevnik_ru/blog/167307/

nodeguide.ru/doc/modules-you-should-know/socketio/

На сервере делается пулинг данных с биржи, отслеживаются изменения в данных и по веб сокетам или другому транспорту отсылаются изменения клиентам. На клиенте можно использовать angular, backbone или react js. Серверная реализация может быть на .net + signalR или на node.js + socket.io, исходя из возможностей хостинга.

avatar
  • На чем писать серверную часть?
    на чём угодно, я думаю это можно делать не на сервере, а на клиенте. Желательно чтобы данные с моекс приходили в json формате.
  • Как сделать так, чтобы это минимально грузило сервак и выполняло расчеты параметров по каждой бумаге?
    Минимизировать запросы к серверу моекс, стараться все данные выкачивать одним запросом.  
  • еще, если моекс поддерживает отправку данных по вебсокетам, то вообще хорошо будет.
avatar
togovse, спасибо!
Просто слать запросы параллельно потом агрегировать, на чем слать впринципе все равно, основная проблема это нагрузка на сервер биржи после которой она будет давать отлуп. На чем писать — на чем умеете, из скриптовых(Python, PHP) все равно, они по производительности равнозначны. Надо посчитать нагрузку, если ее придется снижать то писать стоит на Java/Go. Но лучше начать с простого решения — написать на том же языке что и сайт.
avatar
vlad1024, прогер говорит что тут есть трабла:
короч это все должно работать 146% мимо пхп. т.е. хоть в статическую страницу пихать — может этот варик даже лучше, т.к. и мемкешу прокачивать мег по соекту и так херово кол-во раз в секунду — все ляжет. 
Тимофей Мартынов, вариант делать на клиенте хороший, но и на серверной части большой проблемы быть не должно, не обязательно с сокета качать херово кол-во раз, достаточно ограниченное кол-во хранить в очереди и на клиент отдавать из неё, в худшем случае будет небольшая задержка
avatar
Тимофей Мартынов, Поставь на сервак квик и тяни котировки оттуда :)
kbrobot.ru, или можно smartcom или transaq у них как раз огромные задержки, даже буфер не нужен будет.
kbrobot.ru, а чем такое решение быстрее и надежнее, чем если тянуть их с биржи?
Тимофей Мартынов, Мне кажется оно проще. Хотя я по вебу не сильный спец
vlad1024, еще говорит что типа там таблица метр весит, если ее обновлять каждые 5 сек, значит много трафика буит
Тимофей Мартынов, я думаю, раз в минуту отсылать вполне нормально. Все равно задержка 15 минут.
Глыба Денег, как вариант!
Тимофей Мартынов, у меня получилось 7 гбайт за сутки если скачивать каждые 5 секунд. В общем, смотри есть два варианта, либо есть какие-то push уведомления от сервера биржи(что обновить), либо придется скачивать все, с фиксированной частототй. Тут было предложение уменьшить частоту, и это впринципе разумно. По поводу того на чем писать, можно на ПХП только пустить его мимо сайта. То есть примерно это должно работать следующим образом:
По таймеру дергается скрипт, он параллельно в несколько потоков, закачиват данные с сервера майсекса, агрегирует их и засовывает в базу, либо сразу генерит страничку которую можно отдать.
Далее ПХП на уровне функционала сайта, отдает эту страничку либо строит ее из базы.
avatar
vlad1024, а нам не надо их у себя хранить
хранить нужно только будет «срезы» раз в 5-10 минут для вычислений некоторых

спасибо за рекомендации, я передам их программеру
и хорошо что ты вернулся на смартлаб
помнишь, как ты на меня обижался?:)
Тимофей Мартынов, 
>помнишь, как ты на меня обижался?:)
Последний раз когда я на тебя «обижался» это было в ноябре 2012 года, когда выпилили Феникса. Просто времени в основном нет, чтобы зависать на смарт-лабе. А так я время от времени читаю, изредка коментрую, и даже посты пишут если есть чем поделится интересным.
avatar
vlad1024, ага, давно было, но видишь, я всех помню!))
потому что каждый расстроенный смартлабом человек — это травма для меня)
vlad1024, для снижения нагрузки на сервер не лучше на C# писать серверную часть, вместо PHP и Java?
avatar
MyProfit, C#/Java равнозначны по производительности, практически, можно еще попробовать на Go написать, он тоже шустрый и более «скриптовый».
avatar
Я бы делал так.

1. На SQL Server создал таблицу (скорее группу таблиц). 
2. На SQL Server создал Stored procedure (на t-sql) которая делает нужные вычисления на базе таблиц из п.1
3. На .NET написал процедуру которая 
3.1. Запрашивает данные по HTTP в формате XML
3.2. Парсит XML документ и записывает данные в таблицу из п.1
3.3. Вызывает процедуру из п.2
4. Создал задание по расписанию (на сервере) которое регулярно с заданной частотой выполняет процедуру п.3.


К подобного класса задачам лучше подходить обдуманно. Обдумывать максимально будущую систему в рамках которой будет работать данное решение. Фундаментальный вопрос тут — реляционная модель базы данных. Остальное — вторично. Модель данных — должна проектироваться исходя из модели семантического уровня. Несколько заумно может показаться, но делать лучше так.
Игорь Рябушкин, спасибо
обдумаем
Тимофей Мартынов, если нужно больше деталей — обращайся. Решаю такие задачки регулярно.
Игорь Рябушкин, вот что прогер ответил:
№) я не знаю че такое семантический уровень. надо смотреть как быстро сможет пережевать пхп 1 мб данных, например. Может там есть какие-то параметры в фиде у биржи, чтобы сразу все по максимуму обрезать. Вар демон — который тянет фид, обрабатывает, кладет статику в файл. клиент который тянет статику и обновляет. но мне кажется на клиент тоже дохера данных выйдет (над смотреть), т.ч. там может быть придется обновлять данные частично по вебсокетам. которых пока у нас нет ;) короч я пока думаю ) Так то процедуры на innodb есть каие-то, но крон умеет ток раз в минуту пускаться, т.ч. над колхозить демон — тут без вариантов.
Тимофей Мартынов, я бы на твоем месте пошел по нестандартному пути, предложенному kbrobot. А именно, выгружал бы данные из терминала (только не QUIK, а Metatrader) с помощью робота (опять же не на Lua, а на MQL5, так как быстрее). И потом эти текстовые файлы использовал для обновления базы данных сервера. Причем лучше это делать не на скриптовом PHP языке, а на чем-нибудь более быстром, вроде C# / C++ / Python. На счет Python не уверен, но он вроде компилируемый. Почему так? Потому что так ты 1. сэкономишь на договоре с биржей. 2. у тебя данные будут быстрее обновляться, чем через 15 минут. 3. ты сможешь выгрузить больше данных, чем дает биржа, или меньше — только то, что тебе реально нужно. 4.терминал получает данные более быстро за счет оптимизированного протокола (там не HTTP используется), чем ты будешь их получать по HTTP/HTTPS в виде JSON. Но от PHP для данной задачи я тебе советую отказаться ибо он для этого не предназначен, он хорош для генерации веб-страниц. А базу надо наполнять чем-то более шустрым.
avatar
SciFi, я все равно не имею права без оплаты распространять никакие данные Мосбиржи
в чем проблема данные с плазы брать?
Александр, я думаю стандартная лицензия вряд ли позволяет «перенаправлять» данные с плазы. считай как перепродаёшь то, на что у биржи эксклюзивные права на продажу :) логин быстро отключат скорее всего.
avatar
ovazhnev, тимофей задержку сделает.
ovazhnev, думаешь будут отслеживать, что фидер берет их не ч/з хттп?)) и ... 
avatar
Александр, я не могу рилтайм давать
я могу давать ток с задержкой 15 минут
Тимофей Мартынов,  так, по моему у всех, финам например рт дает только своим зарегистрированным пользователям.
avatar
Тимофей Мартынов, ну сделай буфер на 15 минут. в интернете обычно так: ты парсишь тебя парсят. вообще кому нужны такие таблицы? на бирже сделано вполне удобно.
P.s. Кстати смарт-лаб открывается быстро с российских айпишников, а если айпишники иностранные часто даже главную страницу не грузит… что-то у хостера с каналами связи…
avatar
Если бы речь шла о виндовом сервере — я бы на нем сделал windows service который вытягивает данные с биржи, обрабатывает и сохраняет в БД.
Котировки меняются часто. все равно задержка 15 минут. Поэтому кмк нет необходимости городить пуш уведомления по каждому чиху, клиент должен получать все данные разом. Проще всего написать на клиенте скрипт который с определённой периодичностью получает с сервера данные в виде json и обновляет их на странице.
(сугубо моё имхо как виндовс программера)
avatar
1) фидер 2) парсер 3) агрегатор 4) форматтер
всего 4 потока, серверу ни холодно ни жарко, хули тут делать
а вообще взяли бы в эластик загнали и получили бы в готовом виде все, осталось бы только клиентам разослать по вебсокетам или аналогичным транспортом

На MySQL (и прочих SQL) слишком дорого и бестолково по ресурсам, нужна специализированная база данных, типа InfluxDB
influxdata.com/

avatar
Запрашиваю котировки по этой ссылке: www.micex.ru/issrpc/marketdata/stock/shares/daily/short/result.json?boardid=TQBR&lang=ru&secid=GAZP Возвращает json, трафика на порядок меньше, чем в xml-формате
avatar
ddyner, спасибо!
тут программисты еще не подрались?
avatar
Alexey_S, вот вот, в этом и вопрос
Тимофей Мартынов, 
1. По запросу. Запрашивать в json все за раз.
Вроде оно? moex.com/iss/engines/stock/markets/shares/securities.json
2. Чем запрашивать. Любым способом. Да хоть wget по крону.
3. Где хранить. Странно, что тут еще Оракл не предложили. :) Сиквел — это медленно и дорого. Бесплатная монга для такой задачи более чем подходит. Если уж так охота именно реляционную БД, то постгре на край. Хотя я, так понял, у тебя MySql используется? Можно и в нем хранить, если цель использовать то, что есть. Но NoSQL будет эффективнее (та же монга) В общем, тут нужны требования.
4. По трафику. Откуда гигабайты? У меня получилось ~150мб/сутки несжатого трафика при запросе раз в 5 минут (0,5х12х24)
5. По нагрузке. Раз в 5 минут 0.5мб. Это большая нагрузка на биржу? Думаю, нет

Если есть вопросы, обращайся!
avatar
Тимофей помоему совсем не услышал пожеланий посетителей. Зачем вся эта портянка нужна?

теги блога Тимофей Мартынов

....все тэги



UPDONW
Новый дизайн