На главную

Как устроена генерация

Этот раздел открыто объясняет механизм, стоящий за главным утверждением MockLab — без ограничения на количество записей, — достаточно подробно, чтобы вы могли оценить реальные компромиссы, а не просто поверить на слово.

Сид

У каждого ресурса есть seed: короткая случайная строка, назначаемая при создании ресурса. Сид вместе с индексом записи (её позицией в списке — 0, 1, 2 и так далее) — единственный вход, который вообще нужен генерации. При одном и том же сиде и одном и том же индексе одни и те же типы полей в одном и том же порядке всегда дают одни и те же значения — на любой машине, в любом процессе, без единой записи, когда-либо сохранённой в базу данных.

Механизм

Для индекса записи i сервер вычисляет числовой хеш от seed + ":" + i и использует его как сид для маленького быстрого генератора псевдослучайных чисел. Каждое поле схемы затем берёт значение из этого же генератора, в порядке следования полей в схеме — именно поэтому изменение порядка полей в конструкторе схемы меняет то, что выдаёт каждое поле (сдвигается позиция каждого поля в последовательности выборок), в то время как добавление опции к уже существующему полю меняет только вывод этого конкретного поля. id записи намеренно генерируется из отдельной последовательности, засеянной от seed + ":id:" + i — независимо от полей с данными, — именно для того, чтобы редактирование полей схемы никогда не меняло id, уже выданные существующим записям.

Именно поэтому генерация миллиона записей почти ничего не стоит: здесь нет ни поиска, ни строки базы данных, ни вообще какого-либо хранимого состояния на запись. Сервер выполняет небольшой объём арифметики на запись, на запрос, и только для тех записей, что попали в запрошенную вами страницу.

Что на самом деле хранится

Сами сгенерированные данные никогда не сохраняются. Единственное, что сохраняется, — ваши переопределения: результат каждого POST, PUT, PATCH и DELETE, который вы сделали (см. Создание, обновление и удаление). Запрос на чтение генерирует запрошенное окно записей, накладывает поверх любые переопределения (заменяя отредактированные записи, отбрасывая удалённые, добавляя вновь созданные), а затем фильтрует, ищет, сортирует и разбивает результат на страницы.

Честный предел: 10 000 записей

Для ресурсов с 10 000 записей или меньше сервер материализует весь объединённый набор данных в памяти один раз на версию данных и обслуживает из него фильтрацию, поиск и сортировку. Выше 10 000 фильтрация, поиск и сортировка полностью отключаются — работает только пагинация. Это не маркетинговая сноска: ответ, затронутый этим ограничением, несёт настоящий, проверяемый заголовок, X-MockLab-Notice: sort-filter-disabled-above-10000, так что ваш код (или вы сами, глядя на вкладку сети) может распознать, что это произошло, вместо того чтобы молча получить несортированные или нефильтрованные результаты.

const response = await fetch("https://mocklab.dev/m/demo7k2m9x/logs?sort=createdAt");
if (response.headers.get("X-MockLab-Notice") === "sort-filter-disabled-above-10000") {
  console.warn("This resource is too large for sort/filter — showing unsorted pages instead.");
}
const records = await response.json();
import { useQuery } from "@tanstack/react-query";

function useSortedRecords(sort) {
  return useQuery({
    queryKey: ["logs", sort],
    queryFn: async () => {
      const res = await fetch(`https://mocklab.dev/m/demo7k2m9x/logs?sort=${sort}`);
      return {
        records: await res.json(),
        sortDisabled: res.headers.get("X-MockLab-Notice") === "sort-filter-disabled-above-10000",
      };
    },
  });
}

Тот же предел затрагивает и маршруты одиночных записей выше 10 000 записей, схожим образом: GET, PUT, PATCH и DELETE по id работают только для записей, у которых уже есть переопределение, потому что превратить произвольный id обратно в его индекс генерации означало бы генерировать записи, пока одна из них не совпадёт, — именно тот неограниченный перебор, ради предотвращения которого и существует этот предел. Ниже 10 000 записей ничего из этого не действует: каждая запись сразу адресуема по id, сортировка и фильтрация всегда доступны, а заголовок уведомления никогда не появляется. Будущая версия поднимет этот предел с помощью настоящего индекса; пока же он честно задокументирован, а не скрыт.