My journey into a massive posts rebake job

This is now done via:

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

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 / 2718220 ( 10.5%)

어제 일반 리베이크 명령으로 프로세스를 시작한 후 현재 상태입니다. 3초마다 약 1,000건씩 처리되는 것 같습니다. 이제 가져오기 작업과 테스트의 막바지에 다가가고 있어, 이보다 느린 방법을 최종적으로 선택하기 전에 대용량 사이트를 리베이크하는 더 적절한 방법이 있는지 확인하고 싶었습니다.

누군가 이 in_batches 버전이 어떻게 작동하는지 설명해 줄 수 있을까요? 아마도 배치 단위로 리베이크를 수행하는 것 같습니다. 하지만 위 게시물들을 보면, 기본적으로 15분마다 100개씩 배치로 리베이크를 한다고 되어 있습니다.

저는 200만 건의 리베이크 작업을 처리해야 하며, 이를 수행하는 최선의 방법을 찾고 있습니다. 이 작업에는 시급성이 없지만, 장시간 실행되는 작업이 정상적인 운영 및 관리 작업(예: 백업)에 영향을 주지 않도록 확인하고 싶습니다.

그리고 방금 이 게시글을 읽었습니다: Rebaked all my posts, but what's it doing now? 이 글에 따르면, re-bake 작업은 실제로 게시글을 다시 구우기(mark for re-baking)만 하는 것 같다고 합니다. (이 마킹은 어떻게 이루어지는 걸까요?) 과정이 너무 느려서, 게시글을 다시 구울 수 있도록 마킹하는 데만 이렇게 오래 걸린다는 사실이 정말 믿기지가 않습니다.

더 빠른 서버로 이전하세요.

사이트가 압도되지 않는 것에 감사해야 합니다. 이 과정의 전체적인 목적은 이 프로세스가 너무 많은 리소스를 차지하지 않도록 하여, 처리 중에 사이트가 반응성을 유지하게 하는 것입니다.

소스 코드를 참고하는 것은 항상 좋은 아이디어입니다:

실제로 마킹은 매우 빠릅니다. 그리고 rebake_post는 요리를 위한 호출을 수행하는 것 같습니다. 이 과정에서 또는 그 결과로 비동기 작업이 실행되는 것일까요?

네, 물론이죠. 그 작업은 여러 작업을 생성하는 작업이니까요.

이상적인 해결책은 아니지만, 다른 방법을 찾았어요!

1000배 더 빠른 자체 재베이킹(Re-baker) 도구를 작성했기 때문에, 한 달이 걸리던 작업이 이제 단 몇 분 만에 끝납니다.

실제로는 데이터베이스 삽입 직전에 재베이킹을 수행하도록 할 계획이라, 재베이킹에 소요되는 시간이 데이터베이스 삽입 시간 내에 흡수되어 사실상 비용이 사라질 것입니다.

아, 네. 맥락을 몰랐네요.

네, 이 내용은 Production(프로덕션) 환경을 위해 작성된 것입니다.

궁금해서 여쭤보는데, 어떤 작업을 하셨는지 공유해 주실 수 있나요?

가져온 모든 게시물을 스캔하여 어떤 마크업/이모티콘이 포함되어 있는지 확인하는 프로그램을 작성했습니다. 그런 다음, 원본 게시물을 HTML로 변환하고 데이터베이스를 직접 업데이트하는 또 다른 프로그램을 작성했습니다.