Вопрос проверяет умение проектировать хранилище данных для системы обмена сообщениями в реальном времени, что необходимо для обеспечения масштабируемости, отказоустойчивости и низкой задержки.
Проектирование хранилища для чата в реальном времени — это задача, требующая баланса между производительностью, надёжностью и удобством разработки. Основная нагрузка приходится на операции записи (отправка сообщений) и чтения (получение истории, подписка на новые сообщения).
Минимальный набор сущностей включает:
Для обработки потока сообщений в реальном времени часто используют комбинированный подход:
CREATE TABLE messages (
id BIGSERIAL PRIMARY KEY,
conversation_id UUID NOT NULL,
sender_id UUID NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
-- Индексы для быстрого поиска
CONSTRAINT fk_conversation FOREIGN KEY(conversation_id) REFERENCES conversations(id),
CONSTRAINT fk_sender FOREIGN KEY(sender_id) REFERENCES users(id)
);
CREATE INDEX idx_messages_conversation_created ON messages(conversation_id, created_at DESC);При отправке сообщения оно сначала записывается в основную БД, затем его копия может помещаться в Redis-кэш для активных чатов, а также отправляется через WebSocket или SSE подключения всем онлайн-участникам. Для загрузки истории делается запрос к основной БД с пагинацией (LIMIT/OFFSET или ключом на created_at).
Вывод: Такое хранилище стоит применять для чат-приложений, где важна мгновенная доставка сообщений и быстрый доступ к истории. Комбинация Redis и PostgreSQL позволяет эффективно масштабироваться под растущее число пользователей и сообщений.