35 puan yazan em3ss 2026-01-28 | 24 yorum | WhatsApp'ta paylaş

Beğeni, son görüntülenen ürünler ve takip özellikleri için veritabanı olan Actionbase'i açık kaynak olarak yayımladık.

Merhaba, ben Kakao'da Actionbase'i birlikte geliştiren bir yazılımcıyım.

Dün akşam 8'de (27'si) Actionbase'i Hacker News'e (Show HN) gönderdik ve paylaşımdan yaklaşık 1 saat 30 dakika sonra ana sayfada 1 numaraya yükseldi. Aslında hedefimiz ana sayfada tutunabilmekti, ancak beklediğimizden daha iyi bir ilgi gördü.


Neden yaptık?

Beğeni, son görüntülenen ürünler ve takip gibi özellikler her serviste biraz farklı görünse de, benzer veri yapıları ve işleme yöntemleri tekrar tekrar inşa ediliyor.

Sorun şu ki, her ekip ileri/geri yönlü listeleri, sayaçları ve indeksleri biraz farklı biçimde uyguluyor. Yeniden deneme ya da olay sırası işleme yöntemleri de birbirinden farklı olunca verilerde küçük tutarsızlıklar oluşuyordu; beğeni sayısı gibi toplulaştırılmış verilerin üretilme biçimi de farklı olduğu için operasyon tarafı zorlaşıyordu.

Nasıl çalışıyor?

Actionbase bunu kim (actor), neye (target), nasıl yaptı (action) ilişkisel modeliyle tanımlar ve yazma anında her şeyi önceden hesaplar. Okuma tarafı yalnızca basit sorgulardan oluştuğu için hızlı ve öngörülebilirdir.

Production'da kullanım

İlk production kullanımı KakaoTalk Gift wish oldu. O dönemde eksikleri çoktu, ancak bu beklentiyi karşılamak için pek çok şeyi düzelttik ve bu deneyim projenin büyümesi için bir dönüm noktası oldu.

👉 Hikâyeyi görüntüle

Şu anda çeşitli Kakao servislerinde birkaç yıldır dakikada 1 milyonun üzerinde isteği işliyor. Depolama katmanı HBase tabanlı; farklı ölçeklere yanıt verebilmek için hafif bir depolama katmanı da (SlateDB tabanlı) hazırlanıyor.

Başlarken

Docker ile hemen çalıştırabilirsiniz:

docker run -it ghcr.io/kakao/actionbase:standalone  

Sorularınızı, geri bildirimlerinizi ve yıldızlarınızı memnuniyetle bekliyoruz.

@em3s, @zipdoki, @eazyhozy'den


Soru-Cevap

S: Redis ile de olmaz mı?

Olur. Biz de sıcak veriler için Redis'i cache olarak kullanıyoruz. Ancak ölçek büyüdükçe ekipler arasında yinelenen uygulamalar ortaya çıktı ve olay sırası karıştığında verilerin bozulduğu sorunları yaşadık.


S: PostgreSQL/MySQL sharding yapsanız olmaz mı?

Birçok ekip bunu yapıyor. Bizim yaşadığımız sorunlar sıcak entity'ler, shard'lar arası sorgular ve her serviste farklı cache stratejileriydi. Her seferinde sharding stratejisi tasarlamak zorunda kalmadan yatay ölçeklenebilen bir modele ihtiyaç vardı.


S: Write-time precompute nasıl çalışıyor?

Yazma anında WAL kaydı → lock → durum geçişi → count/index hesaplama → kaydetme → CDC yayımlama. Okuma tarafında ise yalnızca tek bir GET ya da SCAN yeterlidir.


S: Olay sırası karışırsa ne olur?

Her mutation'a bir version (genellikle timestamp) eklenir. Olaylar like(t=100) → like(t=300) → unlike(t=200) sırasıyla gelse bile, version'a göre nihai durum doğru şekilde yakınsar. Aynı olay tekrar oynatılsa bile aynı duruma yakınsaması hedeflenir.


S: Gerçek performans nasıl?

KakaoTalk Gift production'da dakikada 1 milyonun üzerinde sürekli, zirvede ise yaklaşık 2 milyon işlem yürütüyor. Okuma gecikmesi p50 yaklaşık 2~3 ms, p99 yaklaşık 10 ms düzeyinde. Buradaki kilit nokta mutlak sayıdan çok gecikmenin bounded olmasıdır. Okuma, aggregation değil önceden hesaplanmış lookup olduğu için veri büyüse bile performans düşmez.


S: Hangi kullanım senaryoları için uygun?

Beğeni/reaksiyon, takip/takipçi ve son görüntülenen ürünler temel kullanım senaryolarıdır. Öneri/ML özellikleri için CDC üzerinden eğitim verisi sağlayabilir, ancak öneri servisini doğrudan sunmaz. Sohbet mesajları muhtemelen en iyi seçim değildir; çünkü pagination, arama ve threading gibi farklı erişim kalıpları gerekir. E-ticaret sepeti de transaction gerektirir, ancak Actionbase shard'lar arası edge transaction'larını desteklemez.


S: Bu over-engineering değil mi? / Sadece büyük şirketlerin mi ihtiyacı var?

Olabilir. Dürüst olmak gerekirse, küçük ölçekte iyi ayarlanmış PostgreSQL + Redis doğru cevap olacaktır. Actionbase'in çözmeye çalıştığı sorunlar — sharding karmaşıklığı, cache invalidation ve ekipler arası tekrar — ancak belirli bir ölçeğe gelindiğinde ya da birden fazla ekip benzer özellikler geliştirdiğinde ortaya çıkar. Biz bu duvara defalarca çarptığımız için bunu geliştirdik. Bu yüzden küçük dağıtımlarda da kullanılabilmesi için hafif bir backend (SlateDB) de hazırlıyoruz.

👉 Tartışmaya katılın

24 yorum

 
hmmhmmhm 2026-01-28

Ooo... hafif bir backend sürümünü de dört gözle bekliyor olacağım!!

 
em3ss 2026-01-29

Teşekkürler! Hafif backend tarafında, yalnızca S3 ile çalışabilen SlateDB tabanlı bir yön belirlemiş durumdayım, ama henüz gerçekten başlamadım.

Acaba bunu hangi ortamda kullanmayı düşündüğünüzü merak ediyorum. Yan proje mi? Küçük ölçekli prodüksiyon mu? Öncelikleri belirlerken buna referans almak istiyorum.

Vaktiniz olursa HBase/SlateDB oylamasına da katılırsanız sevinirim. Topluluğun görüşü yön belirlemekte yardımcı olacaktır: https://github.com/kakao/actionbase/discussions/144

 
honglu 2026-01-28

Bence son derece pratik bir proje.

Harika!

 
em3ss 2026-01-28

Teşekkürler! Show HN'de göremediğimiz ilginin eksikliğini burada gideriyoruz.

Acaba hangi kısmı pratik bulduğunuzu merak ediyorum. Benzer bir sorun yaşadınız mı? Ya da bu özelliği uygulamanız gereken bir durum mu var?

Bir de, yorum yazma fırsatı çıkmışken söylemek istediğim bir şey var. Dokümantasyonda unbounded traversal yapmadığımızı yazmıştık, ama bounded multi-hop bu yılki planlarımız arasında. Yani "arkadaşın beğendiği ürün" gibi 2-hop sorgular. https://actionbase.io/ko/stories/unified-graph/

 
honglu 2026-01-28

Bana pratik gelen nokta şuydu:

Ben de benzer kaygılar yaşamıştım ve Redis gibi bir KV store’u temel alarak kod seviyesinde bir soyutlama katmanı uygulamayı denemiştim; bu yüzden dokümanın anlatmak istediği hedef ve yönün, ayrıca genel yapının tamamının çok pratik olduğunu düşündüm.

Ayrıca birden fazla ekibin ihtiyaç ve kaygılarını yansıtıp bunları bir araya getirerek şirketin dahili bir ürününü oluşturup açık kaynak olarak yayımlamış olmalarını da harika buluyorum. :)

Son olarak ille de bir ek yapacak olursam, kullanacak olanlar için mevcut dokümantasyonun şimdiden yeterli olacağını düşünüyorum ama kopyala-yapıştır seviyesinde takip edilebilecek bir dağıtım örneği ile önerilen kullanım senaryolarını ya da altyapı referanslarını example olarak içine yedirirlerse daha da cazip olacağını düşünüyorum.

Kolay gelsin!

 
em3ss 2026-01-28

Aynı dertleri yaşamış olmanıza gerçekten çok sevindim. Ayrıca, bunu harika diye ifade ettiğiniz için içtenlikle teşekkür ederim.

Bahsettiğiniz kısma katılıyorum. Ben de araç olarak kullanacağım kısımları rahatça kurup, çözmem gereken probleme odaklanmak istiyorum.

Ancak şu anda açık kaynağın çok erken aşamasındayız ve sınırlı zamanda bu temel değeri nasıl aktaracağımıza odaklandık. Bu aktarılamazsa, gerçekten sorun çözebilecek kişiler de bunu yapamaz hale gelir. Artık bahsettiğiniz yönde ilerlemeyi düşünüyoruz. Ancak, dahili stack olan HBase + Kafka ile mi gidelim, yoksa yeni geliştirme eforu gerekse de SlateDB + S2'ye mi yönelelim, buna dair geri bildirim almak isterim. Bizde HBase mühendisleri operasyonu yürüttüğü için rahat kullanıyoruz, ama birçok yerde durum böyle olmayacaktır. Görüş bırakırsanız sevinirim (oy vermeniz bile yeter):

https://github.com/kakao/actionbase/discussions/144

 
honglu 2026-01-28

Bahsettiğiniz 2-hop sorgu gibi yol haritası da bence çok çekici.

Ama mevcut belgede anlatılmak isteneni kod benzeri örneklerle iyi yansıtabilirseniz, çok daha patlayıcı bir ilgi göreceğini düşünüyorum.

 
em3ss 2026-01-28

Katılıyorum. “Bunu örneklerle iyi yedirmek.” Ama bunun göründüğü kadar kolay olmadığını fark ettik T_T Bu konuda farklı açılardan düşünmeye çalışacağız. Teşekkürler!

Bu arada, ekip arkadaşımızın büyük emek vererek hazırladığı https://actionbase.io/guides/build-your-social-media-app/ interaktif rehberine bakma fırsatınız oldu mu merak ediyorum. Bu da böyle bir denemeydi. Söylediğiniz yöne ne kadar uyduğunu tekrar düşünmemizi sağlıyor. Çabalamaya devam edeceğiz.

 
honglu 2026-01-28

Ah, bir de yeni eklerken gözden kaçırdığım bir nokta var; yalnızca rehberlerde değil, genel olarak dokümantasyon yapısında da emek hissediliyor.

Yine de daha önce belirttiğim gibi, örnek olarak hazırlanmış yapılandırmayı git clone ile kolayca takip edilebilir hale getirebilirseniz daha da iyi olur diye düşünüyorum.

 
em3ss 2026-01-29

Aşağıdaki yoruma birlikte yanıt vereceğim.

 
honglu 2026-01-28

Buna yorum yazdığımı sanıyordum ama görünmeyince en baştan tekrar yazıyorum...(hüngür hüngür)
Kafama göre yazdığım bir yoruma bu kadar özenli yanıt verdiğiniz için teşekkür ederim.. hehe;;

Neyse, asıl demek istediğim şu: Bunu benimsemek isteyecek küçük ekiplerle büyük ekiplerin ortamlarının birbirinden oldukça farklı olacağını düşünüyorum ve "bunu bir deneyelim mi?" dendiğinde ikna etmesi en kolay formatın, ekibin kullandığı dilde yazılmış örnek bir proje olduğunu düşünüyorum.

Önce yaygın diller için örnek projeler hazırlayıp bunların üzerine hızlı başlangıç içerikleri kurgulanırsa çok daha rahat bir kafayla okunabilir ve git clone ile şak diye deneyebilmek bence çok cazip olur.

Ayrıca bu yaklaşımın best practice'leri anlatmak için de en iyi yol olduğunu düşünüyorum.

Elbette projenin doğası gereği bunun kolay olmadığını biliyorum ama buna rağmen en cazip tarafının bu olduğunu düşünüyorum.

Bir de mümkünse örnekler pulumi ya da terraform gibi araçlarla birlikte kurgulanırsa daha da iyi olabilir.

 
em3ss 2026-01-29

Gerçekten hiç düşünmediğim bir bakış açısı. Böyle bir öneri için gerçekten teşekkür ederim. Topluluktan elde edilebilecek güzel bir deneyim bu.

Bahsettiğiniz yönü nasıl hayata geçirebileceğimizi düşüneceğim. pulumi ya da terraform örneklerini de. Belki yönü netleştirip topluluktan destek de isteyebiliriz. O zaman katkı sunarsanız daha da memnun olurum.

Ek olarak, vibe coding çağında bunun temelini nasıl oluşturabiliriz diye düşünüyorum. "Bana bir uygulama oluştur" dediğinizde React, Svelte gibi teknolojilerle yazılıyor ya. Onunla benzer bir konum. "Beğeni özelliği ekle" dendiğinde Actionbase'in bu rolü üstlendiği bir durumdan bahsediyorum.

Bu kısım da sürekli aklımda dönüp duruyor. Bu yüzden AI araçlarının okuyabilmesi için dokümantasyona çok özen gösterdim ve son dönemde bunun potansiyelini de görüyorum.

Referans:

llms.txt - https://actionbase.io/llms-txt/
Anthropic hackathon kazananı tarifi denemesi - https://github.com/kakao/actionbase/discussions/90

 
ethanhur 2026-01-28

Benzer bir use case’e sahip yerlerde gayet iyi kullanılabilir gibi görünüyor. Açık şekilde paylaştığınız için teşekkürler!

Ancak ingestion tarafında Lock kullanılan kısımda bir sorun yaşanıp yaşanmadığını merak ediyorum. Veri write tarafında trafik yaklaşık ne kadardı? Lock contention vb. nedenlerle sorun olan durumlar hiç oldu mu, bunu merak ediyorum.

 
em3ss 2026-01-28

Değerli sorunuz için teşekkür ederiz!

Lock, edge (source, target) çifti bazında alınır (ör: Alice→Phone). Çakışma yalnızca aynı edge’e aynı anda yazıldığında ortaya çıkar; pratikte ise bir kullanıcının aynı hedefe aynı anda beğeni vermesi neredeyse hiç görülmediği için çakışma düşüktür. Bu, veritabanımızın kullanım senaryosunun bir özelliğidir.

Write trafiği pikte dakikada birkaç yüz bin işlem seviyesindedir. Okuma 1 milyon+ düzeyindedir ve yazma bunun altındadır.
Benchmark için bkz. (okuma %85, yazma %15) - https://actionbase.io/ko/operations/benchmarks/

Hot entity’lerde (popüler ürünler vb.) lock çakışması oluşabilir; bunun nedeni count güncellemesidir (HBase Increment). Bu kısmı ayrıca optimize ederek ele alıyoruz. Yüksek frekanslı yazımlarla ilgili: https://actionbase.io/ko/stories/kakaotalk-gift-recent-views/

 
ifmkl 2026-01-28

Oo.....

 
em3ss 2026-01-28

Teşekkürler! İlginizi çekiyorsa, lütfen şu sonraki yön hakkında da görüşlerinizi paylaşın: https://github.com/kakao/actionbase/discussions/144

 
kissdesty 2026-01-28

Vay, bu çok faydalı görünüyor.

 
em3ss 2026-01-28

Teşekkürler! Benzer bir özelliği hayata geçirirken yaşadığınız sorunlar olup olmadığını merak ediyorum. Sırada neye öncelik vermemiz gerektiği konusunda topluluğun görüşlerini topluyoruz: https://github.com/kakao/actionbase/discussions/144

 
winterjung 2026-01-28

Geliştirici dokümantasyonu gerçekten çok iyi hazırlanmış. Stories ile gösterdikleri kullanım senaryoları, hızlı başlangıç ve SSS, neredeyse teknik blog düzeyinde doluydu.

 
em3ss 2026-01-29

Vay, çok teşekkür ederim. 5 Ocak'taki açık kaynak yayınının ardından 27'sindeki topluluk duyurusuna kadar belgelere çok emek verdik; bunu fark etmenize sevindim.

Açık kaynağın ilk döneminde olduğumuz için "bu nedir, neden gerekli" konusuna odaklandık; sanırım ortaya böyle bir sonuç çıktı. Belgeleri incelerken eksik ya da yetersiz bulduğunuz kısımlar olursa lütfen rahatça söyleyin!

Bu arada, https://actionbase.io/llms-txt/ adresini kullanırsanız beklemediğiniz sonuçlar da elde edebilirsiniz. Son zamanlarda Actionbase'i pek tanımayan birinin bu prompt ile karmaşık ihtiyaçlar için en uygun sonuca ulaştığını görünce, dünyanın gerçekten değiştiğini bir kez daha hissettim.

ChatGPT, Claude, Gemini gibi araçlarda aşağıdakini kullanmayı deneyin.

Read https://actionbase.io/_llms-txt/core.txt  
  
You are an assistant answering questions about Actionbase.  
Answer using only the provided Actionbase documentation.  
If the documentation does not specify the answer, say so explicitly.  
  
{Soru}  
 
em3ss 2026-01-28

Şüphe duymanız anlaşılır. Ama manipülasyon değil.

İlk yoruma 4 link koyunca 30 dakika boyunca shadowban yedim. O sırada bağlamı açıklayan şey görünmediği için insanlar da öylece geçip gitti. O an gerçekten çok tedirgin oldum. Arada kaynayacak diye. Linkleri çıkarıp yeniden yazınca ancak o zaman 1. sıraya çıktı, o yoruma da yorumlar gelmeye başladı.

Bahsettiğiniz o yorum yapan kişiyi ben de kontrol ettim. Kısa süre önce üye olduğunu da gördüm. Yine de minnettar oldum. Sonuçta en azından bir tepki vardı. O yüzden özenle cevap yazdım. "why not redis?" Bunu önceden hazırlamıştım. DB ile ilgiliyse mutlaka gelen soru bu oluyor. Bu kadar ciddi hazırlanmışken gerçekten böyle bir soru gelir mi ki? diye düşündüm. Ama bir önceki gün s2-streamstore sırasında gördüm. "TCP ile yapsana" diye bir cevap gelmişti. O yüzden hazırlandım.

Bu arada ekip arkadaşlarıma kesinlikle upvote vermemelerini ve yorum yazmamalarını özellikle rica ettim. Yanlışlıkla yaparlar diye oturumlarını da kapatmalarını söyledim. HN'in bu konuda hassas olduğunu önceden biliyordum.

Neyse, anlatsam da inanmayabilirsiniz, o yüzden... lütfen bir kez repomuza bakın. Bunlar hayatta kalmış kodlar. Birlikte çalıştığım arkadaşlar bu yazıyı görüp kırılmasın diye bunu ayrıntılı yazıyorum. https://github.com/kakao/actionbase/discussions/32 lütfen bir kez bakın. Teşekkür ederim.

Ve,

https://actionbase.io/ko/stories/kakaotalk-gift-wish/ buna da bakın. Büyük ölçekli sistemler üzerine hiç kafa yorduysanız, faydalı olabilecek şeyleri elimden geldiğince samimiyetle yazdım.

 
em3ss 2026-01-28

Ah, ayrıca aşağıdaki X gönderime bakarsanız göreceğiniz gibi, 1. sıradayken o yorum henüz yazılmamıştı. O yorum muhtemelen 2. ya da 3. sıraya düştüğünde yazılmıştır. Atıştırmalık yenen alanda onu iki parmakla tutup kutudan çıkardığım anda yorum gelince koşup gidip yorum yazdım. Ondan sonra 12 saat boyunca 30. sıraya kadar geriledi, şimdi ise 2. sayfada ağla