# 我在一个大型帖子重建工作中的旅程

**URL:** https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816
**Category:** Self-hosting
**Created:** [2018 年4 月 8 日 12:25 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816 "2018-04-08T12:25:59Z")
**Posts on this page:** 16
**Page:** 2

<div class="post-metadata">

### 作者： ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### 发布日期： [2018 年7 月 11 日 09:15 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/21 "2018-07-11T09:15:29Z")

</div>

> [@sam](#):
>
> but it is a bit tricky cause we would need to carry a big list of ids in memory. I wonder if we should amend it so the rake task is resumable?

This is now done via:

[https://github.com/discourse/discourse/commit/536cef86f4d0a3526d33fd3feb54f03bead7fdd4](https://github.com/discourse/discourse/commit/536cef86f4d0a3526d33fd3feb54f03bead7fdd4)

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).

---

<div class="post-metadata">

### 作者： ![clay](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/clay/32/102156_2.png) [@clay](https://meta.discourse.org/u/clay)
#### 发布日期： [2018 年7 月 17 日 18:33 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/22 "2018-07-17T18:33:44Z")

</div>

> [@pfaffman](#):
>
> So rather than running `rake posts:rebake`, one should instead do `Posts.all.update_all('baked_version: null')` and all posts will be rebaked in batches according to `rebake_old_posts_count`?

> [@techAPJ](#):
>
> This is now done via:

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?

---

<div class="post-metadata">

### 作者： ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### 发布日期： [2018 年7 月 18 日 14:19 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/23 "2018-07-18T14:19:05Z")

</div>

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.

---

<div class="post-metadata">

### 作者： ![clay](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/clay/32/102156_2.png) [@clay](https://meta.discourse.org/u/clay)
#### 发布日期： [2018 年7 月 20 日 12:50 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/24 "2018-07-20T12:50:02Z")

</div>

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')`

---

<div class="post-metadata">

### 作者： ![ckshen](https://avatars.discourse-cdn.com/v4/letter/c/ad7895/32.png) [@ckshen](https://meta.discourse.org/u/ckshen)
#### 发布日期： [2018 年9 月 6 日 08:17 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/26 "2018-09-06T08:17:45Z")

</div>

@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''`

---

<div class="post-metadata">

### 作者： ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### 发布日期： [2018 年9 月 6 日 08:39 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/27 "2018-09-06T08:39:25Z")

</div>

> [@ckshen](#):
>
> Where do you run this command? After entering the app?

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

```

---

<div class="post-metadata">

### 作者： ![TheDarkWizard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thedarkwizard/32/177913_2.png) [@TheDarkWizard](https://meta.discourse.org/u/TheDarkWizard)
#### 发布日期： [2021 年3 月 30 日 19:35 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/28 "2021-03-30T19:35:09Z")

</div>

批量方法是否适合处理大量重新烘焙任务？

`2851000 / 27182220 ( 10.5%)`

这是我们昨天使用常规重新烘焙命令启动后的当前进度，看起来大约每 3 秒处理 1000 条。我们已非常接近导入流程和测试的尾声，只是想确认在处理大型站点时是否有更合适的方法，而不是采用这种较慢的方式。

---

<div class="post-metadata">

### 作者： ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)
#### 发布日期： [2024 年5 月 31 日 06:42 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/29 "2024-05-31T06:42:26Z")

</div>

有人能解释一下这个 `in_batches` 版本是如何工作的吗？它大概是以批次进行重新烘焙，但根据上面的帖子，它默认每 15 分钟以 100 个为一批进行重新烘焙。

我有一个 200 万的重新烘焙工作要做，并试图找出最好的方法来完成它。这项工作并不紧急，但我想确保正常运行和管理操作（如备份）不受长时间运行的工作的影响。

---

<div class="post-metadata">

### 作者： ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)
#### 发布日期： [2024 年5 月 31 日 06:49 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/30 "2024-05-31T06:49:57Z")

</div>

我现在读到这篇帖子：[https://meta.discourse.org/t/rebaked-all-my-posts-but-whats-it-doing-now/179782，它告诉我重新烘焙任务并没有真正重新烘焙它们，只是将它们标记为待重新烘焙（这个标记是如何完成的？）。这个过程非常缓慢，我真的很难相信仅仅标记一个帖子以待重新烘焙需要这么长时间。](https://meta.discourse.org/t/rebaked-all-my-posts-but-whats-it-doing-now/179782%EF%BC%8C%E5%AE%83%E5%91%8A%E8%AF%89%E6%88%91%E9%87%8D%E6%96%B0%E7%83%98%E7%84%99%E4%BB%BB%E5%8A%A1%E5%B9%B6%E6%B2%A1%E6%9C%89%E7%9C%9F%E6%AD%A3%E9%87%8D%E6%96%B0%E7%83%98%E7%84%99%E5%AE%83%E4%BB%AC%EF%BC%8C%E5%8F%AA%E6%98%AF%E5%B0%86%E5%AE%83%E4%BB%AC%E6%A0%87%E8%AE%B0%E4%B8%BA%E5%BE%85%E9%87%8D%E6%96%B0%E7%83%98%E7%84%99%EF%BC%88%E8%BF%99%E4%B8%AA%E6%A0%87%E8%AE%B0%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%8C%E6%88%90%E7%9A%84%EF%BC%9F%EF%BC%89%E3%80%82%E8%BF%99%E4%B8%AA%E8%BF%87%E7%A8%8B%E9%9D%9E%E5%B8%B8%E7%BC%93%E6%85%A2%EF%BC%8C%E6%88%91%E7%9C%9F%E7%9A%84%E5%BE%88%E9%9A%BE%E7%9B%B8%E4%BF%A1%E4%BB%85%E4%BB%85%E6%A0%87%E8%AE%B0%E4%B8%80%E4%B8%AA%E5%B8%96%E5%AD%90%E4%BB%A5%E5%BE%85%E9%87%8D%E6%96%B0%E7%83%98%E7%84%99%E9%9C%80%E8%A6%81%E8%BF%99%E4%B9%88%E9%95%BF%E6%97%B6%E9%97%B4%E3%80%82)

---

<div class="post-metadata">

### 作者： ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### 发布日期： [2024 年5 月 31 日 07:03 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/31 "2024-05-31T07:03:36Z")

</div>

> [@Isambard](#):
>
> 这个过程太慢了，我真不敢相信仅仅标记一个帖子进行重新烘焙需要这么长时间。

那就迁移到更快的服务器。

要庆幸它没有压垮你的网站。整个过程的目的是防止这个过程消耗过多的资源，在过程中保持你的网站响应。

> [@Isambard](#):
>
> 这个标记是如何完成的？

查阅源代码总是一个好主意：

> <https://github.com/discourse/discourse/blob/5eae8ced9eed161d45f73f013e2d6a12f92464d3/lib/tasks/posts.rake#L124>

---

<div class="post-metadata">

### 作者： ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)
#### 发布日期： [2024 年5 月 31 日 07:28 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/32 "2024-05-31T07:28:58Z")

</div>

确实，标记应该很快。rebake\_post 似乎确实调用了 cooking。也许这其中或由此产生了一些异步任务？

---

<div class="post-metadata">

### 作者： ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### 发布日期： [2024 年5 月 31 日 07:40 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/33 "2024-05-31T07:40:03Z")

</div>

是的，当然，这是一个生成一组作业的作业

---

<div class="post-metadata">

### 作者： ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)
#### 发布日期： [2024 年5 月 31 日 10:10 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/34 "2024-05-31T10:10:20Z")

</div>

> [@merefield](#):
>
> 那就迁移到更快的服务器。

这不是理想的解决方案，但我找到了另一种方法！

我写了一个自己的 re-baker，速度快了 1000 倍，所以它不再需要一个月，只需要几分钟。

我实际上会在数据库插入之前进行 re-bake，这样 re-bake 的成本就会在数据库插入时间内消失。

---

<div class="post-metadata">

### 作者： ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### 发布日期： [2024 年5 月 31 日 10:27 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/35 "2024-05-31T10:27:06Z")

</div>

啊，好的，我不知道你的背景。

是的，这是为生产案例编写的。

---

<div class="post-metadata">

### 作者： ![TheDarkWizard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thedarkwizard/32/177913_2.png) [@TheDarkWizard](https://meta.discourse.org/u/TheDarkWizard)
#### 发布日期： [2024 年7 月 10 日 12:48 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/36 "2024-07-10T12:48:53Z")

</div>

出于好奇，你能分享一下你做了什么吗？

---

<div class="post-metadata">

### 作者： ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)
#### 发布日期： [2024 年7 月 10 日 23:56 UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/37 "2024-07-10T23:56:52Z")

</div>

我编写了一个程序来扫描所有导入的帖子，以查找它们包含的标记/表情符号。然后，我编写了另一个程序将原始帖子烘焙成 HTML 并直接更新数据库。

[上一页](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816.md?page=1)
