ivanvorobei
@ivanvorobei
iOS разработчик, канал https://t.me/sparrowcode

Добавить месенджер к rest api?

Реализовал Rest API на Laravel (вообще на Lumen, но одна печка) для проекта. Все в лучших традициях, get/post запросы, json отдает. Ничего сложного.

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

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

Если да, то плохо представляю как уживаются вебсокеты и rest api. Это выглядит как обычные запросы для rest, только держится соединение (и не нужно передавать никакой доп. информации)

Вопрос размыт и связан с непониманием концепции вебсокетов, все говорят о "достоинствах" и "способах применения". Хотелось бы предстаавить как это работает и используется на деле.

Спасибо!
  • Вопрос задан
  • 521 просмотр
Решения вопроса 2
werevolff
@werevolff
Не знаю, поможет или нет, но я бы начинал поиск с готовых решений:

Для бэкенда
Для фронтэнда

В качестве библиотеки, реализующей вэб-сокеты используется Ratchet

Полагаю, что для PHP надо будет ещё посношаться с настройкой деплоймента, хотя не факт. Получается, что у нас будет два типа сообщений:

1. Состояние списка пользователей.
2. Сообщения пользователей.

Если бы речь шла об ангуляре, то можно было бы отслеживать фокус на input, либо изменения модели, привязанной к input. Либо, можно было бы усложнить процесс и изучать кол-во изменений модели за единицу времени. Есть ещё возможность отлавливать keypress. В общем, когда мы устанавливаем, что current client печатает, мы отправляем на сервер сообщение одного типа. Если пользователь производит submit - сообщение другого типа.

Так мы можем использовать Redis / RabbitMQ сервер для сохранения статусов пользователей открытых бесед (и удалять instance, если беседа закрыта). Получается следующая схема:

В ОЗУ хранится {'dialogIDqweqweqwe': {'users': {'vasya': {'state': 'online', 'activity': 'printing'}, 'petya': {'state': 'online', 'activity': null'}} ]}}
При изменении статуса от Пети, его клиент отправляет {'action': 'userActivity', 'value':'printing'}. Насколько я понял доку по рэтчету, когда приходит сообщение от одного из клиентов, срабатывает хук onMessage. В нём мы проверяем action ответа и, либо сохраняем данные и делаем $client->send (если что-то изменилось в сравнении с предыдущим состоянием), либо игнорируем изменения.

Механизм web-сокетов вы понимаете правильно. На бэкенде поднимается server - приложение, которое реализует протокол WebSocket. Общее представление о работе даёт его название. Server представляет собой сокет, к которому подключается N клиентов и слушают изменения (ждут событий).
Ответ написан
Комментировать
DJZT
@DJZT
Laravel - code for you
Как уживаются? Да легко. Банально, если вы хотите сделать статусы сообщений - то для простоты это ещё можно реализовать на API. Это не так часто будет срабатывать на началах. Но потом лучше тоже на сокеты перевести. Но когда человек начинает писать - это пошлёт тонну запросов и сервер загнётся от 10 людей одновременно общающихся.
Для этого лучше сокеты. Вы делаете на отдельный диалог отдельный канал в сокете. Как только происходит событие input на форме - то обработчиком события пушите в этот канал на сокете сообщение с ID пользователейм и тип события. (Например typing). Соответсвенно на клиентах делаете обработчик данного события с использованием этого ID.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы