Задать вопрос
evgeniy2194
@evgeniy2194
PHP, js developer

SocketIO + Laravel + Redis + MySQL. как быть?

Доброго времени суток.

Сейчас имеем:
Laravel - API
Node + Socket.io - ws
Redis - прослойка между api и ws для отправки push уведомлений + кеш и т.д

Пишу что-то похожее на месседжер, но со своей изюминкой.

Как правильно реализовать общение Клиент -> ws -> api -> mysql.

Возьмем для примера сообщения. Сейчас имеем:
Клиент отправляет сообщение Node -> Node отправляет сообщение API -> api пишет в базу
                               |
                Node рассылает сообщение клиентам.


Пример заявок в друзья:
Клиент шлет ajax API -> api пишет в базу -> api отправляет событие на nodejs через redis ->
 nodejs рассылает клиенту.


Или может клиент должен слать через сокет, а тот в свою очередь на апи?

Как реализовать данную схему? Как должно работать в идеале и кто за что должен отвечаеть? Должа ли Node смотреть в базу? Или общаться с базой через Апи? Помогите советами пожалуйста.
  • Вопрос задан
  • 1610 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
На мой взгляд здесь Laravel пришит сбоку с припеку. Node.js умеет работать с MySQL.
Я бы подобный сервис реализовал следующим образом:
Node.js в качестве основного сервера с API и траспортом данных через Socket.io.
Redis в качестве шины сообщений между инстансами Node.js сервера.
Веб-сокеты позволяют обмен данными и пересылку файлов. Ajax в целом вам тут и не нужен.

IMHO, отправка сообщения должна выглядеть следующим образом:
Node.js принимает сообщение из сокетов, выдает идентификатор сообщению и далее передает его по шине сообщений (Redis). На шине несколько слушателей, один из которых отвечает за сохранение данных в базе, а другие рассылают сообщения клиентам.

Заявка в друзья выглядит следующим образом:
Node.js принимает сообщение из веб-сокетов, сохраняет в базу, отправляет запрос по шине сообщений получателю.

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

Хочу добавить пару моментов, которые нужно учитывать при разработке приложения.
1. У вас может быть запущено несколько инстансов приложения как на одном сервере, так и на разных.
2. Нужно контролировать момент, когда система пытается переотправить сообщение в случае потери соединения с инстансом - часто случается при ненадежном соединении с сетью, особенно в мобильных сетях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Kostik_1993
Web Developer
Если в качестве API у вас Laravel, то тогда Node должен быть только как посредник между клиентом и API, а именно его задача такая, когда API вызывает некое событие и отправляет его в Redis на определенный канал. В свою очредь Node должен слушать изменения в редисе, и когда такое событие появляется, Node через WebSocket отправляет его клиентам, которые подписаны на канал. Тоесть если у вас API на Laravel, то Node не должен лезть в базу, а всеголишь слушать редис.

Другое дело когда в качестве сервера у вас Node. Тогда вам редис тут и не нужен, всей обработкой занимается нод и он же самостоятельно шлет данные в канал
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы