@kirill-93

Подводные камни при разработке чата. Как решить?

Пишу чат на node+socket.io.
Пишу впервые. Во всех мануалах поверхностно описывается сам принцип передачи сообщений, но добравшись до реализации, я столкнулся с несколькими вопросами. Ниже сами вопросы и варианты их решения, которые пришли мне в голову.

Немного о том, как я все организовал:
  • Пользователь авторизуется
  • Получает список чатов вместе с сообщениями из БД через ajax
  • Подключается к socket.io
  • Отправляет и получает сообщения из socket.io
  • Socket.io на сервере занимается пересылкой сообщений и записью их в БД


Вопрос #1
Как быть, если соединение с socket.io по какой-то причине отвалилось?
Например отвалилось оно на 5 секунд. За это время пользователю прислали несколько сообщений. Через 5 секунд соединение восстановилось.
Пользователь сообщения не получил, но в базу они записались.

Варианты решения:
1. Когда пользователь подключается к вебсокетам (событие onconnect), он туда же передает id последнего сообщения, которое у него есть. Socket.io на сервере принимает этот id и делает запрос в базу, проверяя нет ли там новых сообщений.
2. Когда пользователь подключается к вебсокетам (событие onconnect), он сам запрашивает через ajax сообщения для всех чатов.
Первый вариант хорош тем, что это будет полная имитация того, что сообщения только что пришли (звук, уведомление и тд). Второй вроде бы проще.

Вопрос #2
Этот вопрос касается того, как я все организовал. А именно, в какой последовательности нужно загружать список чатов с сообщениями и подключаться к сокетам.
В текущей реализации клиент не подключается к сокетам, пока не загрузит список чатов. Правильно ли это? Это сделано потому, что если пользователь сначала подключится к сокету, а потом загрузит список чатов и сообщений, то непонятно, что делать - к моменту, когда список чатов и сообщений загрузится, пользователь уже может через сокеты получить несколько сообщений.
Варианты решения:
1. Подключаться к сокетам и получать список чатов и сообщений параллельно. И хранить их отдельно, а пользователю выводить смешанный список. Правда этот список придется сортировать и проверять на дубликаты. Будет очень накладно по ресурсам.

Подскажите, пожалуйста, как лучше все сделать.
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 1
@MagicMight
Вопрос #1. Второй вариант решения подходит и является универсальным. Так как, например, открывая страницу вконтакте и обнаруживая там непрочитанные сообщения, мы же не слышим звуки уведомлений по каждому из них?)

Вопрос #2. Зачем притягивать ajax, если планируется все равно использовать сокеты? Список чатов можно отдавать по событию onconnect.
Ответ написан
Ваш ответ на вопрос

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

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