My journey into a massive posts rebake job

This is now done via:

We no longer carry post ids in memory and the rebake task can be resumed by running posts:rebake_uncooked_posts.

One caveat here is that the resume task will not rebake posts in reverse order (i.e. the sort order will be id ascending).

So @techAPJ, if I need to trigger a rebake of every post on a Discourse install, is @pfaffman’s method the proper one to use?

If you need to rebake all posts instantly then run bundle exec rake posts:rebake.

Post.update_all("baked_version = NULL") will rebake 100 posts (by default) every 15 minutes.

Thanks, Arpit.

FYI, I encountered some performance issues with that approach, so I went with this, which alleviated the problem and resulted in the same outcome:

Post.in_batches.update_all('baked_version = NULL')

@techAPJ I have a dummy question. Where do you run this command? After entering the app?

It tells me

bash: syntax error near unexpected token ''baked_version = NULL''

./launcher enter app
rails c
Post.in_batches.update_all('baked_version = NULL')

Подходит ли метод пакетной обработки для большого количества пересборок?

2851000 / 27182220 ( 10.5%)

Это наш текущий процесс, запущенный вчера с помощью обычной команды пересборки. Похоже, что система обрабатывает около 1000 элементов каждые 3 секунды. Мы находимся почти на финише нашего пути импорта и тестирования, и я просто хотел убедиться, что существует более правильный способ пересборки крупного сайта, прежде чем мы окончательно остановимся на этом более медленном методе.

Может кто-нибудь объяснить, как работает эта версия с in_batches? Скорее всего, она выполняет повторную выпечку партиями, но из вышеприведенных постов следует, что по умолчанию повторная выпечка выполняется партиями по 100 каждые 15 минут.

У меня есть задача по повторной выпечке объемом 2 миллиона записей, и я пытаюсь найти лучший способ её выполнения. Задача не срочная, но я хочу убедиться, что обычная работа и административные операции (например, резервное копирование) не будут затронуты длительным выполнением этой задачи.

И вот я только что прочитал этот пост: Rebaked all my posts, but what's it doing now?, из которого следует, что задача перепечки даже не перепёкает посты, а лишь помечает их для перепечки (как именно делается эта пометка?). Процесс настолько медленный, что мне трудно поверить, что на простую пометку поста для перепечки уходит так много времени.

Тогда переезжайте на более быстрый сервер.

Будьте благодарны, что это не перегружает ваш сайт. Весь смысл в том, чтобы предотвратить чрезмерное потребление ресурсов этим процессом, сохраняя отзывчивость вашего сайта во время его выполнения.

Обращение к исходному коду — всегда хорошая идея:

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

Да, конечно, это задача, запускающая набор задач

Не идеальное решение, но я нашёл другой способ!

Я только что написал свой собственный re-baker, который работает в 1000 раз быстрее: вместо месяца теперь требуется всего несколько минут.

Фактически я буду выполнять re-bake непосредственно перед вставкой в базу данных, так что затраты на re-bake исчезнут в рамках времени вставки в БД.

Ах, хорошо, я не был в курсе вашего контекста.

Да, это написано для случая Production.

Из любопытства, не могли бы вы рассказать, что вы сделали?

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