Написать пост

Xtrime

Мой Агрегатор. Попытка №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 раз. Индексы рулят!

На этом, пожалуй, остановлюсь. Надеюсь, что новая версия кого нибудь заинтересует.
Буду рад любому фидбеку! Спасибо за внимание.

60 комментариев нравится избранное
  • J1mm
    19 янв 2018 в 23:40
    Ты конечно молодец, но набор инструментов не для 2018 года.

    Огромный минус за php, MySql тоже под вопросом, сейчас рулит PostgreSQL, ну или MongoDB.
    Для бекенда можно было node.js юзать. Вот неплохой получился аггрегатор новостей на node.js: https://top.st/
    • Q2W
      8 19 янв 2018 в 23:45
      MySql тоже под вопросом, сейчас рулит PostgreSQL, ну или MongoDB.
      Это только у тех, у кого hype driven development.
      • J1mm
        19 янв 2018 в 23:46
        Нет. Всякие там Яндексы, вон тоже на PostgreSQL переехали с почтой.
        • Q2W
          8 19 янв 2018 в 23:47
          Так они с оракла переезжали.
          И сравнивать яндекс и домашнюю поделку бессмысленная затея.
        • Q2W
          19 янв 2018 в 23:49
          И вообще мой тезис про hype driven development был больше про набор инструментов не для 2018 года.
          Сам по себе postgres очень ок. И монга наверняка для каких-то задач тоже ок.

          Проблема в том, что инструменты надо выбирать под задачи, а не под 2018.
          • J1mm
            20 янв 2018 в 00:19
            Есть же устаревшие инструменты, вот php всегда умирает после выполнения, на нём в реальном времени хрен что запилишь, а нода пашет в режиме реального времени.
            • Q2W
              1 20 янв 2018 в 00:32
              Странные у пхп проблемы.
              Вроде ж наоборот, его там ускорили в дофига раз. Значит используют под нагрузкой (вк и фб так точно используют). А значит есть способы не умирать.
              Да и ни за что не поверю, что на пхп нельзя написать standalone вебсервер.
              • Xtrime
                20 янв 2018 в 00:36
                А что плохого что пхп умирает после выполниения задачи? Ну особенность у него такая. Главное - это результат.

                https://habrahabr.ru/post/320670/ - вот тут php 7.1.1 быстрее node 7.4.0 на 23%
                • Q2W
                  20 янв 2018 в 00:38
                  А что плохого что пхп умирает после выполниения задачи?
                  Так ведь на запуск интерпретатора куча времени уходит. Зачем это делать на каждый запрос?
                  • Xtrime
                    20 янв 2018 в 00:51
                    Какая разница, если такой подход в классических задач быстрее?:)

                    И я не уверен что в php сейчас все настолько просто. Например у php есть два разных менеджера процессов: FastCGI и PHP-FPM.

                    Вот что вики пишет:

                    "FastCGI, вместо того чтобы создавать новые процессы для каждого нового запроса, использует постоянно запущенные процессы для обработки множества запросов. Это позволяет экономить время."

                    А php-fpm, вроде, позволяет вообще несколько интерпретаторов в памяти держать.

                    Не силен в этих тонкостях администрирования.
                    • Q2W
                      20 янв 2018 в 10:42
                      Какая разница, если такой подход в классических задач быстрее?:)
                      Например, гугл считает, что сервер должен отвечать максимум за 200мс. И учитывает это в ранжировании.

                      FastCGI и PHP-FPM.
                      Вот я так и думал, что уже 100 лет назад даже в пхп решили эту проблему.
                      • Xtrime
                        20 янв 2018 в 13:12
                        У меня локальный сервер отдает данные за 25мс - 50мс из которых большая часть времени это sql запрос. Поэтому я и не горю желанием мигрировать с php. Работает — не трогаю.
                        • Q2W
                          20 янв 2018 в 22:03
                          за 25мс - 50мс из которых
                          250 может?
                          • Xtrime
                            20 янв 2018 в 23:39
                            Локальный не стал проверять, проверил сразу боевой:

                            44,06мс идет получение страницы без авторизации...
                            55мс с авторизацией...

                            Вот и смысл переходить с php?)


                            • Q2W
                              21 янв 2018 в 15:02
                              Ну норм, отличное время.
                • J1mm
                  20 янв 2018 в 01:13
                  >>вот тут php 7.1.1 быстрее node 7.4.0 на 23%

                  А вот тут Нода рвёт php: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=php

                  Причём PHP 7.2.0, а Node.js v9.4.0.
                  • Xtrime
                    20 янв 2018 в 01:38
                    На хабре уточнение к другому посту есть https://habrahabr.ru/post/323208/, в ноде неоптимальный конект к базе был, после обновления кода нода процентов на 20 быстрее стала.

                    В таком случае спорить не буду - нода быстрее, только вот какой от нее толк если нормального клиента telegram под нее нет? :)

                    Нода перспективная вещь, и я бы хотел попробовать, что то на ней сварганить, но проект тогда бы растянулся еще на пару лет :)
                    • J1mm
                      20 янв 2018 в 02:04
                      >>вот какой от нее толк если нормального клиента telegram под нее нет? :)

                      Всегда можно написать свой)

                      >>но проект тогда бы растянулся еще на пару лет :)

                      Через пару лет, всё может изменится сильно. Та же Node.js - её создатель писал, что сейчас не видит для серверов ничего лучше, чем приложения на Go. А ноду только типо для всяких там сборок фронтенда :)
    • Xtrime
      20 янв 2018 в 00:45
      По поводу node уже ответил, по тестам он проигрывает. Да и сам js как язык мне нравится гораздо меньше, чем php. В js даже нормальных ассоциативных массивов нет...

      По поводу mysql - во первых на моем хостинге он уже стоит из коробки и не надо изобретать велосипед, а во вторых - не уверен что переход даст какие либо преимущества.

      Тот же wix отказался от Монго в пользу Mysql https://habrahabr.ru/company/wix/blog/283158/
      • J1mm
        20 янв 2018 в 01:21
        >>По поводу node уже ответил, по тестам он проигрывает.

        Да не проигрывает нода php. Я уже выше кидал нормальные тесты. На харбре там непонятно что. В каких-то местах может php и рвёт, но это незначительно и не показательно. В общем плане, node.js ложит php на лопатки, особенно если речь идёт о реалтайме. А если даже речь идёт о привычных для php вещей, node.js тоже быстрее.

        Да суть даже не в тестах. php уже давно морально устарел. Никто сейчас не использует его для серьёзной разработки. Да, php 7 версии стал быстрее, но этого мало.

        Тот же Wix, вполне мог не осилить монгу. Главное правильно настроить её. А хостинги? Какие хостинги? Сервера стоят копейки, ты сам выбираешь себе нужное окружение, а не то что тебе соизволит хостинг предоставить и настроить через одно место.
        • Xtrime
          1 20 янв 2018 в 01:52
          По ноде соглашусь, по последним тестам она процентов на 20 быстрее. Но не использовать php для серьезной разработки? Помоему это преувеличение. Крупные проекты на php есть и будут. Как минимум потому, что специалисты по php есть, а хороших специалистов всегда не хватает.

          Хостинг может и стоит копейки, но я пока не готов самостоятельно администрировать свой сервер. Мне по душе дешманский виртуальный хостинг за 150 руб в месяц: ssl сертификаты без проблем на все домены, бекапы каждый день, почта настраивается в 2 клика, никаких критических уязвимостей от того, что я что то вовремя не обновил... У меня конечно есть опыт настройки сервера на cPanel, но это для меня та еще головная боль.

          Опять же "сервера стоят копейки", так в чем смысл тратить время на создание сайта на node.js что бы ускорить его на 20%, если можно просто сервер помощнее арендовать? Выйдет гораздо дешевле :)
          • Kalashmatik
            2 20 янв 2018 в 04:28
            У меня конечно есть опыт настройки сервера на cPanel, но это для меня та еще головная боль.

            хех, если есть вопросы по cPanel обращайся, 10 лет стажа ебли с ней, хе-хе
            • Xtrime
              20 янв 2018 в 13:17
              Ок, у меня в отдаленных планах переезд на vps в нидерландах, так что может быть обращусь :)
        • Xtrime
          1 20 янв 2018 в 02:00
          И кстати у меня вообще вопрос не стоял какой стек использовать - я работаю в том стеке, где есть опыт. "Самый короткий путь - это тот, который знаешь".

          PHP+Mysql классическая и довольно простая связка. А я люблю все простое, поддерживать потом легче будет :)

          Пока она справляется прекрасно, нагрузка на сервер от парсинга вообще нулевая, учитывая что у меня еще и блог на WP на хостинге крутится, так вообще не представляю когда мне потребуется тариф пожирнее :)
          Формирование ленты постов будет работать мгновенно до 100+ миллионов постов без проблем (есть опыт работы с реально большими mysql базами).

          Так что еще бы дожить до тех времен, когда проект упрется в ограничения этой классической связки :)
      • Q2W
        20 янв 2018 в 10:43
        В js даже нормальных ассоциативных массивов нет...
        Раскрой мысль, плиз.
        • Xtrime
          20 янв 2018 в 13:01
          В js вместо ассоциативных массивов используются обьекты, они в целом похожи, но возникают неудобства. Например я хочу пройтись по всем элементам. Obj.foreach - выдаст ошибку, так как это не массив. Нужно делать чеез костыль: Object.keys(obj).foreach

          Про обилие методов работы с массивами, встроенных в php я уж не говорю, там на любой чих есть встроенная функция: сортировка, слияние, присвоение ключей, shuffle, удаление одинаковых значений. И главное что все это работает для всех массивов: обычных и ассоциативных.
          • Q2W
            20 янв 2018 в 22:06
            let a = {a: 1, b: 2};
            for(let key in a) console.log(`${key} in a`);

            Про обилие методов работы с массивами, встроенных в php я уж не говорю, там на любой чих есть встроенная функция: сортировка, слияние, присвоение ключей, shuffle, удаление одинаковых значений. И главное что все это работает для всех массивов: обычных и ассоциативных.
            С этим вообще проблем не вижу. Даже если чего-то и нет, то не проблема написать.
            • Xtrime
              21 янв 2018 в 00:03
              let a = {a: 1, b: 2};
              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. При этом у меня пока не возникло потребности в "неуми
              • Q2W
                21 янв 2018 в 15:11
                Неплохо, только вот этот подход тоже не без косяков, цитата из MDN: "лучше с числовыми индексами использовать циклы for, Array.prototype.forEach() или for...of, когда проходим по массивам, где важен порядок доступа к свойствам."

                А, так тебе нужен sorted set? Ну тогда да. Но зачем он тебе нужен? И как часто?
                Просто обычно людям нужен просто set ИЛИ просто массив.

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

                Да и вообще с данными JS как то не очень работает. Достаточно в консоли браузера 0.1 + 0.7 сложить и удивиться результату :)
                Да, тут приколов много. Больше всего меня коробит то, что я не могу хранить число больше 2^53 кажись.

                Это время и силы, которые я лучше потрачу на что то другое.
                Сколько времени и сил тебе надо для написания простейшей функции для массива?

                P.S.: у JS миллион проблем.
                Многие из них похожи на пхп: из-за низкого порога входа (много тожепрограммистов пришло из верстальщиков) куча весьма низкокачественного кода.
                Но много и своих: из-за попыток сохранения обратной совместимости любой ценой появляются какие-то извраты, а из-за попыток облегчения языка для тожепрограммистов в стандарт внедряются не особенно гибкие штуки (import/export модулей vs common.js).
                Но тут мало что можно сделать то тех пор, пока webassembly не реализован в каждом чайнике. Поэтому до тех пор нам придётся терпеть js.
    • Xtrime
      20 янв 2018 в 00:59
      https://top.st/ - что то меня не впечатлил :) Какие именно задачи решило использование node?

      Из агрегаторов мне нравится https://pushkin.one
      • J1mm
        20 янв 2018 в 01:22
        Где-то была статья автора на хабре.
    • andrewcocos
      22 янв 2018 в 14:22
      PostgreSQL иногда такие подкидывает сюрпризы, ска.
  • J1mm
    19 янв 2018 в 23:43
    Если прокрутить до конца, то новые посты не появляются. Только сообщение, типо потяните вниз.
    • J1mm
      19 янв 2018 в 23:44
      Спишем на то, что Ангуляр УГ )))
      • Xtrime
        20 янв 2018 в 00:34
        Хм... А че за браузер? Это подобие инфинити-скролла я на scrollMonitor.js писал. Консоль что то пишет? В firefox бывают траблы, там вообще .scroll() не работает, надо в другой вкладке открыть >_
        • J1mm
          20 янв 2018 в 01:23
          Да, Firefox) Я же говорю, Ангуляр тот ещё фрамеворк) Взял бы ты React или Vue) Vue проще всего.
          • Xtrime
            20 янв 2018 в 02:01
            Не в Ангуляре дело. Триггер на скролл через последний jquery установлен. Надо переписать на ваниль этот кусок значит... Или новый FF или JQ подождать :)
            • J1mm
              1 20 янв 2018 в 04:11
              Эм. Ты используешь angular и ещё jquery юзаешь?
              • Xtrime
                20 янв 2018 в 13:02
                Да, в ангуляре очень убогие анимации. Приходится вместе использовать для эстетического удоволствия.
          • Xtrime
            20 янв 2018 в 02:03
            Хотя куда уж проще то? Ума не приложу почему в FF иногда .scroll() не работает:

            • Xtrime
              20 янв 2018 в 02:48
              Попробовал различные версии jquery - в начиная с 2.2.4 и заканчивая 3.3.0 выпущенной 5 часов назад. В 2.2.4 бага нет :) Походу переоптимизировали что то в третьем jq...
              • J1mm
                20 янв 2018 в 04:12
                Я с тебя вообще в шоке) Используешь Angular, а ещё зачем-то тянешь поделие из прошлого века jQuery :)
                • Xtrime
                  20 янв 2018 в 13:03
                  Старое не значит плохое :)

                • Xtrime
                  20 янв 2018 в 13:06
  • Q2W
    19 янв 2018 в 23:44
    только socket, только хардкор
    Само по себе это норм. Ну сокет и сокет.
    Я вот недавно написал клиент для handlersocket протокола - дак вообще огонь.

    [режим_тролля]А потом люди удивляются, а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?[/режим_тролля]
    Вот это точно. Качество кода у гугла хромает во многих местах. При чём это системная проблема. И существует она лишь потому, что не особенно мешает бизнесу.

    P.S.: коллаборативные рекомендации будут?
    • J1mm
      19 янв 2018 в 23:45
      Кстати, на сокетах уже много всего работает.
      • Q2W
        19 янв 2018 в 23:46
        Я тебе больше скажу: на сокетах работает вообще всё, что работает на сетевых протоколах =).
        • Xtrime
          20 янв 2018 в 00:55
          По сравнению с простым и понятным http, socket для меня - темный лес. Хотя щас прочитал что CURL теперь может отправлять запросы в сокет, уже не все так страшно :)
  • J1mm
    20 янв 2018 в 01:27
    А вообще, веб переходит сейчас на компилируемые языки - Go, Rust. И даже на клиентскую сторону, с помощью WebAssembly.

    Ещё в тему: в состав Firefox 58, релиз которого ожидается на следующей неделе, завезут новый двухуровневый компилятор, который обеспечивает компиляцию промежуточного кода WebAssembly в 10-15 раз быстрее, чем используемый до этого оптимизирующий компилятор.
    • Q2W
      20 янв 2018 в 10:46
      А вообще, веб переходит сейчас на компилируемые языки - Go, Rust. И даже на клиентскую сторону, с помощью WebAssembly.
      Это "сейчас" будет длиться ещё дофига лет.
      Переход нельзя назвать свершившимся, если нужно отдавать и бинарник, и js браузерам, которые не поддерживают этот бинарник.
      • Xtrime
        20 янв 2018 в 13:16
        Вот через 10 лет можно сразу и прыгнуть в новый стек, без всякий промежуточных вариантов :)
        Не охота бетатестером работать и костыли изобретать для базовых вещей.
        • J1mm
          20 янв 2018 в 20:29
          Через 10 лет, будут уже совсем другие технологии) Но ты скажешь, что:

          >>Не охота бетатестером работать и костыли изобретать для базовых вещей.

          ;)
          • Q2W
            20 янв 2018 в 22:08
            За то эти webassembly будут работать в каждой кофемолке.

            А ты будешь писать ворох костылей и несколько реализаций одного и того же на зоопарке технологий из 2028.
            • J1mm
              20 янв 2018 в 23:45
              Зато в 2030 - обещали сингулярность завести!)
              • Xtrime
                21 янв 2018 в 00:07
                Стандарты вэбразработки будут устаревать быстрее, чем их кто либо будет успевать изучить? :)

                https://habrahabr.ru/post/312022/
                • J1mm
                  21 янв 2018 в 04:35
                  Это сейчас так) А потом, люди уже не смогут угнаться за технологиями.
  • Vaes
    1 22 янв 2018 в 18:07
    Немного не по теме. Но лично я наоборот - стремлюсь сократить потребление контента и уж тем более никаким образом его агрегировать... Я бы позиционировал этот сервис для SMM-специалистов или контентщиков...
    • J1mm
      22 янв 2018 в 20:01
      +1. Столько времени на всё это тратится. А потом думаешь и что? Вроде и прочитал дофига всего, а толку никакого. Лучше по улице это время пройтись. А может старый стал :)
      • Q2W
        22 янв 2018 в 23:41
        Да нет, переизбыток информации - бич современного мозга.
        • Xtrime
          23 янв 2018 в 15:58
          Я на мемасиках мозг после трудного дня перед сном отключаю :)

          СММ кстати пользовались первой версией моего агрегатора, да. Мне писало пару человек. Мониторили соц сети конкурентов, вроде...

          Но насчет переизбытка - согласен, я уже не успеваю всю свою ленту читать за сутки :( Надо сокращать количество подписок. Со старой версией такого небыло. Там жесткое ограничение в 10 постов с источника было и было ок :) А теперь можно залипнуть на полдня :(
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста, или зарегистрируйтесь.