@MyJaneDoe

Как оптимизировать сохранение истории чата в БД?

Привет.
Пишу бэкенд для небольшого приложения, в котором планирую сделать чат.
Раньше никогда чатами не занимался, встал вопрос как оптимизировать сохранение истории чата в БД (использую MongoDB).
Мне кажется (я могу ошибаться), что если при получении каждого нового сообщения сохранять его в базу (что-то типа ChatModel.findByIdAndUpdate(chat._id)), то это будет сильно нагружать процессор.

Можно делать по-другому: записывать все прилетающие сообщения в переменную. Затем каждые, например, N сообщений делать апдейт поля в базе, конкатинируя получившуюся строку с уже хранящейся.
Что не нравится здесь:
1) Если сервер упадет, все, что хранилось в переменной пропадет;
2) Такой подход тратит дополнительную оперативную память. Если принять среднюю длину сообщения за nLength, то затраты памяти будут расти как О (N * nLength)

В общем, посоветуйте хороший способ реализации быстрого и не слишком затратного способа сохранять историю чата.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 1
@deliro
Мне кажется (я могу ошибаться), что если при получении каждого нового сообщения сохранять его в базу (что-то типа ChatModel.findByIdAndUpdate(chat._id)), то это будет сильно нагружать процессор.

Зависит от способа организации данных, от самих данных, от нагрузки. Одно дело, когда одновременно ведут диалог 10 человек и другое, когда 10 миллионов.

Можно делать по-другому: записывать все прилетающие сообщения в переменную. Затем каждые, например, N сообщений делать апдейт поля в базе, конкатинируя получившуюся строку с уже хранящейся.

1. Это ненадёжно. Например, у тебя работает 15 разработчиков, каждый из них деплоит 2 раза в день в течении рабочего дня. Итого, каждые ~16 минут у всех теряется несколько рандомных сообщений.
2. Ты хочешь сохранять каждые N сообщений. Представь, что я написал N-1 сообщений и потерялся на год. Уж за год сервер точно один раз передеплоят и все мои сообщения потеряются. Здесь нужны таймеры

В общем, посоветуйте хороший способ реализации быстрого и не слишком затратного способа сохранять историю чата

Установить rocketchat/mattermost/etc.

А если серьёзно, то проводи нагрузочные тесты. Если юзеров будет 1.5 землекопа — сделай просто "как-нибудь". Вот когда миллионы юзеров будут, тогда приходи... А стоп, когда у тебя будут миллионы юзеров, у тебя хватит денег нанять людей, которые перепишут как надо
Ответ написан
Ваш ответ на вопрос

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

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