> Как шардировать таблицы пользователей, чатов и сообщений (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

Шардирование таблиц пользователей, чатов и сообщений в Go-проекте требует учета паттернов доступа и выбора ключа шардирования. Для пользователей оптимально шардировать по user_id (хеш-функция, например, user_id % N), так как все запросы обычно идут от конкретного пользователя. Для чатов - по chat_id, чтобы данные одного чата лежали на одном шарде, что упрощает JOIN-запросы. Для сообщений - по chat_id (или композитный ключ chat_id + message_id), так как основная нагрузка - чтение истории чата.

Пример реализации на Go с использованием виртуального шардирования (consistent hashing):

GO
type ShardManager struct {
shards []*sql.DB
count int
}
func (sm *ShardManager) GetShard(key string) *sql.DB {
hash := crc32.ChecksumIEEE([]byte(key))
idx := int(hash) % sm.count
return sm.shards[idx]
}
// Использование:
shard := sm.GetShard(fmt.Sprintf("user_%d", userID))
// запрос к шарду

Для сообщений можно использовать шардирование по chat_id с дополнительным индексом по created_at для пагинации. Важно избегать cross-shard запросов: например, получать список чатов пользователя через отдельную таблицу user_chats, шардированную по user_id.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью