Veritabanları ve Karmaşıklıkları Artık Neden Gereksiz
(blog.redplanetlabs.com)- Backend karmaşıklığının nedeni, belirli bir ürünün kusurlarından çok, veritabanlarının uzun süredir koruduğu kavramsal yapının uygulama tasarımını kısıtlamaya devam etmesidir
- Veritabanları global mutable state gibi davranır; sabit veri modeli, sınırlı şema, normalizasyon ile denormalizasyon arasındaki gerilimi geliştiricinin sırtına yükler
- Önerilen alternatif, event sourcing ile materialized views’ı birleştirerek kaynak veriyi indeks görünümlerinden ayırmak ve indeksleri veri modeli değil, dayanıklı veri yapıları olarak ele almaktır
- Red Planet Labs’in Rama’sı depots, ETL, PStates, query topologies ile veri alımı, işleme, indeksleme, sorgulama ile dağıtım ve izlemeyi tek platformda birleştirir
- Twitter ölçeğinde Mastodon’un yeniden uygulanması örneğinde Rama’nın 10 bin satır ve 9 kişi-ay ile hayata geçirildiği; karşılaştırılan Twitter tüketici ürününün ise 1 milyon satır ve yaklaşık 200 kişi-yıl gerektirdiği belirtiliyor
Veritabanı karmaşıklığının çıkış noktası
- Sorunun odağı, belirli veritabanı ürünlerinin API’leri, operasyonel zorlukları veya keyfi sınırlamaları değil; bugüne kadar varlığını sürdüren kolektif kavramsal yapıdır
- Mevcut yaklaşımın sorunları, ancak daha iyi bir yöntem ortaya çıktığında netleşir; alternatif olarak event sourcing ile materialized views birleşimi öneriliyor
Global mutable state olarak veritabanı
- Programcılara global değişken kullanımını en aza indirmeleri öğretilir, ancak veritabanları da özünde global mutable statetir
- Veritabanlarının sıradan global değişkenlere göre yönetilmesi daha zor olan yönleri vardır
- Etkileşimler birden fazla sisteme yayıldığı için state hakkında akıl yürütmek zordur
- State dayanıklı olduğu için, hata düzeltilse bile bozulmuş veri otomatik olarak onarılmaz
- Bozulmanın kapsamını doğru belirlemenin veya kusursuz biçimde düzeltmenin zor olduğu durumlar vardır
- Yedeğe dönmek ya da yedeğin bir bölümünü birleştirmek en iyi çözüm değildir
- Event sourcing ve materialized views kullanıldığında görünümler kaynak logdan yeniden hesaplanabilir; böylece bozulmuş indeks state’ini düzeltme imkânı doğar
Sabit veri modelinin sınırları
- Veritabanları key/value, document, relational, column-oriented, graph gibi veri modelleri merkezinde tasarlanır
- Tek bir veri modelinin tüm kullanım senaryolarını desteklemesi zor olduğundan, şirketler çoğu zaman birden fazla veritabanını birlikte kullanır
- Daha genel indeks soyutlaması veri modeli değil, veri yapısıdır
- Key/value: map
- Document: map of maps
- Relational: map of maps, secondary indexes ek map’lerdir
- Column-oriented: map of sorted maps
- Dayanıklı veri yapıları diskte saklanır, çok büyük boyutlara ulaşabilir ve iç içe veri yapılarını da ifade edebilir
- İndeksler veri yapısı kombinasyonları olarak tanımlandığında, mevcut veri modellerinin yanı sıra çok daha çeşitli indeks biçimleri oluşturulabilir
- Uygulama domain modelini veritabanına uydurmak için eğip bükmek yerine, depolama biçimini domain modeline uydurmak mümkün olursa temel karmaşıklık azalır
Normalizasyon ve denormalizasyon gerilimi
- İlişkisel veritabanı kullanıcıları sonunda normalizasyon ile denormalizasyon arasında seçim yapmak zorunda kalır
- Normalize depolama, net bir doğruluk kaynağı oluşturur ve tutarsızlık olasılığını azaltır; ancak join sayısı arttığı için sorgu maliyeti yükselebilir
- Performans nedeniyle aynı bilgi birden fazla biçimde saklanırsa, hata olduğunda veri tutarsızlığı oluşabilir
- RDBMS mimarisi, doğruluk kaynağı ile hızlı sorgular için indeks depolarını aynı datastore içinde birleştirir
- Çözüm, bu iki rolü ayıran bir yapıdır
- Bir alt sistem doğruluk kaynağını ifade eder
- Diğer alt sistem, bu kaynaktan istenen sayıda indeks deposunu materialize eder
- İkinci sistem kaynak veriden indeksleri yeniden hesaplayabiliyorsa tutarsızlıklar düzeltilebilir
Sınırlı şema ve domain ifadesi
- Veritabanlarında saklanabilen değer türleri üründen ürüne büyük ölçüde değişir
- Bazı veritabanları yalnızca byte array gibi blob’lara izin verir
- Bazı veritabanları integer, floating-point, string, date gibi çeşitli tiplere izin verir
- Domain nesnelerinin içindeki iç içe bilgileri doğrudan sorgulamak veya toplulaştırmak için birinci sınıf temsil olarak saklamak nadirdir
- Veritabanının uygulama dili ile uygulama dilinin farklı olması birlikte çalışabilirliği zorlaştırır; Postgres için protobuf extension gibi eklentiler de zahmetli ve sınırlıdır
- ORM, domain temsili ile veritabanı temsilini eşler; ancak soyutlama sızarak sorunlara yol açabilir
- Veriyi ideal domain temsilinden farklı bir şekilde indekslemek gerekiyorsa adaptör kodu gerekir ve verimli biçimde çalıştırılabilecek sorgular da sınırlanabilir
Karmaşık dağıtım ve à la carte model
- Eksiksiz bir backend yalnızca veritabanından oluşmaz; veritabanları, işleme sistemleri, izleme araçları, zamanlayıcılar gibi birçok aracın birlikte kullanılması gerekir
- Büyük ölçekli backend’lerde onlarca aracı birleştirmek gerekebilir; uygulama güncellemeleri de migration, kod güncellemesi ve altyapı değişikliklerinin orkestrasyonuna dönüşür
- Production’a hazır olmak için yeterli telemetri gerekir; ancak her aracın veri toplama yöntemi farklı olduğundan bunları tek bir izleme dashboard’unda birleştirmek de ayrı bir mühendislik problemi haline gelir
- Günümüzde baskın geliştirme biçimi, mimarinin her parçası için en uygun aracı seçip ekleyen à la carte modele yakındır
- Bağımsız tasarlanmış araçları birlikte çalışır hale getirmek başlı başına büyük bir iştir; sabit veri modelleri ve sınırlı şemalar nedeniyle araçları uygulamaya uydurmak yerine uygulama araçlara uydurulur
- Backend kurulumu için tutarlı bir model olmadığı için à la carte model yerleşmiştir; tutarlı bir modelde soyutlama, otomasyon ve yeniden kullanım imkânı artar
Backend’e basit bir modelle bakmak
- Backend’in ana işlevleri yeni veriyi almak ve bu veri hakkındaki soruları yanıtlamaktır
- En genel sorgu, backend’in aldığı tüm veriler üzerinde bir fonksiyon çalıştırma biçiminde ifade edilebilir
query = function(all data)
- Gerçekte veri kümesi 10PB olabilir ve sorgu yanıtının milisaniyeler içinde gelmesi gerekebilir; bu nedenle pratik sistemlerde indeks gerekir
- İndeks eklenmiş model şöyle ifade edilir
indexes = function(data)query = function(indexes)
- Mevcut backend’ler bu modelin bileşenlerini çok sayıda dar kapsamlı araca bölerek uygular
- RDBMS backend’leri veri ve indeksler için RDBMS kullanır; ek indeksleme için ElasticSearch gibi ayrı bir veritabanı da kullanılabilir
- Hesaplama çoğu zaman API server handler’larında veya queue/worker tabanlı arka plan işlerinde yapılır
- Büyük ölçekli backend’ler Cassandra, MongoDB, Neo4j, Kafka, Hadoop, Storm, Kafka Streams gibi araçları birleştirebilir
- Tüm bileşenleri bütünleşik ve genel amaçlı biçimde uygulayan bir araç varsa, yukarıdaki karmaşıklıktan kaçınılabileceği sonucuna varılıyor
Rama’nın bileşenleri ve Mastodon örneği
- Rama, bu ilkeler temel alınarak tasarlanmış bir backend geliştirme platformudur
- Red Planet Labs, Rama’yı 15 Ağustos’ta “the 100x development platform” sloganıyla duyurdu
- Maliyet azaltma örneği olarak Mastodon’u Twitter ölçeğinde yeniden uygulama çalışmasını gösteriyor
- 100 milyon bot saniyede 3.500 gönderi paylaşıyor
- Ortalama fanout 403
- Twitter’ın eşdeğer tüketici ürününün 1 milyon satır ve yaklaşık 200 kişi-yıl gerektirdiği karşılaştırması yapılıyor
- Rama uygulaması 10 bin satır ve 9 kişi-ay gerektirdi
- Uygulama open-source ve complete, high-performance, production-ready olarak sunuluyor
- Twitter’ın ölçeğe ulaşmak için social graph database, in-memory timeline database gibi özel veritabanlarını kendi geliştirdiği; yalnızca Puppet konfigürasyonunun 1 milyon satırdan fazla olduğu karmaşık bir dağıtıma sahip olduğu karşılaştırılıyor
- Rama tabanlı uygulamanın, her alt problem için özel altyapıyı baştan geliştirmek yerine Rama’nın ilkel öğelerini birleştirerek benzer performans ve ölçeklenebilirlik sorunlarını çözdüğü söyleniyor
- Mastodon uygulamasının performance numbers değerlerinin Twitter rakamlarıyla aynı ya da daha iyi olduğu belirtiliyor
Rama’nın programlama modeli
- Rama’nın kavramları, yukarıda sunulan backend modeline doğrudan karşılık gelir
- Depots: Keyfi verileri tutan dağıtık log’lardır ve
dataya karşılık gelir - PStates: partitioned state kısaltmasıdır ve indekslere karşılık gelir
- ETLs:
function(data)ya karşılık gelir - Queries:
function(indexes)a karşılık gelir
- Depots: Keyfi verileri tutan dağıtık log’lardır ve
- PStates, dayanıklı veri yapılarının keyfi kombinasyonları olarak ihtiyaç kadar oluşturulabilir
- ETL ve query, Turing-complete dataflow API ile ifade edilir; hesaplama dağıtık olarak çalıştırılabilir
- Rama, belgelerinde Java API eğitimleri sunar; ayrıca Clojure API de vardır
Rama’nın veritabanı karmaşıklığını azaltma biçimi
- Rama’nın PStates’i veritabanına benzer bir rol oynar, ancak yalnızca ilgili PState’in sahibi olan ETL topology tarafından yazılabilir
- Tüm yazmalar aynı ETL kodunda bulunduğu için state hakkında akıl yürütmek kolaylaşır
- PStates, event sourcing log’u üzerinde materialized view olarak çalışır
- Depot data doğruluk kaynağı olduğu için PState yeniden hesaplanabilir
- Veri modeli kısıtları, PStates’in veri yapısı olarak tanımlanmasıyla ele alınır
- Mastodon uygulaması yalnızca profiles, statuses, timelines için bile 33 PStates kullanır
- Bazı PState’ler 10 kullanım senaryosunu, bazıları ise yalnızca tek bir kullanım senaryosunu destekler
- PStates durable, partitioned, incrementally replicated özelliklerine sahiptir
- incremental replication, leader partition arızasında takeover yapacak başka bir partition’ın hazır olduğu anlamına gelir
- Mevcut leader’da görünenlerin daha sonra leader olacak partition’da da görülebileceği garanti edilir
- Normalizasyon ve denormalizasyon sorunu depots ile PStates’in açık biçimde ayrılmasıyla ele alınır
- Sınırlı şema sorunu, domain temsilinin aynen kullanılmasıyla hafifletilir
- hash map, list gibi genel veri yapıları
- Protocol Buffers
- İç içe nesne tanımları
- Rama’nın bilmediği tipler custom serializer kaydıyla işlenir
Dağıtım, entegrasyon ve izleme
- Rama uygulamaları modules olarak adlandırılır; bir module birden fazla depots, ETLs, PStates ve query topologies içerebilir
- Rama, module dağıtımı, güncellemesi ve ölçeklendirmesi için yerleşik mekanizmalar sağlar; her birinin terminalde one-liner ile yapıldığı söyleniyor
- Rama “all or nothing” bir araç değil; diğer sistemlerle entegrasyonu kolay olacak şekilde tasarlandığından mevcut mimarilere kademeli olarak eklenebilir
- Entegre bir platform olduğu için kendi izlemesini de yapar
- İzleme verilerinin toplanması
- İşlenmesi
- İndekslenmesi
- Görselleştirilmesi
- cluster UI telemetry, module performansını anlamak, sorunları tespit ve teşhis etmek, ne zaman ölçekleneceğine karar vermek için kullanılır
Öğrenme ve benimseme yolu
- Rama’yı daha fazla öğrenmek için şu kaynaklar sunuluyor
- Production’da yeni özellikler geliştirmek, mevcut sistemleri genişletmek veya altyapıyı sadeleştirmek için Rama kullanmak isteyenler private beta’ya başvurabilir
- Private beta kullanıcılarına Rama’yı öğrenmenin yanı sıra kod yazma, optimizasyon ve test konularında da destek verildiği söyleniyor
1 yorum
Hacker News yorumları
“Daha sonra açıklayacağım ama daha iyi yaklaşım event sourcing ve materialized view” denmiş; yani sonuçta çözüm karmaşıklığı artırmak mı? Elbette öyledir
Bizim yaptığımız Twitter ölçeğinde Mastodon implementasyonu bunun doğrudan bir örneği. Twitter’ın aynı özellikleri ölçekli biçimde yapmak için yazması gereken koddan kelimenin tam anlamıyla 100 kat daha az, resmi Mastodon implementasyonundan da %40’tan fazla daha az kod. Aynı araçlarla ikinci kez yaptığımız için daha iyi tasarlamış değiliz; temelde daha iyi bir soyutlamayla yaptığımız için böyle
Ancak belirli bir ölçeği geçince her şey bir veri mühendisliği problemine dönüşür ve tüm sistem bağlamında bu yöntem görece basit bir çözüm hâline gelebilir. “Sadece mySQL/SQLite/Postgres kullanın” tavsiyesi, geçerliliğini yitirdiği ana kadar harikadır
Martin Fowler’ın orijinal event sourcing yazısı hiç yazılmamış olsaydı herkes için daha iyi olurdu diye içtenlikle inanıyorum. Vakaların %99’unda bunun kötü bir fikir olduğunu düşünüyorum
Bir şeyi kaçırmış olabilirim ama yazı eşzamanlılık, izolasyon, kısıtlar gibi kavramları tamamen atlamış görünüyor. Ayrıca “sorgu topolojisi” denen şey deklaratif de değil ve sorgu planlama/optimizasyon sorumluluğunu yazara yüklüyor gibi; gerçekten bunun daha iyi bir geliştirici deneyimi olduğunu mu düşünüyorlar?
Ve evet, Rama’nın sorgu biçimi çok daha üstün bir yaklaşım. Karmaşık bir sorgu planlayıcıya ihtiyaç duyulması çoğunlukla verinin indekslenme biçimindeki sınırlamalardan, özellikle de normalizasyon ile denormalizasyon arasındaki gerilimden kaynaklanır. Rama’da, sorguların ihtiyaç duyduğu biçimde zaten hazırlanmış birden fazla view’ı sağlam biçimde materialize etmek kolaydır.
Rama kavramlarını yumuşak bir girişle tanıtan eğitim burada: https://redplanetlabs.com/docs/~/tutorial1.html
“Tek bir veri modelinin tüm kullanım senaryolarını destekleyemeyeceği” sözüne gelince, teorik olarak nesnelerin tuple’ları ve ilişkileriyle doğru biçimde modellenemeyecek bir alan ya da sonlu alan kümesi yoktur.
Pratikte belirli bir veritabanının/şemanın kapsamı genellikle tek bir iş ya da problem alanıyla sınırlıdır; ancak türler uygunsuz biçimde çakışmadığı sürece bu da pek sorun olmaz. Yalnızca adlara dikkat ederseniz bir web perakendecisini ve bir sigorta şirketini aynı şemaya koysanız bile gayet çalışır.
Her şeyi tam olarak tek bir veritabanına koymak süper güçtür. Bunu güçlü biçimde savunmamın en büyük nedeni, birden fazla veri deposuna yayılan dağıtık işlemlerden kaçınmaktır. Tüm iş tek bir işlem sistemi içinde gerçekleştiğinde semantik dramatik biçimde basitleşir.
İnsanlar veriyi gerçekten kullanmaya başladığında, 1 milyon dolarlık büyük bir DB sunucusu, ucuz veritabanlarından oluşan yedekli bir diziden çok daha ucuzdur. Geliştirici, analist ya da yönetici fark etmez; herkes zamandan tasarruf eder, belki bazı DBA’ler bunun istisnası olabilir.
Teorik olarak her şey bundan ibaret olsa bile, bir başka kalıcı sorun uygulamadır. Günümüzde çoğu geliştirici veritabanlarının nasıl çalıştığını ve nasıl kullanılması gerektiğini iyi anlamadığı için onları berbat kullanıyor. Bu yüzden bu gerçekten kaçmak için NoSQL gibi yeni veritabanları yaptılar; daha az kafa yorup daha çok yapıştırıcı kod yazmaya çalıştılar. Bunun da korkunç sonuçlar verdiği ortaya çıktı.
Çok geçmeden akış yeniden değişecek ve “yalnızca büyük tek bir veritabanı” yeniden moda olmaktan çıkacak; başka bir “basitlik” paradigması ortaya çıkacak. Mikroservislerde olduğu gibi, “tek büyük veritabanı” yerine “çok sayıda küçük veritabanı” basit kabul edilebilir. Tarihi anlamazsanız onu tekrarlamak zorunda kalırsınız.
Genel programlamada da tek bir veri yapısının ya da veri yapısı kombinasyonunun tüm kullanım senaryolarını destekleyememesiyle aynı şey. Bazen map gerekir, bazen liste, küme, kombinasyon ya da tamamen başka bir şey gerekir.
Elbette veri yapıları çeşitlidir, performans da gerekir; ayrıca sıradan insanların dokunamayacağı kadar kritik bir darboğaz haline gelir ve tüm değişikliklerin aşırı güvenli olması gerekir. Güvenlik de var. Birisi geliştirme hataları bölümünden HR ya da yöneticilere özel finans bölümüne geçmenin yolunu bulursa ne olur? Genel amaçlı bir ERM sistemi uygulamış olan herkes, birleşik bir sistemin ne kadar zor ve acılı olduğunu bilir.
Ancak bu uç bir örnek. Bu ideale ulaşmaya çalışırken insanların nereye kadar gittiğini ve bunu nasıl yaptığını merak ediyorum. Tek bir sistemle işletilen bir iş hiç görmedim. Kişisel bilgi yönetim sistemleri nasıl? Her şey yerine oturuyor mu? Hızlı işler için hâlâ elektronik tablo, serbest biçimli şeyler için metin dosyası kullanmıyor muyuz?
Moda terimler toplamı gibi görünüyor. Dünyanın en büyük şirketlerinden birinde yıllardır veritabanlarıyla çalışıyorum ama topoloji kelimesini hiç duymadım.
Bununla zaman tasarrufu sağlansa bile Java’yı ve bu framework’ü öğrenirken uçup gidecektir. Veritabanlarının kendisinde hiçbir sorun yok.
Burada metin tablosu yapmaya çalıştım ama sayfa gösterimi tamamen bozulduğu için ekran görüntüsü olarak yükledim: https://imgur.com/a/XtwSkyx
Rama’yı beş yaşındaki bir çocuğa anlatır gibi açıklasanız, nedir? Dokümantasyon da kafa karıştırıcıydı: https://redplanetlabs.com/docs/~/index.html
“Paradigma değişimi” veya “platform” gibi moda sözcükleri çıkarırsanız iyi olur. Diyagram gerekiyorsa, daha net açıklayan bir yazı okumak isterim
Rama bir küme olarak çalışır ve birden fazla uygulama bu kümeye “modül” biçiminde dağıtılır. Derin ve ayrıntılı telemetri de yerleşik olarak gelir.
Rama’nın programlama modeli event sourcing ve materialized view’lardan oluşur. Bir Rama uygulaması oluştururken, ihtiyaç duyduğunuz kadar çok indeksi, istediğiniz biçimde, birden fazla kalıcı veri yapısı kombinasyonu olarak materialize edersiniz. İndeksler dağıtık veri akışı API’siyle materialize edilir.
Rama mevcut şeylerden o kadar farklı ki, benim yapabileceğim üst düzey açıklama ancak bu kadar. Temelleri öğrenmek için en iyi kaynak rama-demo-gallery; içinde Rama’nın çeşitli kullanım senaryolarına uygulanmasını gösteren, kısa, baştan sona çalışan ve ayrıntılı yorumlanmış örnekler var. Hepsi ölçeklenebilir ve hata toleranslı: https://github.com/redplanetlabs/rama-demo-gallery
“Depot” adlı yalnızca ekleme yapılan bir event log’u var; bunun üzerinde keyfi view’lar oluşturuyorsunuz ve bunlara “P-States” deniyor. Rama yazılımı bu view’ların düşük gecikmeyle güncellenmesini vaat ediyor. Bunun üzerine kurulan uygulamalar view’ları sorguluyor ve Depot’a yeni event/komut gönderiyor.
1–10 TB ölçeğinde canlı event veri kümeleri üzerinde esnek bir materialized view motoru oluşturmak için bir yıllık bir proje yaptım; başka bir projeye geçmeden önce bizim mimarimiz de kabaca kodu indeksin bulunduğu yere gönderme fikrine yakınsamıştı.
Rama bana epey cazip geliyor, ama tamamen irrasyonel bir nedenle JVM yüzünden benimsemeyecek gibiyim. Java/JVM’den hoşlanmıyorum, o kadar. Bu mimarinin başka ortamlara port edilmesini isterdim.
İş yerinde okuma modeliyle yazma modelini ayırıyoruz. Yazma modeli, yani hakikatin kaynağı, invariant’ları/kısıtları da olan geleneksel ilişkisel domain modeli ve ORM’e alışkın çoğu geliştirici için üzerinde akıl yürütmenin zor olmadığını düşünüyorum.
Neredeyse tüm komutlar ayrıca event üretip ortak domain event kuyruğuna yayımlıyor. Okuma modelleri, event’leri tüketen worker’ların her birinin kendi ihtiyaç duyduğu şekilde view oluşturmasıyla ortaya çıkıyor ve yeniden oluşturulabiliyor. Örneğin kullanıcı yönetimi servisi hakikatin kaynağı; diğer servisler ise karmaşık bir UI göstermek için kullanıcı servisi ve diğer servislerden gelen event’lere dayanarak kendi okuma modellerini/indekslerini oluşturan view servisleri. Bu olmasaydı devasa join’ler ya da servisler arası yavaş API çağrıları gerekirdi.
Teknik olarak event’leri yeniden oynatmak mümkün. Hatta platform kodundaki bir hata yüzünden son 3 yılın tüm event’lerini yeniden oynattığımız da oldu. Ama buna gerçekten ihtiyaç duyduğumuz neredeyse hiç olmadı diye düşünüyorum. Hatalar yüzünden view’ları yeniden oluşturmamız gerektiği oluyor, ama bunu genelde özel script’ler veya SQL migration’ları gibi geçici programlarla hallediyoruz. Mimarimizin adının tam olarak ne olduğunu bilmiyorum ve kimsenin buna “event sourcing” dediğini duymadım.
Sonuçta eski usul MySQL + RabbitMQ ve biraz glue code. Yine de doğru yapmak için transaction outbox, en az bir kez teslim garantisi, eventual consistency, doğru event işleme sırasını koruma, event verilerini toplu işleme, DB yönetimi, event handler öldüğünde ne yapılacağı gibi konular yüzünden çok da basit değil. Zaten pratikte kendini kanıtlamış, dilden bağımsız bir düzenek ve hem PHP hem Go producer/consumer’larımız varken, Rama olmadan neyi kaçırdığımızı ve Rama’nın yukarıdaki listedeki sorunları nasıl çözdüğünü merak ediyorum. Rama daha çok Java tarafına göre ayarlanmış gibi görünüyor.
Rama’nın indeksleri çok daha esnek. Örneğin 100 milyon elemanlı iç içe bir kümeye ihtiyacınız olsa bile bu basit. Kullanıcı ID’si → takipçi ID’leri kümesi gibi sosyal grafik indeksleri yaygın bir örnek. Parçacıklılığa göre bölünmüş zaman serisi indeksleri, yani entity → parçacıklılık → zaman bucket’ı → istatistik de aynı şekilde kolay.
Rama’da saklanabilen veri tiplerinde sınırlama yok. Rama sorguları çok güçlüdür; indekslerin bir kısmı veya tamamı üzerinde gerçek zamanlı, isteğe bağlı dağıtık sorgular yapmak kolaydır. Uygulama genelinde derin ve ayrıntılı telemetri de yerleşiktir; ayrıca oluşturmanız veya yönetmeniz gerekmez.
Dağıtım da yerleşik. Mevcut yönteminizde uygulama güncellemeleri worker kodu, şema migration’ı gibi birden fazla sisteme yayılabilir ve özellikle kesintisizlik istiyorsanız oldukça zor bir mühendislik işine dönüşebilir. Rama hesaplama ve depolamayı uçtan uca entegre ettiği için uygulama yayınlamak, güncellemek ve ölçeklemek tek satırlık bir terminal komutuyla yapılabilir.
Rama çok daha ölçeklenebilir. Bu, özellik perspektifinden Rama; Rama ile kod yazarken impedance mismatch olmamasının ne kadar büyük fark yarattığını ise kelimelerle anlatmak zor, kullanıp görmek gerekir. Rama JVM içindir, dolayısıyla herhangi bir JVM diliyle kullanılabilir ve şu anda Java ile Clojure API’leri sunar.
Event’ler nerede ve hangi formatta saklanıyor? Daha ayrıntılı duymak isterim.
Şu an eksik olan şey, tüm ekosisteme takılacak havalı bir isim gibi görünüyor.
Değişiklik anında veriyi somutlaştırmak, ürünün tek bir işi çok hızlı yapması gerektiğinde avantaj sağlayabilir. Ancak atomik yazmalarla birlikte güncellenmesi gereken karmaşık işlemler ortaya çıktığında ya da veriyi farklı bir şekilde düzenlemeyi gerektiren yeni bir özellik eklemek istediğiniz anda işler zorlaşır.
Uygulama geliştirme kısmında “sadece bir indeks eklemek yeter” der gibi bunun hafife alınması da son derece tatmin edici değil. İndeks küresel durumdur; yalnızca bir katman aşağı taşınmıştır
Bu belgeyi okuduğumda hedef kitlenin kim olduğu ve neyi çözmeye çalıştığı net değil: https://redplanetlabs.com/docs/~/why-use-rama.html#gsc.tab=0
Gerçek bir örnek alıp, RAMA ile bunun ne kadar kolay ve verimli olduğunu dönüştürerek göstermek faydalı olurdu
İlki Twitter ölçeğinde Mastodon uygulaması; aynı şeyi ölçekli şekilde yapmak için Twitter’ın yazdığı koddan 100 kat daha az kod içeriyor. Bu yalnızca tüketici ürünü kısmı için geçerli. Ölçeklenebilir olmayan resmi Mastodon uygulamasından bile %40’tan fazla daha az kod içeriyor: https://github.com/redplanetlabs/twitter-scale-mastodon
rama-demo-gallery deposunda da Rama’nın çok farklı kullanım senaryolarına uygulandığı kısa, bağımsız ve ayrıntılı yorum satırlarıyla açıklanmış birçok örnek var. Kullanıcı profili yönetimi, zaman serisi analizi, atomik ve hataya dayanıklı banka havaleleri gibi örnekler içeriyor: https://github.com/redplanetlabs/rama-demo-gallery
Gerçekten günlük 40 milyon kullanıcılı bir web sitesi işletmiyorsanız, “Twitter ölçeğinde Mastodon istemcisi” ile bunun kanıtlandığını iddia edebilecek gibi görünmüyorsunuz. Gerçek ortamı, buna bağlı kod ve altyapı değişikliklerini, gerçek kullanıcıları, ağ kullanımını vb. simüle etmek imkânsız