cesko-digital / app

Komunitní aplikace Česko.Digital

Home Page:https://app.cesko.digital

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Build padá při čtení z Discourse

zoul opened this issue · comments

Viz například tady, zhruba:

SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at parseJSONFromBytes (node:internal/deps/undici/undici:4553:19)
    at successSteps (node:internal/deps/undici/undici:4527:27)
    at fullyReadBody (node:internal/deps/undici/undici:1307:9)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async specConsumeBody (node:internal/deps/undici/undici:4536:7)
    at async getPost (/vercel/path0/.next/server/app/page.js:360:52)
    at async /vercel/path0/.next/server/app/page.js:373:27
    at async Promise.all (index 4)
    at async getBubbles (/vercel/path0/.next/server/app/page.js:369:12)
SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at parseJSONFromBytes (node:internal/deps/undici/undici:4553:19)
    at successSteps (node:internal/deps/undici/undici:4527:27)
    at fullyReadBody (node:internal/deps/undici/undici:1307:9)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async specConsumeBody (node:internal/deps/undici/undici:4536:7)
    at async getPost (/vercel/path0/.next/server/app/page.js:360:52)
    at async /vercel/path0/.next/server/app/page.js:373:27
    at async Promise.all (index 0)
    at async getBubbles (/vercel/path0/.next/server/app/page.js:369:12)
Error occurred prerendering page "/". Read more: https://nextjs.org/docs/messages/prerender-error
SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at parseJSONFromBytes (node:internal/deps/undici/undici:4553:19)
    at successSteps (node:internal/deps/undici/undici:4527:27)
    at fullyReadBody (node:internal/deps/undici/undici:1307:9)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async specConsumeBody (node:internal/deps/undici/undici:4536:7)
    at async getPost (/vercel/path0/.next/server/app/page.js:360:52)
    at async /vercel/path0/.next/server/app/page.js:373:27
    at async Promise.all (index 4)
    at async getBubbles (/vercel/path0/.next/server/app/page.js:369:12)

Tipuju Discourse, je potřeba to chytit lokálně nebo líp logovat, abychom to zjistili přesně. A pak tam asi dodělat retry?

Našel jsem v logu, GET na diskutuj.digital/t/27.json vrací 429 / Too many requests. Což je asi fér postřeh. Zkusil jsem v 2fd588f zlepšit kešování dotazů z Discourse.

Tohle nepomohlo, ale podle mě to bude souviset s #987 – špatně nám funguje kešování, takže to Discourse bombardujeme častěji, než bychom čekali?

Dělá to furt i po opravě kešování stránek na naší straně. Asi to bude dané tím, jak načítáme obsah postů pro titulku:

 GET / 200 in 3641ms
  │ GET https://diskutuj.digital/c/4.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/163.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/85.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/167.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/27.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/244.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/226.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/440.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/214.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/450.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/50.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/667.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/612.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/c/5.json 200 in 0ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/214.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/252.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/191.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/223.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/83.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/t/153.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/572.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/686.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/513.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/600.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/208.json 200 in 1ms (cache: HIT)
  │  │ GET https://diskutuj.digital/posts/412.json 200 in 0ms (cache: HIT)

Nevím, možná před to Discourse strčit jednoduchou keš, třeba CloudFront, ať to načítání JSONů zbytečně nezlobí?

CloudFront spíš nepomůže, protože jde o hromadu různých endpointů, které by musel držet hodně dlouho. Ale našel jsem v adresáři Discourse soubor templates/web.ratelimited.template.yml, kde jsou nastavení pro nginx, který ty limity hlídá. Zkusím limity zvýšit a uvidíme.

Tohle už se prakticky neděje.