Задать вопрос
@MyJaneDoe

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

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

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

В общем, посоветуйте хороший способ реализации быстрого и не слишком затратного способа сохранять историю чата.
  • Вопрос задан
  • 133 просмотра
Подписаться 2 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Skillbox
    Курс Java-разработчик
    4 месяца
    Далее
  • Яндекс Практикум
    Фулстек-разработчик
    16 месяцев
    Далее
  • Skillbox
    Java-разработчик
    8 месяцев
    Далее
  • MongoDB University
    MongoDB Atlas Administrator Path
    1 неделя
    Далее
  • Яндекс Практикум
    Бэкенд на Node.js для фронтенд-разработчиков
    3 месяца
    Далее
  • Skillbox
    Node.js
    2 месяца
    Далее
  • Учебный центр IBS
    ARC-PRG-001 Архитектор ПО. Путь к мастерству в проектировании систем
    2 недели
    Далее
Пригласить эксперта
Ответы на вопрос 1
@deliro
Мне кажется (я могу ошибаться), что если при получении каждого нового сообщения сохранять его в базу (что-то типа ChatModel.findByIdAndUpdate(chat._id)), то это будет сильно нагружать процессор.

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

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

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

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

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

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

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

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