หน้า dynamic ใช้หลักการเดียวกับ Nextjs คือใช้ Incremental Static Regeneration แล้วใช้ StaleWhileRevalidate ในการ invalidate cache ทำให้ไม่ต้อง build hentai ทีเดียว 39x,xxx หน้า แล้วฝั่ง SSR ค่อย cache API request
Hentai-related API (Akashic)
- https://github.com/saltyaom/akashic
หลักๆ คือ เป็น Reverse Proxy สำหรับ nHentai API อีกทีนึง แต่ตัว API ของ nHentai คือ CORs, ไม่ช้าไม่เร็ว, Format ไม่สวย, ล่มบ่อย และโดน Rate Limit เลยทำให้ต้องหาทาง Workaround เองจนสุดท้ายต้องมาเขียน Reverse Proxy เอง
เขียนด้วย Rust (Actix Web) ที่ต้องการรีด performance ของ GraphQL ด้วยความที่ overhead เยอะกว่า REST มาก + เพื่อลดค่าใช้จ่ายของ Cloud Run CPU Allocation เลยเลือกใช้ Rust
ที่คือ API มีปัญหาเรื่อง Rate Limit เลยทำให้เรียก API ติดกันไม่ได้ แต่มีทางออกคือ การทำ Reverse Caching
ทีนี้ถ้าเลื่อนลงไปจะเห็นว่าเรา List Github ในกลุ่ม Database ซึ่งไม่ได้ต้องใจจะเกรียนแต่เราใช้ Github เป็น Database จริงๆ เพราะ
1. Free ถ้าใช้ Database หรือ Storage จะเสียเงิน
2. เราเสก cronjob ด้วย Github Action ให้ dumb nHentai API และ Comments ทั้งหมดมาเก็บเป็น json file แล้วเก็บไว้ใน repo นึง ซึ่งจะทำงานทุกๆ 3 ชั่วโมง
- https://github.com/saltyaom.../hifumin-mirror/tree/generated
ด้วยความที่มันเป็น Public Data เลยไม่มีปัญหาอะไร
ตัว Akashic จะดึง API มาจาก Mirror Server ก่อนแล้วค่อย Fallback ไปที่ API ของ nHentai อีกที จากนั้นจะจัดการ format เป็น แบบที่อ่านง่ายกว่า แล้วค่อยส่งค่าคืนเป็น GraphQL อีกทีนึง ส่วนระหว่าง request ใช้ Apollo ในการ Monitor Request, GraphCDN ในการ cache query และ Cloudflare ในการ Cache Request ที่ซ้ำกัน ด้วยความที่จูนมาดี Allocation Time เลยน้อยมาก
User-Related API (Galahad)
- https://github.com/saltyaom/galahad
เป็น API Server ที่จัดการข้อมูลฝั่ง user (authen, cloud save, etc.) ที่เขียนด้วย Node เพราะหลักๆ ไม่ได้มีอะไรมากนอกจาก CRUD ตรงๆ + Node ถนัดเรื่อง Non-Blocking IO และมี ORM และ DB Driver ให้ใช้เยอะมาก แต่เพราะติด cost เลยใช้อะไรได้ไม่เยอะ
หลักๆ คือใช้ Planetscale ต่อด้วย Prisma และ Redis ต่อด้วย ioredis
ใช้ Planetscale เพราะเป็น Serverless Database ที่ไม่ต้อง Host เอง แถมได้ใช้ฟรี 1 พันล้าน Read, 10 ล้าน Write, 10GB Storage ฟรี ถ้าเกินก็จ่ายไม่กี่ $ ข้อเสียที่ไม่เป็นข้อเสียคือเป็น MySQL (ส่วนตัวนิยม Postgres กว่า) เอาไว้เก็บข้อมูลทั่วๆ ไปได้เลย
ส่วน Redis สำหรับเก็บ Session โดยเฉพาะเพราะเป็น In-Memory Database อย่างที่ทุกคนรู้, Redis มี Cloud ให้ใช้ได้ผ่าน Redis Lab ฟรี 30MB อาจฟังดูเหมือนน้อย แต่ต้องอย่าลืมว่าเราเอาไว้เก็บ active session อย่างเดียว ซึ่ง session ที่เราสร้างมามี format เป็น nanoID (21 Character) ซึ่งถ้าจะใช้ให้ถึง 30MB คร่าวๆ ก็คือต้องมี active session ประมาณ 9 แสนขึ้นไป ถ้าเกินก็จะเสีย $7 ต่อเดือนแล้ว storage จะขึ้นเป็น 100MB แต่ถ้าถึงตอนนั้นจริงๆ คนใช้ก็คงเกิน 3 ล้าน active session แล้ว ก็คงย้ายลง Raspberry PI 4B RAM 8GB ที่มีอยู่แล้วเป็น dedicated server ได้ ก็จะเก็บ active session เกิน 100ล้าน active session ได้สบายๆ
ส่วนตัวชอบ Prisma มาก เป็น ORM ที่ชอบที่สุดละ Generate Code + Type มาให้ใช้ได้เลย เบื้องหลังมี Query Engine ที่เขียนด้วย Rust embed มาให้ด้วย + มี Admin Tools ที่ชื่อ Prisma Studio มาเป็น GUI ให้จัดการ Database ได้แบบง่ายๆ ด้วย
จริงๆ ตอนแรกชั่งใจระหว่าง CockroachDB กับ PlanetScale แต่เลือก PlanetScale เพราะ ตามความเข้าใจ เป็น MySQL ที่ fork มาก่อนเองแล้วเอา