IvanVorobei
@IvanVorobei
Project Manager, iOS Dev, UI and UX, Digital Art

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

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

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

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

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

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

Спасибо!
  • Вопрос задан
  • 310 просмотров
Пригласить эксперта
Ответы на вопрос 3
  • @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 клиентов и слушают изменения (ждут событий).
    Ответ написан
  • yarkov
    @yarkov
    Программист-фрилансер
    Я бы на вашем месте рядом Node.js поставил и реализовал. Ну пару-тройку вечеров. В сети столько примеров, что больше половины вы копипастой напишете ))
    Ответ написан
  • DJZT
    @DJZT
    Laravel - code for you
    Как уживаются? Да легко. Банально, если вы хотите сделать статусы сообщений - то для простоты это ещё можно реализовать на API. Это не так часто будет срабатывать на началах. Но потом лучше тоже на сокеты перевести. Но когда человек начинает писать - это пошлёт тонну запросов и сервер загнётся от 10 людей одновременно общающихся.
    Для этого лучше сокеты. Вы делаете на отдельный диалог отдельный канал в сокете. Как только происходит событие input на форме - то обработчиком события пушите в этот канал на сокете сообщение с ID пользователейм и тип события. (Например typing). Соответсвенно на клиентах делаете обработчик данного события с использованием этого ID.
    Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Вакансии с Моего Круга Все вакансии
Заказы с Фрилансим Все заказы