Всем привет, прошлые размышления побудили меня начать изучать API Голоса и выстраивать архитектуру будущего приложения.
В комментариях предлагали идти путем инициативы открытого кода, но изучив условия инициативы понял: я под них не подхожу. Ни по списку технологий (у меня php/mysql/mongo/свой движок), ни по условиям разработки. Стало очевидно, что игра "по правилам" будет сильно тормозить меня.
Итак, что буду делать сейчас, по порядку:
- Получения списка пользователей (сейчас их 49130);
- Обновление данных каждого пользователя (баланс, профиль).
Тут же столкнулся с проблемой поиска нормального мануала по работе с WebSocket на PHP. Отталкиваясь от публикации @t3ran13 удалось настроить работу этого класса: https://github.com/Textalk/websocket-php
Много времени ушло на попытки сделать свое решение, в интернете полно сырых исходников для работы с WebSocket, но в большинстве своем они бьются, зависают и т.д. Хотя желание уйти от текущего класса есть (он весит 16 Мегабайт, что для узко-заточенного инструмента очень много), возможно, вернусь к этому вопросу потом. Стоит отметить, что везде упоминается node.golos.ws, хотя сейчас актуальным является только wss://ws.golos.io
Итак, вернемся к получению списка юзеров, тут ничего сложного, советую инструмент http://golostools.ru/explorer/#method=lookup_accounts¶ms=["","1000"] - достаточно зациклить запрос с смещением и поместить всех пользователей в базу.
А вот получение текущего статуса пользователя - другое дело. get_accounts возвращает достаточно информации, но некоторые вещи пришлось обдумать. Во-первых, 50к аккаунтов, если запускать сбор/обновление каждую минуту по крону, надо рассчитать скорость и периодичность обновления для 1 аккаунта. Во-вторых, даты похожи на ISO 8601, но это не он, не сразу заметил ошибку в переделке дат в unixtime формат.
Рассмотрим вариант с ростом голоса в 10 раз, 500к аккаунтов. Естественно, большая часть из них проявляет минимальную активность, в связи с чем нужно выставлять приоритет для активных аккаунтов. Для этого подойдут 2 поля в базе данных - время последнего обновления и приоритет. За 1 минуту удается получить информацию по 250 аккаунтам. Думаю, это зависит и от нагрузки на API Голоса, и от активности аккаунта. Задержку между запросом информации я поставил 50 мс, она необходима, чтобы не перегружать собственный сервер (пробовал и 20 мс, и 100 мс - на количество обновленных аккаунтов в минуту особо не влияет).
Что получается - сейчас, чтобы обойти всю базу в 50к пользователей требуется 200 минут (на основе этого и поставил периодичность текущую в 5 часов). Что же будет, если рост Голоса произойдет в 10 раз? 500к юзеров, отдача от API сократится, допустим, в 5 раз. Это 10 000 минут или ~7 суток. Вполне понятно, что это теория и обход для обновления данных аккаунтов будет основываться на их активности. Критичного в этом ничего не вижу, для толстого клиента в самый раз.
В следующий раз планирую начать с архитектуры базы данных постов, комментариев и цикличности обновления. Если вам интересна эта тема и нравится мой слог, буду рад подписавшимся. Постараюсь не "сдуваться" и радовать вас аналитической информацией и данными по разработке толстого клиента для Голоса. Думаю, промежуточный прототип возможно будет запустить уже в июле.
А можно вопрос. А как вписывается толстый клиент в WEB?
Это ведь разные подходы.
Ошибаетесь. Понятие толстый клиент применимо и в WEB. Тонкие клиенты ограничены в обработке данных тем, что позволяет им API Голоса. Думаю, вы это заметите, если изучите больше постов с предложениями по улучшению Golos.io, или посты с "чего нам не хватает". Толстый клиент будет самостоятельным носителем контента, что позволит самостоятельно выбирать методы фильтрации, настройку профиля/подсайта пользователя и т.д.
Я думаю что толстый клиент это приложение на стороне клиента.
А тонкий клиент как раз и является
приложением в web.
Представил ссылки чтобы не быть голословным.
Начал писать вам ответ и он раздулся до целого отдельного поста.
@on1x спасибо за статью.
@php-node-client
я немного развиваю, но пока отвлекся на рейтинг и он малость заглох) на след неделе скорее всгео займусь опять)
Там я постарался сделть удобные запросы, чб без боли для использования голос/стим одновременно. Получилось уменьшить количество вилок. в общем, глянешь да сам решишь, надо оно тебе или нет)
По поводу опроса, рекомендую тебе сделать таблицу в которой будут лежать все актуальные данные. например ту же инфу по репутации можно получить как из поста автора так и из апвота, как и его силу) таким образом омешь ввести поля "ласт апдейт" для характеристик и обновлять ен все подряд, а скажем пользователей о которых не " слыхал" пару дней)
Отлично, спасибо =) Изучу на днях!
Класс весит 16 Мегабайт?
Именно! Речь про https://github.com/Textalk/websocket-php , если собрать его вместе с зависимостями - то папка раздувается до 16 Мегабайт. Это нонсенс!
Действительно кошмар. Я давно как-то экспериментировал с сокетами, так вроде одного класса вполне хватало для работы.
Если у вас есть ссылка на легкий класс работы с вебсокетами на php без десятка зависимостей - пришлите, пожалуйста ссылку. Будет и мне полезно и читателям.
Я когда к этому вернусь - опубликую в виде поста обязательно.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
sharker, t3ran13, damm, natasmr, gryph0n, kukusru, anomalywolf, myhardmoney, generationg
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
хорошая аналитика) спасибо за новую ноду
Я бы не назвал это нодой. Своя база, с своей структурой. Главная идея найти варианты сделать то, чего нельзя сейчас на Голосе (более сложные фильтры, сила голоса/репутация по тэгам и т.д., что обсуждается в последнее время в ветке).
ясно
Зачем обновлять всех пользователей по крону?
Может лучше парсить блокчейн Голоса по мере появления новых блоков и исходя из того, что в блоках записано - накатывать обновления в базе пользователей / статей / балансов / апвоутов и т.п.
Тогда у вас не будет пустой работы о "обновлению" неактивных аккаунтов и будет только производительная деятельность по учёту реальных изменений.
Тоже сразу об этом подумал.
Ответ, @primus, кроется в стеке php/mysql/mongo
От php стал не так просто уйти))
Это никак не связано с php, проблемы кроются совершенно в другом - желании построить свою простую архитектуру. Написал более подробный ответ в новом посте.
Ну пробуйте. Интересно потом будет узнать результаты при таком подходе.