Как лучше хранить сообщения чата?

371
17 января 2018, 18:39

Варианты, которые я вижу:

  1. Есть массив сообщений текущего чата. Есть observable, который создается для уведомления подписчиков на новые сообщения. И каждое новое сообщение кидается в массив.

  2. Есть observable, который хранит в себе массивом сразу все сообщения открытого чата (или всех открытых в сессии, тут тоже не знаю, как лучше). При получении нового сообщения, оно добавляется в массив.

  3. Есть observable, который хранит только последнее сообщение и уведомляет о нем подписчиков. То есть если добавляется сообщение то все подписчики тригерят функции и добавляют в html новые сообщения, а всего списка не хранят. Ну или хранят до уничтожения компонента.

Если имеет значение, то сообщения чата хранятся в бд и получаются через сокеты.

Подскажите пожалуйста, как удобнее, оптимизированее и грамотнее реализовать эту функцию? По возможности объясните, почему именно так

Answer 1

Я предлагаю такой вариант.

Observable не хранит состояние, только получает событие и шлет подписчикам.

История чата существует как отдельный объект на сервере, загружается и кэшируется клиентом.

Хранение данных на клиенте зависит от фреймворка, можно использовать редьюсеры, либо SessionStorage для Vanilla JS.

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

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

Главный минус - история хранится на клиенте, и со временем, может сильно нагружать браузер. Чтобы этого не произошло, можно использовать пагинацию истории и подгружать по мере прокрутки.

READ ALSO
Проблема с HTML5 video, клавиша пробел

Проблема с HTML5 video, клавиша пробел

Собственно, я делаю кастомизированный HTML5 плеер под себяУбрал стандартную контроль панель и заменил своей(обрамил CSS`ом, сделал функциональность...

256
Не могу выбрать ближайший элемент и открыть его с помощью клика, в чем причина?

Не могу выбрать ближайший элемент и открыть его с помощью клика, в чем причина?

При клике на ссылку должно появляться ближайшее спрятанное окно

298
Кастом рейтинга Woocommrce

Кастом рейтинга Woocommrce

Здравствуйте

281
Не работает while

Не работает while

У меня не работает whileЯ уже долгое время проверяю и все сводится к тому, что:

323