Actionbase – Basis data untuk suka, baru dilihat, dan follow
(github.com/kakao)Kami telah merilis open source basis data Actionbase untuk fitur seperti suka, produk yang baru dilihat, dan follow.
Halo, saya adalah salah satu developer di Kakao yang membuat Actionbase.
Kemarin pukul 8 malam (tanggal 27), kami memposting Actionbase di Hacker News (Show HN), dan dalam sekitar 1 jam 30 menit setelah dipublikasikan berhasil naik ke peringkat 1 di halaman depan. Sebenarnya target kami hanya bertahan di halaman depan, tetapi responsnya jauh lebih baik dari yang diperkirakan.
Mengapa kami membuatnya?
Fitur seperti suka, produk yang baru dilihat, dan follow memang sedikit berbeda bentuknya di tiap layanan, tetapi pada akhirnya tim-tim terus membangun ulang struktur data dan cara pemrosesan yang mirip.
Masalahnya, tiap tim mengimplementasikan daftar maju/balik, count, dan indeks dengan cara yang sedikit berbeda. Cara menangani retry maupun urutan event juga berbeda-beda, sehingga ada kasus ketika data menjadi tidak sinkron secara halus, dan cara membuat data agregat seperti jumlah suka pun berbeda antar tim sehingga pengoperasiannya sulit.
Bagaimana cara kerjanya?
Actionbase mendefinisikan ini sebagai model relasi siapa (actor) melakukan apa (action) terhadap apa (target), lalu menghitung semuanya terlebih dahulu pada saat write. Karena read hanya berupa query sederhana, hasilnya cepat dan dapat diprediksi.
Penerapan di produksi
Penerapan produksi pertamanya adalah KakaoTalk Gift wish. Saat itu masih banyak kekurangan, tetapi untuk memenuhi harapan tersebut kami terus memperbaiki banyak hal, dan pengalaman itu menjadi momentum yang membuat proyek ini berkembang.
Saat ini, di beberapa layanan Kakao, sistem ini telah memproses lebih dari 1 juta request per menit selama bertahun-tahun. Repositorinya berbasis HBase, dan untuk bisa menangani berbagai skala, kami juga sedang menyiapkan penyimpanan ringan (berbasis SlateDB).
Memulai
Anda bisa langsung menjalankannya dengan Docker:
docker run -it ghcr.io/kakao/actionbase:standalone
- 📦 GitHub: https://github.com/kakao/actionbase
- 🚀 Quick start: https://actionbase.io/quick-start/
Kami sangat berterima kasih atas pertanyaan, masukan, maupun star.
T&J
T: Bukankah ini juga bisa dilakukan dengan Redis?
Bisa. Kami juga menggunakan Redis sebagai cache untuk hot data. Namun, seiring skala yang membesar, kami mengalami masalah karena tiap tim membuat implementasi duplikat, dan ketika urutan event kacau, data pun menjadi salah.
T: Bukankah cukup melakukan sharding PostgreSQL/MySQL?
Banyak tim memang melakukannya. Masalah yang kami hadapi adalah hot entity, query lintas shard, dan strategi cache yang berbeda di tiap layanan. Kami membutuhkan model yang bisa scale out secara horizontal tanpa harus merancang strategi sharding setiap kali.
T: Bagaimana cara kerja write-time precompute?
Pada saat write: pencatatan WAL → lock → transisi state → perhitungan count/indeks → penyimpanan → publikasi CDC. Untuk read, cukup lakukan single GET atau SCAN.
T: Bagaimana jika urutan event kacau?
Setiap mutation diberi version (biasanya timestamp). Bahkan jika event datang dalam urutan like(t=100) → like(t=300) → unlike(t=200), state akhir akan tetap konvergen dengan benar berdasarkan version. Tujuannya adalah agar replay event yang sama pun tetap konvergen ke state yang identik.
T: Bagaimana performa nyatanya?
Di produksi KakaoTalk Gift, sistem ini secara berkelanjutan menangani lebih dari 1 juta request per menit, dengan puncak sekitar 2 juta. Latensi baca adalah p50 sekitar 2~3ms, p99 sekitar 10ms. Poin utamanya bukan angka absolutnya, melainkan bahwa latensinya bounded. Karena read adalah lookup yang sudah dihitung sebelumnya, bukan agregasi, performanya tidak menurun meskipun data membesar.
T: Cocok untuk use case apa?
Suka/reaksi, follow/follower, dan produk yang baru dilihat adalah use case utamanya. Untuk fitur rekomendasi/ML, CDC dapat menyediakan data training, tetapi sistem ini bukan untuk melayani rekomendasi secara langsung. Untuk pesan chat, ini kemungkinan bukan pilihan terbaik—karena dibutuhkan pola akses lain seperti pagination, pencarian, dan threading. Keranjang e-commerce juga memerlukan transaksi, sedangkan Actionbase tidak mendukung transaksi lintas edge.
T: Bukankah ini overengineering? / Bukankah ini hanya dibutuhkan perusahaan besar?
Mungkin saja. Sejujurnya, untuk skala kecil, PostgreSQL + Redis yang dituning dengan baik adalah jawaban yang tepat. Masalah yang diselesaikan Actionbase—kompleksitas sharding, invalidasi cache, dan duplikasi antar tim—biasanya muncul ketika skalanya sudah cukup besar atau banyak tim membuat fitur yang mirip. Kami membuatnya karena sudah berkali-kali menabrak batas itu. Karena itu, kami juga sedang menyiapkan backend ringan (SlateDB) agar bisa dipakai dalam deployment yang lebih kecil.
24 komentar
Wah... saya juga menantikan versi backend ringan!!
Terima kasih! Untuk backend ringan, arahnya sudah saya tetapkan berbasis SlateDB yang hanya membutuhkan S3, tetapi saya masih belum sempat benar-benar mulai.
Kalau boleh tahu, Anda berencana memakainya di lingkungan seperti apa? Proyek sampingan? Produksi skala kecil? Saya ingin menjadikannya referensi untuk menentukan prioritas.
Kalau ada waktu, mohon juga ikut voting untuk HBase/SlateDB. Sepertinya masukan komunitas akan membantu menentukan arah: https://github.com/kakao/actionbase/discussions/144
Saya rasa ini proyek yang sangat praktis.
Keren sekali!
Terima kasih! Saya menuntaskan rasa penasaran atas perhatian yang tidak sempat saya dapatkan di Show HN di sini.
Kalau boleh tahu, bagian mana yang menurut Anda terasa praktis? Apakah Anda pernah mengalami masalah serupa? Atau apakah Anda sedang berada dalam situasi yang membutuhkan implementasi fitur tersebut?
Dan karena akhirnya ada kesempatan untuk berkomentar, ada satu hal yang ingin saya sampaikan. Di dokumentasi memang tertulis bahwa kami tidak melakukan unbounded traversal, tetapi bounded multi-hop ada dalam rencana tahun ini. Misalnya kueri 2-hop seperti "produk yang disukai teman". https://actionbase.io/ko/stories/unified-graph/
Hal yang saya rasa praktis adalah,
Saya juga pernah punya kekhawatiran yang mirip, dan pernah mengimplementasikan abstraction layer di level kode berbasis KV store seperti Redis, jadi saya merasa tujuan dan arah yang ingin disampaikan dokumennya, sampai keseluruhan susunannya, semuanya sangat praktis.
Dan saya juga merasa keren bahwa mereka merangkainya dengan mencerminkan kebutuhan dan pertimbangan dari berbagai tim, lalu membuatnya menjadi produk internal perusahaan dan merilisnya sebagai open source. hehe
Terakhir, kalau boleh benar-benar menambahkan sedikit, bagi yang akan menggunakannya dokumen saat ini pun sudah cukup, tetapi saya rasa akan jadi lebih menarik kalau ada contoh deployment yang bisa diikuti sampai tingkat copy-paste, serta use case yang direkomendasikan atau referensi infrastruktur yang dituangkan sebagai example.
Semangat!
Wah, senang sekali mengetahui Anda juga punya kekhawatiran yang sama. Dan saya sungguh berterima kasih karena Anda menyebutnya keren.
Saya juga sepakat dengan poin yang Anda sampaikan. Saya pun ingin menyiapkan bagian yang akan digunakan sebagai alat dengan nyaman, lalu fokus pada masalah yang memang harus saya selesaikan.
Namun, saat ini masih tahap awal open source, dan dengan waktu yang terbatas saya memfokuskan diri pada bagaimana menyampaikan nilai inti ini. Jika penyampaiannya tidak berhasil, maka orang-orang yang sebenarnya bisa memecahkan masalah nyata pun tidak akan bisa melakukannya. Sekarang kami berencana melangkah ke arah yang Anda sebutkan. Namun, kami ingin menerima masukan apakah sebaiknya menggunakan stack internal kami, HBase + Kafka, atau beralih ke SlateDB + S2 meski membutuhkan upaya pengembangan baru. Kami bisa menggunakannya dengan nyaman karena ada engineer HBase yang mengelolanya, tetapi di banyak tempat kondisinya tidak seperti itu. Kami akan sangat berterima kasih jika Anda meninggalkan pendapat (setidaknya lewat voting):
https://github.com/kakao/actionbase/discussions/144
Saya juga merasa roadmap seperti kueri 2-hop yang Anda sebutkan sangat menarik.
Namun, jika maksud yang ingin disampaikan dalam dokumentasi saat ini bisa dituangkan dengan baik lewat contoh seperti kode, saya rasa responsnya akan jauh lebih meledak.
Saya setuju. “Menyajikannya dengan baik lewat contoh.” Tapi ternyata ini tidak semudah yang terlihat, hiks. Saya akan memikirkannya dari berbagai sisi. Terima kasih!
Saya juga penasaran apakah Anda sempat melihat panduan interaktif yang disiapkan dengan sangat serius oleh rekan kami: https://actionbase.io/guides/build-your-social-media-app/. Ini adalah salah satu upaya ke arah itu. Saya jadi meninjau kembali apakah ini sudah sejalan dengan arah yang Anda maksud. Kami akan terus berusaha.
Oh ya, ada satu hal yang baru saya sadari setelah memasangnya, dan menurut saya bukan hanya panduannya saja, tetapi juga keseluruhan susunan dokumentasinya terasa dibuat dengan sangat matang.
Namun, akan lebih baik lagi jika konfigurasi yang disiapkan sebagai contoh bisa dibuat mudah untuk diikuti melalui
git clone, seperti yang saya sebutkan sebelumnya.Saya akan membalas bersama di komentar di bawah.
Saya kira saya sudah menulis komentar ini, tapi karena tidak terlihat, saya menulisnya lagi dari awal... (hiks hiks)
Terima kasih sudah membalas dengan sangat sungguh-sungguh untuk komentar yang saya tulis dengan santai.. hehe;;
Bagaimanapun, inti yang ingin saya sampaikan adalah menurut saya lingkungan tim kecil maupun tim besar yang ingin mencoba mengadopsi ini akan sangat berbeda, dan saat berpikir santai, “bagaimana kalau coba pakai ini?”, bentuk yang paling mudah untuk meyakinkan orang adalah proyek contoh yang ditulis dengan bahasa yang digunakan tim tersebut.
Kalau terlebih dahulu dibuat proyek contoh dalam bahasa-bahasa yang umum dipakai, lalu berdasarkan itu disusun panduan memulai cepat, orang akan jauh lebih mudah membacanya dengan santai, dan menurut saya daya tariknya ada pada bisa langsung mencoba hanya dengan
git clone.Dan menurut saya, cara ini juga yang paling baik untuk menjelaskan best practice.
Tentu saya paham bahwa karena karakteristik proyek ini, melakukan hal seperti itu tidak akan mudah, tetapi meskipun begitu saya tetap merasa itulah yang paling menarik.
Selain itu, kalau memungkinkan, menurut saya akan lebih baik lagi jika contohnya disusun bersama alat seperti pulumi atau terraform.
Ini sudut pandang yang sama sekali tidak terpikirkan. Terima kasih banyak atas usulan seperti ini. Ini benar-benar pengalaman berharga yang bisa didapat dari komunitas.
Saya akan memikirkan bagaimana mewujudkan arah yang Anda sampaikan. Termasuk contoh
pulumiatauterraform. Mungkin kami juga bisa merapikan arahnya lalu meminta dukungan dari komunitas. Jika saat itu Anda ikut berkontribusi, kami akan semakin berterima kasih.Selain itu, saya juga sedang memikirkan bagaimana agar ini bisa menjadi fondasi di era vibe coding. Ketika diminta "tolong buatkan aplikasi", biasanya ditulis dengan React, Svelte, dan sebagainya. Posisi yang seperti itu. Maksud saya adalah situasi ketika saat diminta "tolong tambahkan fitur suka", Actionbase yang menjalankan peran tersebut.
Bagian ini juga terus terngiang di kepala saya. Karena itu, saya sangat memperhatikan dokumentasi agar bisa dibaca oleh tool AI, dan belakangan saya juga mulai melihat potensinya.
Referensi:
llms.txt - https://actionbase.io/llms-txt/
Percobaan resep pemenang hackathon Anthropic - https://github.com/kakao/actionbase/discussions/90
Sepertinya ini bisa digunakan dengan baik di tempat yang memiliki use case serupa. Terima kasih sudah membukanya ke publik!
Namun, saya penasaran apakah tidak ada masalah pada bagian yang menggunakan lock saat ingestion. Untuk write data, kira-kira trafiknya ada di level seperti apa? Apakah pernah ada kasus yang menjadi masalah karena contention lock dan semacamnya?
Terima kasih atas pertanyaannya yang sangat bagus!
Lock diambil pada level pasangan edge
(source, target)(contoh: Alice→Phone). Kontensi hanya terjadi jika ada penulisan simultan pada edge yang sama, tetapi dalam praktiknya sangat jarang satu pengguna menekan suka pada target yang sama secara bersamaan, jadi tingkat kontensinya rendah. Ini adalah karakteristik use case database kami.Traffic write pada puncaknya berada di kisaran ratusan ribu per menit. Read mencapai 1 juta+, dan write lebih rendah dari itu.
Lihat benchmark (read 85%, write 15%) - https://actionbase.io/ko/operations/benchmarks/
Untuk entitas panas (seperti produk populer), kontensi lock bisa terjadi, dan ini disebabkan oleh pembaruan count (
HBase Increment). Bagian ini kami tangani secara terpisah dengan optimisasi khusus. Terkait write frekuensi tinggi: https://actionbase.io/ko/stories/kakaotalk-gift-recent-views/Oh.....
Terima kasih! Jika Anda tertarik, silakan tinggalkan juga pendapat Anda tentang arah berikut: https://github.com/kakao/actionbase/discussions/144
Wah, sepertinya ini akan sangat berguna.
Terima kasih! Saya penasaran apakah ada masalah yang Anda alami saat mengimplementasikan fitur serupa. Kami sedang mengumpulkan pendapat komunitas tentang apa yang harus kami kerjakan berikutnya terlebih dahulu: https://github.com/kakao/actionbase/discussions/144
Dokumentasi pengembangnya benar-benar ditulis dengan sangat baik. Use case yang ditunjukkan lewat stories, quick start, dan FAQ-nya sangat berbobot sampai terasa setara dengan sebuah blog teknis.
Wah, terima kasih banyak. Dari rilis open source pada 5 Januari hingga dibuka ke komunitas pada tanggal 27, kami sudah mencurahkan banyak usaha pada dokumentasinya, jadi saya senang itu diperhatikan.
Karena ini masih tahap awal open source, kami fokus pada "apa ini dan mengapa ini diperlukan", jadi sepertinya hasilnya menjadi seperti ini. Jika ada bagian yang terasa kurang saat membaca dokumentasinya, silakan sampaikan dengan nyaman!
Sebagai referensi, jika Anda memanfaatkan https://actionbase.io/llms-txt/, Anda mungkin bisa mendapatkan hasil yang tidak terduga. Belakangan, melihat seseorang yang belum terlalu mengenal Actionbase mencapai kesimpulan optimal untuk kebutuhan yang kompleks dengan prompt ini membuat saya kembali merasa bahwa dunia memang sudah berubah.
Coba gunakan yang berikut di ChatGPT, Claude, Gemini, dan lainnya.
Memang bisa menimbulkan kecurigaan. Tapi ini bukan manipulasi.
Saya memasukkan 4 tautan di komentar pertama, lalu kena shadowban selama 30 menit. Selama itu penjelasan konteksnya tidak terlihat, jadi orang-orang lewat begitu saja. Saat itu saya benar-benar cemas. Takut tenggelam. Setelah saya hapus tautannya dan kirim lagi, barulah naik ke posisi 1, dan komentar pun mulai berdatangan.
Soal komentator yang Anda sebut itu, saya juga sudah cek. Bahwa akunnya memang belum lama dibuat. Tapi saya tetap berterima kasih. Setidaknya ada respons. Jadi saya balas dengan sungguh-sungguh.
why not redis?ini sudah saya siapkan dari awal. Kalau topiknya soal DB, itu pertanyaan yang pasti muncul. Saya sempat berpikir, masa saya sudah siap seserius ini lalu pertanyaan seperti itu benar-benar datang? Tapi sehari sebelumnya, waktu s2-streamstore, saya sudah tahu. Karena ada balasan, "pakai TCP saja". Jadi saya siapkan.Sebagai referensi, saya juga sudah minta ke para anggota tim supaya jangan pernah memberi upvote/komentar. Saya bahkan minta mereka logout supaya tidak sampai keliru. Karena saya sudah tahu dari awal kalau HN sensitif soal itu.
Bagaimanapun, meski saya jelaskan pun Anda mungkin tetap tidak percaya... jadi tolong lihat repo kami sekali saja. Ini kode yang berhasil bertahan. Saya menulis ini dengan detail karena khawatir rekan-rekan yang bekerja bersama saya akan tersinggung kalau membaca postingan ini. https://github.com/kakao/actionbase/discussions/32 mohon dilihat sekali saja. Terima kasih.
Dan,
https://actionbase.io/ko/stories/kakaotalk-gift-wish/ ini juga. Kalau Anda pernah memikirkan sistem berskala besar, saya menulis isinya sebaik mungkin agar bisa membantu.
Oh, dan seperti yang bisa kalian lihat di X saya di bawah, posisi nomor 1 itu sebelum komentar tersebut diposting. Komentar itu kemungkinan diposting saat sudah turun ke peringkat 2~3. Saat saya sedang di area ngemil dan baru saja mengeluarkannya dari case Dujjonku, komentar itu masuk, jadi saya langsung berlari dan membalas komentarnya. Setelah itu, selama 12 jam posisinya terus terdorong turun sampai peringkat 30, dan sekarang ada di halaman kedua T_T
Saya juga mempostingnya di X: https://x.com/enmskim/status/2016412136482996689
x: https://x.com/enmskim/status/2016941043628097965