Здравствуйте!
Помогите пожалуйста советом. Мне нужно написать ленту новостей на сайте подобно тому, как сделано на vk.com/feed но со своей спецификой. Точнее даже переписать, т.к. она уже есть, но очень сложна, писал я её давно и мне она очень не нравится.
Сайт вроде маркетплейса, в нём много пользователей и много всяких типов страниц. Написан на php+чистый js.
Сейчас сделано так: каждый тип страниц - это контекст, пользователь, совершая какое-то действие на странице (например, прокомментировав что-то) создаёт событие - номер пользователя - тип контекста и номер контекста. Также создаются подписки в другой таблице для всех пользователей, кто должен это событие увидеть. Вроде бы всё логично, но на деле из-за множества нестандартного функционала работает страшно медленно, разобраться сложно самому, если надо что-то добавить.
"работает страшно медленно" - что работает медленно - фронт? бэк?
Где именно тормозит - на отрисовке? на загрузке данных? на выборках из базы? на обработке выбранных данных?
Тормозит бэк на выборках из базы. Можно думать как его оптимизировать, но мне хочется услышать немного другое - как решить проблему ленты новостей архитектурно (в самом общем случае) так, чтобы это было красиво, просто и правильно на бэкенде?
Для нормальной работы такого функционала нужно несколько вещей:
- Пагинация на бэкенде с подгрузкой контента на фронте, для достижения быстроты действия.
- Реактивность. Отрисовка всех событий в режиме реального времени в DOM-дерево
- Event-хэндлеры, которые будут отслеживать изменение чего-либо, и давать знать об этом.
В вашем случае описана логика работы, но не описаны инструменты, которыми вы это добились. Дайте больше информации, пожалуйста
Если вы написали фронт на чистом js, то это мрак сильный. Самый простой совет - перейти на готовый фреймворк: Vue/Angular/React. Весь данный функционал описан там очень хорошо и реализуется за полчаса.
В вашем же случае, нужно использовать AJAX. Но я работал с ним очень давно, и не особо разобрался, поэтому мой совет возможно будет только ухудшением ситуации.
Можно, конечно, убрать нагрузку с клиента и поставить на сервер. Добавить воркера и очередь, в которую будут добавляться события, воркер в n-время будет высылать уведомления из очереди пользователям. Это снизит нагрузку на сервер, но вы потеряете в скорости информирования.
Мрак - согласен, но сейчас не в том дело. Скорость информирования тоже не очень важна. Аякс - там и сейчас всё на аяксе. Я не понимаю как сделать архитектуру всего этого хозяйства на бэкенде таким образом, чтобы это было просто, быстро и красиво.
Евгений Блинков, Ну как я описал выше:
- Пользователь совершает действие. Происходит запись в базу данных.
- Раз в n-минут или секунд, нужно по cron-у запускать задачу, которая будет из базы данных брать записи и после того, как они завершены, удалять из бд, и отправлять в фид эту запись
- Для контроля всего этого можно установить supervisor, он будет перезапускать процессы и следить за ними
"Пользователь совершает действие. Происходит запись в базу данных." -- какой должна быть эта запись? Какими таблицы? Вот, например, у меня сейчас 2 таблицы: events и subscriptions. Какими они должны быть? А может быть можно обойтись одной?