Задать вопрос
@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. Подключаться к сокетам и получать список чатов и сообщений параллельно. И хранить их отдельно, а пользователю выводить смешанный список. Правда этот список придется сортировать и проверять на дубликаты. Будет очень накладно по ресурсам.

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

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

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

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