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

Как работают современные мессенджеры?

Добрый день, хочу разобраться в архитектуре современных мессенджеров, по типу Telegram. Конкретно интересует часть с хранением и отдачей сообщений, так как не могу понять, как сервер за столь короткое время умеет прошерстить базу данных, найти сообщения конкретного пользователя и отдать их. Еще интересует сторона шифрования, особенно в том случае, когда не используется e2e шифрование, то есть как следить за безопасностью/утечками, заранее спасибо за ответ.
  • Вопрос задан
  • 1461 просмотр
Подписаться 22 Простой Комментировать
Решение пользователя Евгений Мамонов К ответам на вопрос (4)
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
как сервер за столь короткое время умеет прошерстить базу данных, найти сообщения конкретного пользователя и отдать их

Я бы делал немного иначе, например пользователь отправляет сообщение, которое принимает сервер.
В случае, если получатель сообщения также подключен - сервер параллельно доставляет получателю сообщение, за счёт этого имеем быструю доставку сообщений, и параллельно сохраняет сообщение в базу.

Что касается быстрой загрузки истории сообщений - то тут нужно сохранять сообщения таким образом, чтобы сообщения одного пользователя всегда были на одном и том же сервере (если используется шардинг). Тогда обычный SELECT из базы по user_id будет вполне себе быстро работать даже на огромной базе. Также таблицы можно еще партицировать, чтобы еще быстрее загружать последние сообщения в истории.

Что касается безопасности, если не использовать e2e шифрование, как вариант, можно использовать обычные RSA ключи. Например на сервере генерируем два ключа, открытый отправляем кленту, он шифрует им сообщение и передает сообщение на сервер. Вы на сервере его расшифровываете при помощи закрытого ключа. Для отправки сообщения клиенту, можно сделать тоже самое. Клиент также генерирует два RSA ключа и открытый ключ отправляет серверу. Когда серверу нужно доставить сообщение клиенту, он шифрует сообщение открытым ключём, который ему высылал клиент и отправляет ему.

Мне тоже интересно узнать другие варианты решения этой задачи, буду следить за этой темой :)

Хорошее дополнение по хранению сообщения и организации поиска от Ильи
Распределение нагрузки решается шардингом — получается много небольших БД вместо одной огромной. Скорее всего каждое сообщение разбивается по словам/частям слов и сохраняется в поисковый индекс типа слово—message_id и такой индекс строится для каждого пользователя и тоже шардируется. При поиске сначала получаем идентификаторы подходящих сообщений из поискового индекса, потом выгружаем сообщения из БД с сообщениями.

Дополнение от Stalker_RED
только не "сообщения одного пользователя всегда были на одном и том же сервере" а сообщения из одного чата/канала/группы (включая чаты, в котором всего два участника). То-же самое касается построения индекса.
Ответ написан