В компаниях, где MyChat давно стал привычным инструментом ежедневного общения, системы работают как часы — до тех пор, пока не случается нечто непредвиденное. «Железо умерло», «По ошибке сделали удаление критичных данных», «Нужен перенос сервера на другую площадку» — так коротко описывают администраторы одну из причин, по которой приходится делать откат серверных баз данных: восстановление из архива, тот самый rollback.

По умолчанию MyChat еженедельно создает автоматические резервные копии, по пятницам. Но администратор может вмешаться, запуская резервирование вручную: чаще, в другой день — как ему удобно. И вот здесь начинается та самая проблема.

Откат баз сервера из бекапа — всегда не по плану 🙂

История сообщений в MyChat хранится не только на сервере, но и на клиентах, чтобы не скачивать её каждый раз после соединения с сервером, как в web-версии в браузере. В больших компаниях за годы накопились сотни мегабайт приватных диалогов и конференций: переписка активна, данные свежие. И если backup сервера сделался в пятницу вечером, а восстановление из резервной копии администратор сделал в среду на следующей неделе, то возникает рассинхрон: на клиентах кеш истории новее, чем на сервере (разница в несколько дней).

Система изначально не была готова к такому сценарию. На форуме поддержки люди периодически писали про это. Клиентское приложение «магическим образом» не догадается, что администратор сервера сделал восстановление базы. Ведь восстановление происходит вручную, выборочно, иногда — частично, в зависимости от ситуации. Серверу нечем подтвердить, что что-то изменилось и сказать про это клиентскому приложению. Из архива просто достали файлы, положили на сервер и перезапустили его. Никаких системных маркеров, никакой сигнализации. Сервер не может узнать о том, что были изменения. Клиент, соответственно, тоже ничего не знает про это.

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

Историю откатили на сервере — а на клиентах остались «свежие» сообщения

Раньше ситуация решалась так: мы советовали остановить клиентское приложение, вручную «прибить» файл локальной истории, а затем запустить приложение. Начнётся синхронизация, и всё будет ок. Но это решение в стиле «программиста в закрытой комнате», как в анекдоте про фрактальное сжатие:

— Как сжать изображение 4K в 1 килобайт?
— Закрываем программиста в комнате и не выпускаем, пока он не разработает алгоритм сжатия картинки.

Если в компании хотя бы пару сотен рабочих мест — решение утопичное.

Чтобы переломить ситуацию, наша команда разработки внедрила технологию, которая меняет правила игры. Мы внедрили технологию определения того, что на сервере был сделан rollback баз — полный или частичный. Как только клиент понимает, что произошло восстановление, он очищает локально у себя базы данных истории и кэши, и делает reconnect к серверу. Далее — управляемая синхронизация.

Сначала — «частичная». Это необходимый минимум, чтобы не грузить сервер. Клиент подключается, получает критически важные данные и готов к работе. Полная выгрузка истории запускается только по явному запросу пользователя. Если тот откроет историю и увидит пустое окно, система честно предупредит: «Извини, истории сейчас нет, но я начинаю синхронизацию, подожди. Когда я закончу, откроется полностью окно истории». Благодаря такому подходу не создаётся ненужная нагрузка, кроме того, она будет очень сильно «размазана». Пользователи не бросаются одновременно читать архивы, а история подтягивается частично, по мере открытия приватных диалогов и конференций.

Теперь стало хорошо. Главное — делать ничего не надо 🙂

В идеале пользователи вообще ничего не заметят. Всё будет работать так, как и раньше. Единственное напоминание о произошедшем найдут лишь самые внимательные — в лог сделается запись, что клиент определил, что был rollback и почистил историю и кэши: «[INFO] Detected server databases rollback, removing local database caches…».

Так в MyChat появился «невидимый страж согласованности»: автоматическое распознавание откатов серверных баз и мягкое восстановление клиентской истории. Без лишнего шума и пыли, без перегруза и с сохранением привычного темпа работы — даже если «железо на сервере умерло» и всё пришлось собирать заново.

Технология работает, начиная с версии MyChat 2025.4.2 и выше.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *