Наконец то руки дошли до написания новости.
Версию "Мини" не трогал пока. Работал только с "большой" версией сайта. Собственно работа с большой версией "больше" похожа на разработку (воплощение задуманного в жизнь), работа же с "мини" это скорей портирование - идеи уже воплощены в "большой" версии, их нужно только аккуратно перенести из одной системы в другую.
Что было сделано с момента записи видео:
- Появилась возможность добавлять посты (вопросы, ответы, комменты)
- Переработал систему уведомлений - вот тут хочется сильно поразглагольствовать - постараюсь поменьше :)
Система уведомлений меня давно уже раздражала. На мой взгляд она была изначально криво спроектирована... Вот представьте себе таблицу. Каждое уведомление это отдельная строчка в такой таблице. У неё есть столбцы: от кого, кому, вопрос, ответ, коммент, пост в блоге, комент в блоге, тип уведомления, прочитано (да/нет), удалено(да/нет - для прочих уведомлений), дата. Уведомление о новом вопросе будет выглядеть как-то так: От кого - Вася, Кому - Пете, Ответ - ссылка на ответ Васи, поля вопрос, коммент, пост/коммент в блоге будут пустые (ведь речь не про них, а про ответ), прочитано - нет, удалено - нет, дата.
Сразу видна кривости - половина записей в таблице пустые (ведь речь идёт о чем-то одном - или об ответе или о комменте и тд).
Кроме того, в эту таблицу постоянно идёт запись. Уведомления создаются часто и помногу. Например когда Вы отвечаете на вопрос, создаются уведомления для автора вопроса, подписчиков на вопрос (если такие есть) и для всех Ваших подписчиков (Ваш ответ появляется у них в ответах друзей).
Я не очень хорошо разбираюсь в базах данных, но когда пытался понять причину "тормозов" сайта - пришёл к выводу, что уведомления создают большую нагрузку на базу.
Раньше получение новых уведомлений (пользователем) также создавало нагрузку (так как проводилась выборка по нескольким таблицам). А получение уведомлений присходит при каждой загрузки страницы, а также каждые 10 секунд, если Вы страницу не перезагружаете (и так для каждого пользователя и для каждого его окна). Эта проблема в своё время была решена введением кэшей - Ваши уведомления достаются из базы и кладутся к более быстрое место. В дальнейшем, когда Вы уведомления запрашиваете, они берутся не из базы, а из кэша. Когда для Вас создаётся новое уведомление, кэш удаляется и при последующем запросе генерируется снова.
Таким быстрым местом является Redis - своеобразная оперативная база данных. Работает в оперативной памяти, при этом периодически сохраняется на диск (чтоб не потерять данные). Быстрая (заявлено несколько сотен тысяч операций в секунду, тогда как обычная бд и 1 тысячи не сделает). Она не является SQL - делать по ней выборки затруднительно, так что использовать её как основную БД не получится. В ней хорошо хранить кэши и какие ни будь оперативные, временные данные.
Использовать я Redis начал где-то пол года назад, для кэшей и очереди (например задача по отправки писем довольно долгая, она просто ставится в очередь и Вам не нужно ждать её завершения, чтобы загрузить следующую страницу). И уже тогда я задался вопросом, а можно ли его использовать ещё для чего-то? Например для уведомлений. В общем придумал я способ это сделать... 2 недели на это ушло. В данный момент нет уведомлений о личных сообщений и новостей проекта (они генерятся по особому) - их сделаю когда будут готовы личка и блоги. Ну и тестирования всякие ещё требуются, но в данный момент я доволен. Теперь можно отказаться от кэшей для уведомлений (а кэш это дополнительная задержка)
- Информация об активности пользователя также переехала в Redis - каждую Вашу активность в базу записывается время этой самой активности (по нему потом определяется, онлайн Вы или нет). Теперь это также переехало в Redis, где ему самое место.
Также в Redis хотелось бы перенести информацию о количестве просмотров, лайков и ответов - это хоть и не временная информация, но её можно восстановить в случае потери. Но эта информация нужна для подбора случайного вопроса и ТОП 10 вопросов (пока не придумал, как это с Redis подружить).
Из минусов - в данный момент у нового приложения нет совместимости с текущей базой. И если я хочу её восстановить - придётся внедрять новые системы в текущий сайт. Это сделать придётся - я хочу, чтоб старая (текущая) и новая версия сайта могли работать с одной базой, то есть существовать параллельно какое-то время. Это позволило бы выявлять проблемы новой версии и исправлять их, а пользователь при желании мог бы переключиться на старую (текущую) версию.
- Сделал страницу прочих уведомлений (колокольчик) - они также берутся из Redis:
- Сделал страницу друзей/подписчиков:
Сверху находится фильтр - все или только онлайн. Фильтр работает быстро, так как не делает запросы к серверу.
- Частично реализовал чёрный список - Вы не можете ответить на вопрос, если его автор у Вас в чс (или Вы у него), Вы не можете прокомментировать ответ, если его автор или автор вопрос у Вас в ЧС (или Вы у него)
- Немного поигрался со шрифтами и цветом. Что получилось - ниже (скажите, какой вариант Вам кажется наиболее удачным, я пока на первом остановился). Это просто эксперимент, думаю к моменту релиза это ещё изменится :) В идеале бы сделать сменные темы (чтоб пользователь мог сам их менять), но пока я не разобрался с этим (возможно потом разберусь).
Изначальный вариант:
Вариант 1:
Вариант 2:
Вариант 3:
Подбирал цвета на https://coolors.co/
Чего дальше?
Думаю надо разобраться с постраничным выводом - автопогрузка при прокрутке или при нажатии на кнопку "загрузить ещё".
Личка (в данный момент кажется чем-то сложным)
Блоги
Редактирование профиля - тоже задача, которую считаю сложной. Хотелось бы сделать возможность редактирования аватарки перед загрузкой - осилю или нет - пока не знаю...
Много чего ещё на самом деле... Буду стараться оставаться на связи :)
Версию "Мини" не трогал пока. Работал только с "большой" версией сайта. Собственно работа с большой версией "больше" похожа на разработку (воплощение задуманного в жизнь), работа же с "мини" это скорей портирование - идеи уже воплощены в "большой" версии, их нужно только аккуратно перенести из одной системы в другую.
Что было сделано с момента записи видео:
- Появилась возможность добавлять посты (вопросы, ответы, комменты)
- Переработал систему уведомлений - вот тут хочется сильно поразглагольствовать - постараюсь поменьше :)
Система уведомлений меня давно уже раздражала. На мой взгляд она была изначально криво спроектирована... Вот представьте себе таблицу. Каждое уведомление это отдельная строчка в такой таблице. У неё есть столбцы: от кого, кому, вопрос, ответ, коммент, пост в блоге, комент в блоге, тип уведомления, прочитано (да/нет), удалено(да/нет - для прочих уведомлений), дата. Уведомление о новом вопросе будет выглядеть как-то так: От кого - Вася, Кому - Пете, Ответ - ссылка на ответ Васи, поля вопрос, коммент, пост/коммент в блоге будут пустые (ведь речь не про них, а про ответ), прочитано - нет, удалено - нет, дата.
Сразу видна кривости - половина записей в таблице пустые (ведь речь идёт о чем-то одном - или об ответе или о комменте и тд).
Кроме того, в эту таблицу постоянно идёт запись. Уведомления создаются часто и помногу. Например когда Вы отвечаете на вопрос, создаются уведомления для автора вопроса, подписчиков на вопрос (если такие есть) и для всех Ваших подписчиков (Ваш ответ появляется у них в ответах друзей).
Я не очень хорошо разбираюсь в базах данных, но когда пытался понять причину "тормозов" сайта - пришёл к выводу, что уведомления создают большую нагрузку на базу.
Раньше получение новых уведомлений (пользователем) также создавало нагрузку (так как проводилась выборка по нескольким таблицам). А получение уведомлений присходит при каждой загрузки страницы, а также каждые 10 секунд, если Вы страницу не перезагружаете (и так для каждого пользователя и для каждого его окна). Эта проблема в своё время была решена введением кэшей - Ваши уведомления достаются из базы и кладутся к более быстрое место. В дальнейшем, когда Вы уведомления запрашиваете, они берутся не из базы, а из кэша. Когда для Вас создаётся новое уведомление, кэш удаляется и при последующем запросе генерируется снова.
Таким быстрым местом является Redis - своеобразная оперативная база данных. Работает в оперативной памяти, при этом периодически сохраняется на диск (чтоб не потерять данные). Быстрая (заявлено несколько сотен тысяч операций в секунду, тогда как обычная бд и 1 тысячи не сделает). Она не является SQL - делать по ней выборки затруднительно, так что использовать её как основную БД не получится. В ней хорошо хранить кэши и какие ни будь оперативные, временные данные.
Использовать я Redis начал где-то пол года назад, для кэшей и очереди (например задача по отправки писем довольно долгая, она просто ставится в очередь и Вам не нужно ждать её завершения, чтобы загрузить следующую страницу). И уже тогда я задался вопросом, а можно ли его использовать ещё для чего-то? Например для уведомлений. В общем придумал я способ это сделать... 2 недели на это ушло. В данный момент нет уведомлений о личных сообщений и новостей проекта (они генерятся по особому) - их сделаю когда будут готовы личка и блоги. Ну и тестирования всякие ещё требуются, но в данный момент я доволен. Теперь можно отказаться от кэшей для уведомлений (а кэш это дополнительная задержка)
- Информация об активности пользователя также переехала в Redis - каждую Вашу активность в базу записывается время этой самой активности (по нему потом определяется, онлайн Вы или нет). Теперь это также переехало в Redis, где ему самое место.
Также в Redis хотелось бы перенести информацию о количестве просмотров, лайков и ответов - это хоть и не временная информация, но её можно восстановить в случае потери. Но эта информация нужна для подбора случайного вопроса и ТОП 10 вопросов (пока не придумал, как это с Redis подружить).
Из минусов - в данный момент у нового приложения нет совместимости с текущей базой. И если я хочу её восстановить - придётся внедрять новые системы в текущий сайт. Это сделать придётся - я хочу, чтоб старая (текущая) и новая версия сайта могли работать с одной базой, то есть существовать параллельно какое-то время. Это позволило бы выявлять проблемы новой версии и исправлять их, а пользователь при желании мог бы переключиться на старую (текущую) версию.
- Сделал страницу прочих уведомлений (колокольчик) - они также берутся из Redis:
- Сделал страницу друзей/подписчиков:
Сверху находится фильтр - все или только онлайн. Фильтр работает быстро, так как не делает запросы к серверу.
- Частично реализовал чёрный список - Вы не можете ответить на вопрос, если его автор у Вас в чс (или Вы у него), Вы не можете прокомментировать ответ, если его автор или автор вопрос у Вас в ЧС (или Вы у него)
- Немного поигрался со шрифтами и цветом. Что получилось - ниже (скажите, какой вариант Вам кажется наиболее удачным, я пока на первом остановился). Это просто эксперимент, думаю к моменту релиза это ещё изменится :) В идеале бы сделать сменные темы (чтоб пользователь мог сам их менять), но пока я не разобрался с этим (возможно потом разберусь).
Изначальный вариант:
Вариант 1:
Вариант 2:
Вариант 3:
Подбирал цвета на https://coolors.co/
Чего дальше?
Думаю надо разобраться с постраничным выводом - автопогрузка при прокрутке или при нажатии на кнопку "загрузить ещё".
Личка (в данный момент кажется чем-то сложным)
Блоги
Редактирование профиля - тоже задача, которую считаю сложной. Хотелось бы сделать возможность редактирования аватарки перед загрузкой - осилю или нет - пока не знаю...
Много чего ещё на самом деле... Буду стараться оставаться на связи :)