Дизайн таблицы PostgreSQL для частых действий по сохранению в веб-приложении - PullRequest
0 голосов
/ 27 сентября 2018

Наше веб-приложение с 100 000 одновременно работающих пользователей имеет сценарий использования, при котором мы автоматически сохраняем активность пользователя каждые 5 секунд.Рассмотрим таблицу, подобную этой:

create table essays
(
  id                 uuid not null constraint essays_pkey primary key,
  userId             text not null,
  essayparts         jsonb   default '{ }' :: jsonb,
  create_date        timestamp with time zone default now() not null,
  modify_date        timestamp with time zone default now() not null
);

create index essays_create_idx on essays ("create_date");
create index essays_modify_idx on essays ("modify_date");

Это хорошо работает для нас, поскольку все материалы, связанные с эссе пользователя, такие как заголовок, краткий подпись.запросчик, тело полного эссе и т. д. хранятся в столбце essayparts в формате JSON.Для автоматического сохранения эссе мы не вставляем новые строки все время.Мы обновляем каждый идентификатор (каждое эссе) со всеми его компонентами.

Таким образом, в каждом эссе есть множество обновлений, так как это трудоемкая и продуманная работа.Учитывая автоматическое сохранение каждые 5 секунд, если бы пользователь должен был писать полчаса, мы бы обновили его эссе около 360 раз.

Это было бы хорошо с функциональностью «HOT» (только кучи) в PostgreSQL.Мы используем v10, поэтому мы в порядке.Однако проблема в том, что мы также обновляем столбец modify_date каждый раз, когда эссе сохраняется, и у него тоже есть индекс.Это означает, что по принципу HOT это не приносит пользы от обновления HOT, и происходит большая фрагментация.

Я предполагаю, что в мире Интернета или мобильных устройств это не является необычной моделью.Многие сервисы, похоже, автоматически сохраняют контент.Они только вставляют?Если это так, если пользователь выходит из системы и возвращается, как они показывают записи, глядя на max(modify_date)?Или есть какой-то другой механизм для использования обновлений HOT при одновременном обновлении индексированного столбца в таблице?

Спасибо за любые указатели, спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

Выполнение обновления каждые 5 секунд с 100000 одновременно работающих пользователей будет производить 20000 обновлений в секунду.Это довольно сложная задача, и вам понадобится хорошая система, чтобы выполнить ее, но автовакуум никогда не сможет поддерживать работу, если эти обновления не ГОРЯЧИЕ.

У вас есть несколько вариантов:

  1. Выберите систему управления реляционными базами данных, отличную от PostgreSQL, которая обновляет строки на месте.

  2. Не индексируйте modify_date и надейтесь, что HOT сработает.

  3. Выполняйте эти обновления реже, чем раз в 5 секунд (кому все равно требуется автоматическое сохранение каждые 5 секунд?).

  4. Авто-сохранить данные в другом месте, чем в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...