Yomu
Architecture

Ikhtisar Architecture

system architecture Yomu — platform pembelajaran poliglot dengan backend auth Java, engine gamifikasi Rust, dan frontend Next.js

Apa itu Yomu?

Yomu adalah platform pembelajaran poliglot yang dirancang untuk meningkatkan literasi bahasa Indonesia melalui pengalaman membaca dan kuis yang digamifikasi. Platform ini menggabungkan layanan backend yang tangguh yang dibangun dengan teknologi berbeda yang dioptimalkan untuk domain spesifiknya, menciptakan sistem yang efisien dan skalabel.

Filosofi inti di balik Architecture Yomu adalah menggunakan alat yang tepat untuk pekerjaan yang tepat — Java untuk autentikasi pengguna dan manajemen konten yang andal, Rust untuk kalkulasi gamifikasi performa tinggi, dan Next.js untuk pengalaman React yang di-render di sisi server.

Tujuan Platform

Yomu dibangun dengan beberapa tujuan utama:

  • Aksesibilitas — Menyediakan materi pembelajaran dalam Bahasa Indonesia untuk pelajar di seluruh nusantara
  • Keterlibatan — Menggunakan mekanisme gamifikasi untuk menjaga motivasi pengguna dan melacak kemajuan
  • Skalabilitas — Mendukung basis pengguna yang terus bertambah dengan perubahan infrastruktur minimal
  • Kemudahan Pemeliharaan — Batasan layanan yang jelas memungkinkan pengembangan dan deployment secara independen
  • Performa — Pembaruan papan peringkat real-time untuk pengalaman belajar yang kompetitif

Yomu tidak menggunakan database atau layanan bersama antar komponennya. Setiap layanan mempertahankan bounded context-nya sendiri dengan pemisahan tanggung jawab yang jelas, memastikan bahwa kegagalan di satu lapisan tidak menjalar ke lapisan lainnya.

Architecture Tiga Lapis

Penjelasan Lapisan Architecture

Lapisan Frontend (Next.js 16)

  • Server-Side Rendering — Halaman yang di-pre-render untuk SEO dan initial load yang cepat
  • API Routes sebagai BFF — pattern Backend for Frontend mengonsolidasikan panggilan backend
  • Static Generation — Halaman artikel dibuat saat build time untuk performa optimal
  • Client Components — Elemen UI interaktif menggunakan React hooks dan manajemen state

Lapisan Core Service (Java Spring Boot)

  • Autentikasi Pengguna — Autentikasi berbasis JWT dengan dukungan Google OAuth
  • Manajemen Konten — Operasi CRUD untuk artikel, kuis, dan komentar
  • Manajemen Database — PostgreSQL untuk storage persisten dengan migrasi Flyway
  • Pembuatan Event — pattern Outbox untuk pengiriman pesan yang andal ke layanan engine

Lapisan Engine Service (Rust Axum)

  • Engine Gamifikasi — Pelacakan pencapaian, misi harian, kalkulasi XP
  • Manajemen Klan — Pembentukan tim, agregasi skor, perkembangan tingkat
  • Peringkat Papan Peringkat — Pelacakan posisi real-time dengan caching Redis
  • Optimasi Performa — Abstraksi zero-cost untuk pembaruan skor frekuensi tinggi

Interaksi Sistem

pattern BFF (Backend for Frontend)

Semua request frontend ke layanan backend melewati lapisan API routes Next.js. Ini memberikan beberapa keuntungan:

  • Single entry point — Frontend tidak pernah memanggil layanan backend secara langsung, menyederhanakan CORS dan autentikasi
  • Konsolidasi request — Menggabungkan data dari beberapa layanan backend ke dalam response tunggal
  • Penegakan autentikasi — Validasi JWT terpusat sebelum mencapai layanan backend
  • Transformasi response — Menormalisasi format response yang berbeda dari Java dan Rust

Detail Alur Komunikasi

  1. Alur Autentikasi Pengguna

    • Frontend menerima Google ID token
    • Next.js API memvalidasi token dan membuat/memperbarui pengguna di layanan Java
    • Java menghasilkan event outbox untuk pembuatan pengguna
    • Engine Rust menerima event dan membuat shadow user
  2. Alur Permintaan Papan Peringkat

    • Frontend meminta papan peringkat dari Next.js API
    • API mengambil papan peringkat dari engine Rust
    • API memperkaya dengan data pengguna dari Java
    • API menggabungkan dan mengembalikan response terpadu
  3. Alur Pelacakan Kemajuan

    • Pengguna menyelesaikan kuis di frontend
    • Next.js API memvalidasi dan menyimpan di Java
    • Java menghasilkan event pembaruan kemajuan
    • Engine Rust memproses untuk kalkulasi skor dan pencapaian

Karakteristik Architecture Utama

KarakteristikDeskripsi
Polyglot ServicesSetiap layanan menggunakan bahasa/framework optimal untuk domainnya — Java untuk logika bisnis, Rust untuk performa, Next.js untuk rendering React
No Shared StateDatabase terpisah per layanan (Core_DB, Engine_DB) — tidak ada query lintas database secara langsung
Event-Drivenpattern Outbox untuk sinkronisasi async antar layanan (pembuatan pengguna, pembaruan kemajuan)
Fault TolerantDegradasi anggun: jika gamifikasi Rust mati, fitur inti tetap berfungsi melalui mekanisme fallback
Bounded ContextsBatasan jelas antara domain Auth/User, Articles/Quizzes, League/Clans, Gamification

Tanggung Jawab Komponen

KomponenTeknologiTanggung Jawab
Next.js FrontendNext.js 16, React 19, TailwindServer-side rendering, routing API, pustaka komponen UI, komposisi API
Java Core ServiceSpring Boot 4.0.2, Java 21Autentikasi pengguna, manajemen pengguna, CRUD konten (artikel/kuis), pembuatan event outbox
Rust Engine ServiceAxum 0.8, Rust 2024Logika gamifikasi, manajemen klan, kalkulasi papan peringkat, pelacakan pencapaian
Outbox ServiceJava background jobMembaca event outbox dan mempublikasikan ke Rust melalui webhook dengan logika retry
Shadow User SyncRust background jobMenyinkronkan pengguna dari Java ke Engine_DB melalui pattern outbox, menangani idempotensi

pattern Komunikasi Layanan

Integrasi Webhook

Java Core Service mendorong event ke Rust Engine Service melalui HTTP webhooks:

  • Endpoint: POST /sync/users pada layanan Rust
  • Autentikasi: Header x-api-key dengan shared secret
  • Payload: JSON dengan user_id, username, email
  • Retry: Exponential backoff dengan dead-letter queue
  • Idempotensi: event_id unik memastikan pemrosesan duplikat aman

Validasi Sinkron

Rust Engine memvalidasi referensi pengguna terhadap Java Core:

  • Endpoint: GET /auth/users/{user_id} pada layanan Java
  • Autentikasi: Header x-api-key
  • Caching: Rust menyimpan cache data pengguna untuk mengurangi panggilan RPC
  • Fallback: Mengembalikan data cache jika layanan Java lambat/tidak tersedia

Komposisi API

Frontend menggabungkan data dari beberapa layanan:

  • Single endpoint → Beberapa panggilan backend
  • Agregasi data di API routes Next.js
  • Format response konsisten menggunakan struktur success, message, data
  • Penanganan error menggabungkan error dari kedua layanan
📐

Desain Sistem

Bounded contexts, dekomposisi layanan, dan alasan poliglot

🔗

pattern Komunikasi

Komunikasi antar layanan, keamanan API, dan alur data

💾

Skema Database

Skema PostgreSQL untuk Core_DB dan Engine_DB

🚀

Architecture Deployment

Deployment AWS EC2, strategi blue-green, dan stack observabilitas

Memulai

Baca dokumentasi Architecture lengkap untuk memahami bagaimana layanan poliglot Yomu bekerja bersama menciptakan platform pembelajaran yang skalabel.

Mengapa Architecture Ini?

Pendekatan poliglot di Yomu mengatasi beberapa tantangan teknis:

TantanganSolusi
Pembaruan papan peringkat frekuensi tinggiAbstraksi zero-cost Rust untuk latensi sub-milidetik
Autentikasi pengguna yang kompleksEkosistem keamanan Java yang matang dengan Spring Security
Kebutuhan server-side renderingNext.js untuk SEO dan initial page load yang cepat
Konsistensi dataEventual consistency melalui pattern outbox
Skalabilitas timPengembangan independen tanpa overhead koordinasi

Architecture ini telah diuji di production dengan ribuan pengguna konkuren, menunjukkan kemampuannya untuk menskalakan sambil mempertahankan pemisahan tanggung jawab yang bersih.

On this page