# Il mio viaggio in un grande lavoro di rebake dei post

**URL:** <https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816>\
**Category:** Self-hosting\
**Created:** [8 Aprile 2018, 12:25pm UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816 "2018-04-08T12:25:59Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![bartv](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bartv/32/130052_2.png) [@bartv](https://meta.discourse.org/u/bartv)\
**Post date:** [8 Aprile 2018, 12:25pm UTC](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816/1 "2018-04-08T12:25:59Z")

</div>

Sto continuando questa conversazione da ‘[Rebuild HTML for entire topic](https://meta.discourse.org/t/rebuild-html-for-entire-topic/64148/14?u=bartv)’, poiché i miei esperimenti stanno prendendo una direzione piuttosto diversa e ho pensato che potesse essere utile condividere i miei pensieri e i risultati man mano che procedo.

La mia situazione è la seguente: stiamo per lanciare un nuovo forum migrato con oltre 4 milioni di post. Questi richiederanno un rebake quando passeremo al dominio finale, e i post dovranno essere elaborati per garantire che le immagini siano incorporate correttamente, ecc.

Le mie preoccupazioni sono:

- Il rebake non è un processo veloce. Ho ottimizzato il nostro server da 16 GB/6 core, ma non riesco a ottenere una velocità superiore a 2-3 post al secondo, il che significa che l’intero rebake richiederà ben oltre 20 giorni.
- Il rebake inizia dai post più vecchi; preferirei iniziare dai più recenti per offrire alla nostra comunità la migliore esperienza possibile (assumendo che i post più nuovi riceveranno più traffico).
- Non esiste un modo per ‘riprendere’ il processo da dove si era interrotto, e ho motivi per sospettare che dovrò ricostruire almeno una volta nei prossimi 20 giorni.
- I lavori di rebake vanno nella coda sidekiq predefinita e temo che questo creerà enormi ritardi per i lavori di elaborazione regolari.

Finora, ho fatto quanto segue: dopo aver scavato nel codice e ricevuto assistenza dal personale qui, ho modificato `lib/tasks/posts.rake` per:

- Lavorare in ordine cronologico inverso, iniziando dai post più recenti.
- Ignorare i messaggi privati: voglio dare priorità ai topic pubblici.
- Visualizzare l’ID del post/topic corrente in modo da poter aggiungere facilmente la clausola `where` alla mia query per riprendere l’elaborazione da un altro numero di post.

Ecco il mio codice:

```
def rebake_posts(opts = {})
  puts "NEW Rebaking post markdown for '#{RailsMultisite::ConnectionManagement.current_db}'"

  disable_edit_notifications = SiteSetting.disable_edit_notifications
  SiteSetting.disable_edit_notifications = true

  total = Post.count
  rebaked = 0

    ordered_post_ids = Post.joins(:topic)
      .select('posts.id')
      .where('topics.archetype' => Archetype.default)
      .order("posts.id DESC")
      .pluck(:id)

    ordered_post_ids.in_groups_of(1000).each do |post_ids|
    posts = Post.order(created_at: :desc).where(id:post_ids)
    posts.each do |post|
      rebake_post(post, opts)
      print_status(rebaked += 1, total)
      puts " > rebaking post id #{post.id} for topic id #{post.topic_id}"
    end
  end

  SiteSetting.disable_edit_notifications = disable_edit_notifications

  puts "", "#{rebaked} posts done!", "-" * 50
end

```

Prossimo passo: sto cercando di capire come creare questi lavori nella coda a priorità bassa. Qualsiasi suggerimento sarebbe molto apprezzato 🙂

---

_[View the full topic](https://meta.discourse.org/t/my-journey-into-a-massive-posts-rebake-job/84816)._
