LINUX.ORG.RU

AJAX/Websocket + БД

 ,


1

2

Привет!

Пишу небольшую вебморду, которая будет просто отдавать данные из БД. Данные в БД - информация о работе некоторых скриптов - они пишут в одну таблицу время запуска\окончания работы, exit code и т.д., в другую - данные по промежуточным этапам своей работы, принцип тот же. С учетом того, что большой нагрузки не предвидится (максимум 3..4 простых инсерта в секунду в «пике») я взял sqlite (да и полноценный сервер БД тащить совсем не хочется).

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

Хочется сделать это все в реалтайме, но не могу понять как это делать правильно. Изначально планировал взять AJAX, с ним я уже сталкивался, да и сама технология, на мой взгляд, довольно простая - отправляй запросы, сервер его обрабатывает (селект в БД делает) и отдает ответ. Но потом почитал интернеты (и тут тоже топик завел), где и узнал о websocket'ах. WS показался интересным, решил в качестве сервера использовать tornado (python). С учетом того, что у меня планируются постоянные соединения клиент<>сервер и отправка данных не только по запросу пользователя, мне кажется что лучше будет не на каждый поток по определенному таймеру выполнять селекты той же статистики, а выбрать ее один раз и разослать клиентам. Не будет ли это слишком «тяжелой» задачей по сравнению с AJAX (там то клиентские запросы «размазаны» по времени) или все-таки каждый поток обрабатывать отдельно? Стоит ли использовать ws везде? То есть, например, статистику по текущим таскам и «лог» текущей задачи лучше показывать в реалтайме, а вот информацию о «последних 10 задачах» может вынести в AJAX и дергать раз в какие-нибудь 10 секунд (тут реалтайм не критичен)? Опять же везде пишут что ws хорошо работает с маленькими частыми порциями данных, но тут у меня получится что одна строчка из бд будет весить минимум байт 200 (хотя все равно меньше размера заголовков в случае AJAX получается). Всякую статику, я так понимаю, вообще нет смысла отдавать через websocket? В общем с виду технология крутая, но как правильно использовать - не пойму.

Ну и еще один вопрос вдогонку - стоит ли как-то кэшировать данные из sqlite, и если да то может что-то посоветуете?

Заранее спасибо!

★★★★★

Я когда писал подобную штуку тоже вначале SQLite брал, потом правда на постгрес перекатился. Короче предлагаю сделать так:

Данные из базы ты берёшь один раз, при загрузке страницы. Затем перед инсертом в базу публикуешь сообщение через redis или zmq, да что угодно, где есть pub sub. В торнаде подписываешься на канал и проксируешь сообщения на клиент. Таким образом не нужно будет насиловать сервер ежесекундными ajax запросами и прочим говном.

Может быть придут более опытные люди в этом деле и меня подправят, но как по мне — это вполне приемлемый вариант.

Kilte ★★★★★
()

Возможны небольшие несостыковки, когда страница уже загрузилась, но клиент ещё не успел подписаться. Думаю это не критично.

Kilte ★★★★★
()
Ответ на: комментарий от Kilte

Очень интересный вариант, спасибо огромное!! Даже, наверно, перепишу часть «другого» функционала с использованием такого подхода. Жаль что раньше не знал об этом.

alozovskoy ★★★★★
() автор топика
Последнее исправление: alozovskoy (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.