Мой Агрегатор. Попытка №2.
Котаны, привет!
Заранее прошу прощения за отклонение от автотематики, но обещаю, что в ближайшие недели будет авторский пост про тормоза и их тюнинг, для исправления кармы :)
С момента выхода поста про первую версию агрегатора прошло больше 2-х лет. Но я не прекращал пилить и попутно набирался опыта в написании бэкэнда, работе с базами данных и фронтенде.
Если интересно, что получилось и с чем столкнулся в процессе разработки - велкам под кат.
Короче, на этой неделе запустил новую версию своего агрегатора, написанную с 0, по старому адресу: https://i-c-a.su
Что изменилось?
- Новый дизайн от дизайнера. Пришлось потратиться, потому что мои способности иссякли еще на первой версии :)
- За все теперь отвечает серверная часть: парсинг источников, хранение и обновление постов, формирование персональной ленты новостей и тд... Благодаря этому сайт открывается моментально.
- Для добавления собственных источников, сохранения истории просмотров, выставления лайков теперь необходимо зарегестрироваться. Это плата за скорость загрузки сайта.
- Да, теперь есть лайки!
- Список типов источников из которых можно добавлять свои источники расширен: кроме вк, мордокниги, и rss лент теперь можно добавить себе в ленту любой публичный аккаунт из instagram, twitter и youtube. Но отдельную гордость я испытываю за поддержку групп telegram.
- Да, можно читать в своей ленте любые публичные группы из telegram!
- Посты сразу открываются в новом окне, так как система с всплывающим iframe себя не оправдала на моб. устройствах.
Планы:
- Расширять список источников: imgur, rutube, reddit, новостные сайты.
- Привлечь ядро активных пользователей, что бы были данные для формирования ленты популярных постов;
- Добавить в ленту вывод видео и гифок, что бы сократить число внешних переходов;
- Е-маил рассылки с лучшими постами за день/неделю (естественно при желании пользователя);
- Сотрудничество с создателями контента для совместного продвижения.
Сложности при разработке.
Телеграм.
Самой интересной задачей было добавление поддержки телеграма. Сейчас он на слуху, но лично мне читать новости в приложении и в куче разных групп не удобно (хотя я и не пробовал:) ), а полноценной вэб версии у групп нет.
В начале я подумал, что проблем не будет, так как есть популярное Bot Api. И конечно меня ждало фиаско. Оказалось, что для того, что бы бот мог читать какой-то канал бота надо туда добавить. Поэтому вариант сразу отпал. И я перешел к чтению мануалов на основной API телеграма.
Через 30 минут изучения документации я был в отчаянии. Все данные у телеграма шифруются, что бы получить что то от их серверов нужно обладать степенью магистра по криптографии... Да и обычные http запросы - это не для них, только socket, только хардкор. Вообщем без сторонней помощи задача была нерешаемая.
Несколько дней поиска привели меня к решению: использовать на сервере opensource php телеграм клиент. Дада! Можно использовать телеграм под php, и там даже есть поддержка звонков! Это чудо называется madelineProto и исходники доступны на гитхабе.
В итоге, через 3 дня настройки и две блокировки моего аккаунта из за чрезмерного количества попыток авторизации я настроил клиент и решил задачу. Теперь у меня есть свой шлюз из telegram в web!
Youtube.
Api youtube вообще вышло забавно. Их справка предлагает использовать php плагин от гугла для доступа к апи. Помимо того, что он весит более 30 мегабайт, так я еще и не смог настроить его за 3 часа! В итоге кликая на все подряд в справке гугла, оказалось, что плагин можно вообще не использовать, а для получения всей информации - использовать стандартный get запрос. На формирование запроса мне понадобилось ровно 10 строк кода и 15 минут, вместо 30 мегабайтного плагина.
[режим_тролля]А потом люди удивляются, а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?[/режим_тролля] :)
Mysql.
Пока строк в базе мало, то сложно понять нужна ли дополнительная оптимизация запросам к базе. Но через месяц работы парсеров количество постов первалило за 100 тысяч, а я начал наблюдать первые плоды безудержного сбора информации: на формирование ленты требовалось уже около 1 секунды и это время постоянно росло. В результате курения EXPLAIN'ов и тестирования разных запросов оказалось что не используются нужные индексы и в процессе создаются временные таблицы, но я не мог понять почему это происходит.
Оказалось, что mysql выбирал неоптимальный индекс при группировке и сортировке. Проблема решилась добавлением конструкции USE KEY(post_id) и созданием дополнительных многоколоночный индексов. Кроме того, пришлось методом подбора выяснять какую именно таблицу использовать для группировки. В моем случае две таблицы имели одинаковые колонки post_id, по которым и происходило слияние таблиц, в обоих таблицах данная колонка имела индекс, но при использовании группировки по одной таблице - запрос происходил с созданием временной таблицы, а при использовании другой - нет.
Совет: Не используйте группировку без крайней необходимости!
После правок время выполнения запроса на сервере сократилось в 25 раз. Индексы рулят!
На этом, пожалуй, остановлюсь. Надеюсь, что новая версия кого нибудь заинтересует.
Буду рад любому фидбеку! Спасибо за внимание.
Заранее прошу прощения за отклонение от автотематики, но обещаю, что в ближайшие недели будет авторский пост про тормоза и их тюнинг, для исправления кармы :)
С момента выхода поста про первую версию агрегатора прошло больше 2-х лет. Но я не прекращал пилить и попутно набирался опыта в написании бэкэнда, работе с базами данных и фронтенде.
Если интересно, что получилось и с чем столкнулся в процессе разработки - велкам под кат.
Короче, на этой неделе запустил новую версию своего агрегатора, написанную с 0, по старому адресу: https://i-c-a.su
Что изменилось?
- Новый дизайн от дизайнера. Пришлось потратиться, потому что мои способности иссякли еще на первой версии :)
- За все теперь отвечает серверная часть: парсинг источников, хранение и обновление постов, формирование персональной ленты новостей и тд... Благодаря этому сайт открывается моментально.
- Для добавления собственных источников, сохранения истории просмотров, выставления лайков теперь необходимо зарегестрироваться. Это плата за скорость загрузки сайта.
- Да, теперь есть лайки!
- Список типов источников из которых можно добавлять свои источники расширен: кроме вк, мордокниги, и rss лент теперь можно добавить себе в ленту любой публичный аккаунт из instagram, twitter и youtube. Но отдельную гордость я испытываю за поддержку групп telegram.
- Да, можно читать в своей ленте любые публичные группы из telegram!
- Посты сразу открываются в новом окне, так как система с всплывающим iframe себя не оправдала на моб. устройствах.
Планы:
- Расширять список источников: imgur, rutube, reddit, новостные сайты.
- Привлечь ядро активных пользователей, что бы были данные для формирования ленты популярных постов;
- Добавить в ленту вывод видео и гифок, что бы сократить число внешних переходов;
- Е-маил рассылки с лучшими постами за день/неделю (естественно при желании пользователя);
- Сотрудничество с создателями контента для совместного продвижения.
Сложности при разработке.
Телеграм.
Самой интересной задачей было добавление поддержки телеграма. Сейчас он на слуху, но лично мне читать новости в приложении и в куче разных групп не удобно (хотя я и не пробовал:) ), а полноценной вэб версии у групп нет.
В начале я подумал, что проблем не будет, так как есть популярное Bot Api. И конечно меня ждало фиаско. Оказалось, что для того, что бы бот мог читать какой-то канал бота надо туда добавить. Поэтому вариант сразу отпал. И я перешел к чтению мануалов на основной API телеграма.
Через 30 минут изучения документации я был в отчаянии. Все данные у телеграма шифруются, что бы получить что то от их серверов нужно обладать степенью магистра по криптографии... Да и обычные http запросы - это не для них, только socket, только хардкор. Вообщем без сторонней помощи задача была нерешаемая.
Несколько дней поиска привели меня к решению: использовать на сервере opensource php телеграм клиент. Дада! Можно использовать телеграм под php, и там даже есть поддержка звонков! Это чудо называется madelineProto и исходники доступны на гитхабе.
В итоге, через 3 дня настройки и две блокировки моего аккаунта из за чрезмерного количества попыток авторизации я настроил клиент и решил задачу. Теперь у меня есть свой шлюз из telegram в web!
Youtube.
Api youtube вообще вышло забавно. Их справка предлагает использовать php плагин от гугла для доступа к апи. Помимо того, что он весит более 30 мегабайт, так я еще и не смог настроить его за 3 часа! В итоге кликая на все подряд в справке гугла, оказалось, что плагин можно вообще не использовать, а для получения всей информации - использовать стандартный get запрос. На формирование запроса мне понадобилось ровно 10 строк кода и 15 минут, вместо 30 мегабайтного плагина.
[режим_тролля]А потом люди удивляются, а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?[/режим_тролля] :)
Mysql.
Пока строк в базе мало, то сложно понять нужна ли дополнительная оптимизация запросам к базе. Но через месяц работы парсеров количество постов первалило за 100 тысяч, а я начал наблюдать первые плоды безудержного сбора информации: на формирование ленты требовалось уже около 1 секунды и это время постоянно росло. В результате курения EXPLAIN'ов и тестирования разных запросов оказалось что не используются нужные индексы и в процессе создаются временные таблицы, но я не мог понять почему это происходит.
Оказалось, что mysql выбирал неоптимальный индекс при группировке и сортировке. Проблема решилась добавлением конструкции USE KEY(post_id) и созданием дополнительных многоколоночный индексов. Кроме того, пришлось методом подбора выяснять какую именно таблицу использовать для группировки. В моем случае две таблицы имели одинаковые колонки post_id, по которым и происходило слияние таблиц, в обоих таблицах данная колонка имела индекс, но при использовании группировки по одной таблице - запрос происходил с созданием временной таблицы, а при использовании другой - нет.
Совет: Не используйте группировку без крайней необходимости!
После правок время выполнения запроса на сервере сократилось в 25 раз. Индексы рулят!
На этом, пожалуй, остановлюсь. Надеюсь, что новая версия кого нибудь заинтересует.
Буду рад любому фидбеку! Спасибо за внимание.
Огромный минус за php, MySql тоже под вопросом, сейчас рулит PostgreSQL, ну или MongoDB.
Для бекенда можно было node.js юзать. Вот неплохой получился аггрегатор новостей на node.js: https://top.st/
Это только у тех, у кого hype driven development.
И сравнивать яндекс и домашнюю поделку бессмысленная затея.
Сам по себе postgres очень ок. И монга наверняка для каких-то задач тоже ок.
Проблема в том, что инструменты надо выбирать под задачи, а не под 2018.
Вроде ж наоборот, его там ускорили в дофига раз. Значит используют под нагрузкой (вк и фб так точно используют). А значит есть способы не умирать.
Да и ни за что не поверю, что на пхп нельзя написать standalone вебсервер.
https://habrahabr.ru/post/320670/ - вот тут php 7.1.1 быстрее node 7.4.0 на 23%
Так ведь на запуск интерпретатора куча времени уходит. Зачем это делать на каждый запрос?
И я не уверен что в php сейчас все настолько просто. Например у php есть два разных менеджера процессов: FastCGI и PHP-FPM.
Вот что вики пишет:
"FastCGI, вместо того чтобы создавать новые процессы для каждого нового запроса, использует постоянно запущенные процессы для обработки множества запросов. Это позволяет экономить время."
А php-fpm, вроде, позволяет вообще несколько интерпретаторов в памяти держать.
Не силен в этих тонкостях администрирования.
Например, гугл считает, что сервер должен отвечать максимум за 200мс. И учитывает это в ранжировании.
FastCGI и PHP-FPM.
Вот я так и думал, что уже 100 лет назад даже в пхп решили эту проблему.
250 может?
44,06мс идет получение страницы без авторизации...
55мс с авторизацией...
Вот и смысл переходить с php?)
А вот тут Нода рвёт php: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=php
Причём PHP 7.2.0, а Node.js v9.4.0.
В таком случае спорить не буду - нода быстрее, только вот какой от нее толк если нормального клиента telegram под нее нет? :)
Нода перспективная вещь, и я бы хотел попробовать, что то на ней сварганить, но проект тогда бы растянулся еще на пару лет :)
Всегда можно написать свой)
>>но проект тогда бы растянулся еще на пару лет :)
Через пару лет, всё может изменится сильно. Та же Node.js - её создатель писал, что сейчас не видит для серверов ничего лучше, чем приложения на Go. А ноду только типо для всяких там сборок фронтенда :)
По поводу mysql - во первых на моем хостинге он уже стоит из коробки и не надо изобретать велосипед, а во вторых - не уверен что переход даст какие либо преимущества.
Тот же wix отказался от Монго в пользу Mysql https://habrahabr.ru/company/wix/blog/283158/
Да не проигрывает нода php. Я уже выше кидал нормальные тесты. На харбре там непонятно что. В каких-то местах может php и рвёт, но это незначительно и не показательно. В общем плане, node.js ложит php на лопатки, особенно если речь идёт о реалтайме. А если даже речь идёт о привычных для php вещей, node.js тоже быстрее.
Да суть даже не в тестах. php уже давно морально устарел. Никто сейчас не использует его для серьёзной разработки. Да, php 7 версии стал быстрее, но этого мало.
Тот же Wix, вполне мог не осилить монгу. Главное правильно настроить её. А хостинги? Какие хостинги? Сервера стоят копейки, ты сам выбираешь себе нужное окружение, а не то что тебе соизволит хостинг предоставить и настроить через одно место.
Хостинг может и стоит копейки, но я пока не готов самостоятельно администрировать свой сервер. Мне по душе дешманский виртуальный хостинг за 150 руб в месяц: ssl сертификаты без проблем на все домены, бекапы каждый день, почта настраивается в 2 клика, никаких критических уязвимостей от того, что я что то вовремя не обновил... У меня конечно есть опыт настройки сервера на cPanel, но это для меня та еще головная боль.
Опять же "сервера стоят копейки", так в чем смысл тратить время на создание сайта на node.js что бы ускорить его на 20%, если можно просто сервер помощнее арендовать? Выйдет гораздо дешевле :)
хех, если есть вопросы по cPanel обращайся, 10 лет стажа ебли с ней, хе-хе
PHP+Mysql классическая и довольно простая связка. А я люблю все простое, поддерживать потом легче будет :)
Пока она справляется прекрасно, нагрузка на сервер от парсинга вообще нулевая, учитывая что у меня еще и блог на WP на хостинге крутится, так вообще не представляю когда мне потребуется тариф пожирнее :)
Формирование ленты постов будет работать мгновенно до 100+ миллионов постов без проблем (есть опыт работы с реально большими mysql базами).
Так что еще бы дожить до тех времен, когда проект упрется в ограничения этой классической связки :)
Раскрой мысль, плиз.
Про обилие методов работы с массивами, встроенных в php я уж не говорю, там на любой чих есть встроенная функция: сортировка, слияние, присвоение ключей, shuffle, удаление одинаковых значений. И главное что все это работает для всех массивов: обычных и ассоциативных.
for(let key in a) console.log(`${key} in a`);
Про обилие методов работы с массивами, встроенных в php я уж не говорю, там на любой чих есть встроенная функция: сортировка, слияние, присвоение ключей, shuffle, удаление одинаковых значений. И главное что все это работает для всех массивов: обычных и ассоциативных.
С этим вообще проблем не вижу. Даже если чего-то и нет, то не проблема написать.
for(let key in a) console.log(`${key} in a`);
Неплохо, только вот этот подход тоже не без косяков, цитата из MDN: "лучше с числовыми индексами использовать циклы for, Array.prototype.forEach() или for...of, когда проходим по массивам, где важен порядок доступа к свойствам."
В php я всегда уверен в порядке данных в массиве, а в JS за этим надо следить, а то он может и пересортировать, как ему вздумается...
Да и вообще с данными JS как то не очень работает. Достаточно в консоли браузера 0.1 + 0.7 сложить и удивиться результату :)
Написано, что в 2012 году в php было также, но сейчас проверил - у меня выдает ровно 0.8...
"Даже если чего-то и нет, то не проблема написать."
Это время и силы, которые я лучше потрачу на что то другое.
Естественно не возникает никаких глобальных проблем с написанием функционала на JS. Но мое личное мнение: в плане логичности и удобства написания кода php мне нравится больше чем JS. При этом у меня пока не возникло потребности в "неуми
А, так тебе нужен sorted set? Ну тогда да. Но зачем он тебе нужен? И как часто?
Просто обычно людям нужен просто set ИЛИ просто массив.
В php я всегда уверен в порядке данных в массиве
В пхп у вас нет разницы между массивом и хешом. В результате производительность хеша падает. Ведь нельзя реализовать его на hashtable, или придётся отдельно от hashtable хранить ещё упорядоченный список ключей, а это доп.время на изменение и доп.память.
Да и вообще с данными JS как то не очень работает. Достаточно в консоли браузера 0.1 + 0.7 сложить и удивиться результату :)
Да, тут приколов много. Больше всего меня коробит то, что я не могу хранить число больше 2^53 кажись.
Это время и силы, которые я лучше потрачу на что то другое.
Сколько времени и сил тебе надо для написания простейшей функции для массива?
P.S.: у JS миллион проблем.
Многие из них похожи на пхп: из-за низкого порога входа (много тожепрограммистов пришло из верстальщиков) куча весьма низкокачественного кода.
Но много и своих: из-за попыток сохранения обратной совместимости любой ценой появляются какие-то извраты, а из-за попыток облегчения языка для тожепрограммистов в стандарт внедряются не особенно гибкие штуки (import/export модулей vs common.js).
Но тут мало что можно сделать то тех пор, пока webassembly не реализован в каждом чайнике. Поэтому до тех пор нам придётся терпеть js.
Из агрегаторов мне нравится https://pushkin.one
Само по себе это норм. Ну сокет и сокет.
Я вот недавно написал клиент для handlersocket протокола - дак вообще огонь.
[режим_тролля]А потом люди удивляются, а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?[/режим_тролля]
Вот это точно. Качество кода у гугла хромает во многих местах. При чём это системная проблема. И существует она лишь потому, что не особенно мешает бизнесу.
P.S.: коллаборативные рекомендации будут?
Ещё в тему: в состав Firefox 58, релиз которого ожидается на следующей неделе, завезут новый двухуровневый компилятор, который обеспечивает компиляцию промежуточного кода WebAssembly в 10-15 раз быстрее, чем используемый до этого оптимизирующий компилятор.
Это "сейчас" будет длиться ещё дофига лет.
Переход нельзя назвать свершившимся, если нужно отдавать и бинарник, и js браузерам, которые не поддерживают этот бинарник.
Не охота бетатестером работать и костыли изобретать для базовых вещей.
>>Не охота бетатестером работать и костыли изобретать для базовых вещей.
;)
А ты будешь писать ворох костылей и несколько реализаций одного и того же на зоопарке технологий из 2028.
https://habrahabr.ru/post/312022/
СММ кстати пользовались первой версией моего агрегатора, да. Мне писало пару человек. Мониторили соц сети конкурентов, вроде...
Но насчет переизбытка - согласен, я уже не успеваю всю свою ленту читать за сутки :( Надо сокращать количество подписок. Со старой версией такого небыло. Там жесткое ограничение в 10 постов с источника было и было ок :) А теперь можно залипнуть на полдня :(