2017 yılında Alfa-Bank'ın yatırım işinin işlemsel çekirdeğini geliştirmek için bir yarışmayı kazandık ve çalışmaya başladık (HighLoad++ 2018'de yatırım işinin özü hakkında bir raporla)
Geliştirme süreci sırasında sistem gelişti ve işlevsellik kazandı ve bir noktada, kesin olarak tanımlanmış bir dizi görevi çözmek için oluşturulmuş uygulama yazılımından çok daha fazlasını kristalize ettiğimizi fark ettik: başardık Kalıcı depolamaya sahip dağıtılmış uygulamalar oluşturmaya yönelik sistem. Kazandığımız deneyim yeni bir ürünün temelini oluşturdu -
TDG mimarisinden ve geliştirme sürecinde ulaştığımız çözümlerden bahsetmek, size ana işlevleri tanıtmak ve ürünümüzün nasıl eksiksiz çözümler oluşturmanın temeli olabileceğini göstermek istiyorum.
Mimari olarak sistemi ayrı bölümlere ayırdık. ролиHer biri belirli bir dizi sorunu çözmekten sorumludur. Çalışan tek bir uygulama örneği, bir veya daha fazla rol türünü uygular. Bir kümede aynı türde birden fazla rol olabilir:
Bağlayıcı
Bağlayıcı dış dünyayla iletişimden sorumludur; Görevi, isteği kabul etmek, ayrıştırmak ve bu başarılı olursa verileri işlenmek üzere giriş işlemcisine göndermektir. HTTP, SOAP, Kafka, FIX formatlarını destekliyoruz. Mimari, yeni biçimler için kolayca destek eklemenizi sağlar; IBM MQ desteği de yakında sunulacaktır. İsteğin ayrıştırılması başarısız olursa bağlayıcı bir hata döndürür; aksi takdirde, daha sonraki işlemler sırasında bir hata meydana gelse bile, isteğin başarıyla işlendiği yanıtını verecektir. Bu, özellikle isteklerin nasıl tekrarlanacağını bilmeyen veya tam tersine bunu çok ısrarla yapan sistemlerle çalışmak için yapıldı. Verileri kaybetmemek için bir onarım kuyruğu kullanılır: nesne önce ona girer ve ancak başarılı bir işlemden sonra ondan kaldırılır. Yönetici, onarım kuyruğunda kalan nesneler hakkında uyarı alabilir ve bir yazılım hatasını veya donanım arızasını giderdikten sonra yeniden deneyebilir.
Giriş işlemcisi
Giriş işlemcisi, alınan verileri karakteristik özelliklerine göre sınıflandırır ve uygun işlemcileri çağırır. İşleyiciler, korumalı alanda çalışan Lua kodudur, dolayısıyla sistemin işleyişini etkileyemezler. Bu aşamada veriler istenilen forma indirgenebilir ve gerekirse gerekli mantığı uygulayabilecek isteğe bağlı sayıda görev başlatılabilir. Örneğin Tarantool Data Grid üzerine kurulu MDM (Master Data Management) ürününde, yeni bir kullanıcı eklerken, isteğin işlenmesini yavaşlatmamak adına, altın kayıt oluşturulmasını ayrı bir görev olarak başlatıyoruz. Korumalı alan, veri okuma, değiştirme ve ekleme isteklerini destekler, depolama türünün tüm rolleri üzerinde bazı işlevler gerçekleştirmenize ve sonucun toplanmasına (haritalama/azaltma) olanak tanır.
İşleyiciler dosyalarda açıklanabilir:
sum.lua
local x, y = unpack(...)
return x + y
Ve sonra konfigürasyonda bildirildi:
functions:
sum: { __file: sum.lua }
Neden Lua? Lua çok basit bir dildir. Deneyimlerimize göre insanlar bunu öğrendikten birkaç saat sonra sorunlarını çözen kod yazmaya başlıyorlar. Ve bunlar sadece profesyonel geliştiriciler değil, örneğin analistler. Ayrıca jit derleyicisi sayesinde Lua çok hızlı çalışıyor.
Depolama
Depolama kalıcı verileri saklar. Kaydetmeden önce veriler, veri şemasına göre doğrulanır. Devreyi tanımlamak için genişletilmiş bir format kullanıyoruz
{
"name": "User",
"type": "record",
"logicalType": "Aggregate",
"fields": [
{ "name": "id", "type": "string"},
{"name": "first_name", "type": "string"},
{"name": "last_name", "type": "string"}
],
"indexes": ["id"]
}
Bu açıklamaya dayanarak Tarantula DBMS için otomatik olarak DDL (Veri Tanımlama Dili) oluşturulur ve
Eşzamansız veri çoğaltma desteklenir (eşzamanlı olanı ekleme planları vardır).
Çıkış işlemcisi
Bazen harici tüketicileri yeni verilerin gelişiyle ilgili bilgilendirmek gerekebilir; bunun için Çıkış işlemcisi rolü vardır. Veriler kaydedildikten sonra uygun işleyiciye aktarılabilir (örneğin, tüketicinin istediği forma getirmek için) ve ardından gönderilmek üzere bağlayıcıya aktarılabilir. Burada da bir onarım kuyruğu kullanılır: nesneyi kimse kabul etmezse yönetici daha sonra tekrar deneyebilir.
Ölçeklendirme
Bağlayıcı, giriş işlemcisi ve çıkış işlemcisi rolleri durum bilgisizdir; bu, istenen rol türü etkinken yeni uygulama örnekleri ekleyerek sistemi yatay olarak ölçeklendirmemize olanak tanır. Depolama yatay ölçeklendirme için kullanılır
Veri Özellikleri
Nesneler çok büyük olabilir ve başka nesneler içerebilir. Bir nesneyi tüm bağımlılıklarıyla birlikte tek bir sanal grupta depolayarak veri ekleme ve güncelleme konusunda atomiklik sağlıyoruz. Bu, nesnenin birden fazla fiziksel sunucuya "yayılmasını" önler.
Sürüm oluşturma desteklenir: Bir nesnenin her güncellemesi yeni bir sürüm oluşturur ve her zaman bir zaman dilimini alıp dünyanın o zaman nasıl göründüğünü görebiliriz. Uzun bir geçmişe ihtiyaç duymayan veriler için sürüm sayısını sınırlayabilir ve hatta yalnızca birini (en son sürümü) saklayabiliriz, yani belirli bir tür için sürüm oluşturmayı esasen devre dışı bırakabiliriz. Geçmişi zamana göre de sınırlayabilirsiniz: örneğin, belirli bir türdeki 1 yıldan daha eski tüm nesneleri silin. Arşivleme de desteklenmektedir: Belirtilen süreden daha eski olan nesneleri kaldırarak kümede yer açabiliriz.
görevler
İlginç özellikler arasında, görevleri bir programa göre, kullanıcının isteği üzerine veya programlı olarak sanal alandan başlatma becerisine dikkat etmek önemlidir:
Burada başka bir rol görüyoruz - koşucu. Bu rol durum bilgisizdir ve gerektiğinde bu role sahip ek uygulama örnekleri kümeye eklenebilir. Koşucunun sorumluluğu görevleri tamamlamaktır. Belirtildiği gibi sanal alandan yeni görevler oluşturmak mümkündür; depolama alanında bir kuyruğa kaydedilirler ve ardından koşucuda yürütülürler. Bu tür göreve İş denir. Ayrıca Görev adı verilen bir görev türümüz de var; bunlar, bir zamanlamaya göre (cron sözdizimini kullanarak) veya isteğe bağlı olarak çalışan, kullanıcı tanımlı görevlerdir. Bu tür görevleri başlatmak ve takip etmek için kullanışlı bir görev yöneticimiz var. Bu işlevselliğin kullanılabilmesi için zamanlayıcı rolünü etkinleştirmeniz gerekir; bu rolün bir durumu vardır, dolayısıyla ölçeklenmez, ancak bu gerekli değildir; aynı zamanda diğer tüm roller gibi, ustanın aniden reddetmesi durumunda çalışmaya başlayan bir kopyaya da sahip olabilir.
Logger
Başka bir role logger denir. Kümenin tüm üyelerinden günlükleri toplar ve bunların web arayüzü aracılığıyla yüklenmesi ve görüntülenmesi için bir arayüz sağlar.
Hizmetler
Sistemin hizmet oluşturmayı kolaylaştırdığını belirtmekte fayda var. Yapılandırma dosyasında, sanal alanda çalışan, kullanıcı tarafından yazılan bir işleyiciye hangi isteklerin gönderileceğini belirtebilirsiniz. Bu işleyicide örneğin bir tür analitik sorgu çalıştırabilir ve sonucu döndürebilirsiniz.
Hizmet yapılandırma dosyasında açıklanmıştır:
services:
sum:
doc: "adds two numbers"
function: sum
return_type: int
args:
x: int
y: int
GraphQL API otomatik olarak oluşturulur ve hizmet çağrılmaya hazır hale gelir:
query {
sum(x: 1, y: 2)
}
Bu işleyiciyi arayacak sum
sonucu döndürecek olan:
3
Sorgu Profili Oluşturma ve Metrikler
Sistemin işleyişini ve profil oluşturma isteklerini anlamak için OpenTracing protokolü desteğini uyguladık. Sistem, isteğin nasıl yürütüldüğünü anlamanıza olanak tanıyan Zipkin gibi bu protokolü destekleyen araçlara talep üzerine bilgi gönderebilir:
Doğal olarak sistem, Prometheus kullanılarak toplanabilecek ve Grafana kullanılarak görselleştirilebilecek dahili ölçümler sağlıyor.
Dağıtmak
Tarantool Data Grid, dağıtımdan veya Ansible'dan bir yardımcı program kullanılarak RPM paketlerinden veya bir arşivden dağıtılabilir; ayrıca Kubernetes desteği de vardır (
İş mantığını uygulayan uygulama (konfigürasyon, işleyiciler), konuşlandırılan Tarantool Data Grid kümesine, kullanıcı arayüzü aracılığıyla bir arşiv biçiminde veya tarafımızdan sağlanan API aracılığıyla bir komut dosyası kullanılarak yüklenir.
Felsefenin ilkleri
Tarantool Data Grid kullanılarak hangi uygulamalar oluşturulabilir? Aslında çoğu iş görevi bir şekilde veri akışının işlenmesi, saklanması ve erişilmesiyle ilgilidir. Bu nedenle, güvenli bir şekilde depolanması ve erişilmesi gereken büyük veri akışlarınız varsa, ürünümüz size geliştirme süresinden büyük ölçüde tasarruf sağlayabilir ve iş mantığınıza odaklanabilir.
Örneğin, gelecekte en iyi teklifler hakkında bilgi sahibi olabilmek için emlak piyasası hakkında bilgi toplamak istiyoruz. Bu durumda aşağıdaki görevleri vurgulayacağız:
- Açık kaynaklardan bilgi toplayan robotlar veri kaynaklarımız olacak. Bu sorunu hazır çözümler kullanarak veya herhangi bir dilde kod yazarak çözebilirsiniz.
- Daha sonra Tarantool Data Grid verileri kabul edecek ve kaydedecektir. Farklı kaynaklardan gelen veri formatı farklıysa Lua'da tek bir formata dönüşümü gerçekleştirecek kodu yazabilirsiniz. Ön işleme aşamasında, örneğin mükerrer teklifleri filtreleyebilecek veya ek olarak piyasada çalışan acenteler hakkındaki bilgileri veritabanında güncelleyebileceksiniz.
- Artık bir kümede verilerle doldurulabilen ve veri seçimleri yapılabilen ölçeklenebilir bir çözümünüz zaten var. Daha sonra yeni işlevler uygulayabilirsiniz, örneğin veri talebinde bulunacak ve günde en avantajlı teklifi verecek bir hizmet yazabilirsiniz - bunun için yapılandırma dosyasında birkaç satır ve küçük bir Lua kodu gerekir.
Sırada ne var?
Önceliğimiz, kullanarak geliştirme kolaylığını artırmaktır.
Ayrıca güvenlik konularına da büyük önem veriyoruz. Şu anda, yüksek güvenlik düzeyini doğrulamak ve kişisel veri bilgi sistemleri ve devlet bilgi sistemlerinde kullanılan yazılım ürünlerinin sertifikasyon gereksinimlerini karşılamak için Rusya'nın FSTEC'inden sertifikasyon sürecinden geçiyoruz.
Kaynak: habr.com