Haberler için yeni bir mimari: Janus – Bölüm 1

bencede

New member


  1. Heise online için yeni bir mimari: Janus – Bölüm 1

Haberler online’ın web geliştirme departmanı, mimarisini olay tabanlı bir sisteme dönüştürdü ve sunuyor.


Meslektaşlarım Philipp Busse ve Benjamin Deutsch, çevrimiçi ortamda 25 yıllık bir katkı olarak, diğer şeylerin yanı sıra, Janus adlı yeni mimarimiz hakkında bir fikir verdiler. Bugün size bunları ayrıntılı olarak sunuyoruz.

Haberler online uzun süredir klasik bir web sitesi gibi çalışıyor: Bir kullanıcı bir URL’yi çağırıyor, önbellek hizmeti varsa doğrudan teslim ediyor veya başka bir şekilde web sunucusundan talep ediyor. Web sunucusu, isteği, istenen verileri bir araya getiren arka uç koduna iletir. Daha sonra zincirin yukarısına kullanıcıya giderler. Bu zincir şimdi (yakında) tamamen farklı çalışıyor.

CMS, editoryal içerik için başlangıç noktası olmaya devam edecek, ancak daha önce CMS ile önbellek sunucusu arasında duran hemen hemen her şey değiştirilecek. Mimariye ek olarak bir de dil değişikliği yapıyoruz. Perl artık mutlaka “Bloktaki Yeni Çocuk” olmadığından (bu karşılaştırmaya benzer şekilde), geçen yıl dilin halefi üzerinde çok çalışıyoruz. Büyük gruplarda birçok tartışma yapıldı, birkaç dilde küçük test projeleri yazıldı ve avantaj ve dezavantajlar tartıldı. Son olarak, TypeScript ve NestJS çerçevesi ile JavaScript’i (Node.js) seçtik.

Olaylar! Her yerde etkinlikler


Yeni mimarinin merkezi bir bileşeni, bir NATS akış sunucusudur. Sistemimizde bir şey olursa, bir olay tetiklenir. Süreçler belirli olaylara abone olur, ardından bir şeyler yapar ve muhtemelen olayları kendileri tetikler.

Daha somut olmak gerekirse: Bir gönderiyi CMS’ye kaydetmek, bir olayı tetikler ve ardından bir çalışan, istenen verileri bir MongoDB’ye yazar. Daha sonra tüm katkı verileri veritabanında bulunur ve GraphQL’yi kullanarak istenen verileri gerektiği gibi bir istek ile sorgulamak için kullanabiliriz. Örneğin, makalenin durumu da “devam ediyor”dan “yayınlandı”ya değiştiyse, şimdi yayın için başka bir olay tetiklenir. Haberler-online ana sayfasının ve RSS akışının derlenmesinden sorumlu iki çalışan bu etkinliğe kaydoldu ve şimdi aktif hale geliyor. Başka bir çalışan, yeni forum gönderileri için bir etkinliğe tepki verir ve makalelerde görüntülenen gönderi sayısını ayarlar.


Doğal olarak onlarca çalışan daha üye oldukları etkinlik aktif olur olmaz bu sistemde aktif olabiliyor. Çalışan, bir kapsayıcıda çalışan bir hizmettir ve bu nedenle, belirli bir olay yeniden kullanılırsa gerektiği gibi kolayca ölçeklendirilebilir.

Böylece mimarimizi çekme sisteminden itme sistemine değiştirdik. Oynatma katmanları artık düzenli olarak içeriğin değişip değişmediğini sormuyor, bunun yerine değişen katmanlar değişikliklerin yapıldığının sinyalini veriyor.

“Soğanların katmanları vardır”


Sistemin tüm mimarisi, mümkün olduğunca birbirinden bağımsız halkalar (soğan mimarisi) içinde inşa edilmiştir: bir dış halkanın yalnızca içeride bağımlılıkları vardır, asla tersi olmaz. Bu ayırma ayrıca, bireysel alanların kolayca değiştirilebilmesi gibi bir yan etkiye de sahiptir. Örneğin, yukarıda belirtilen MongoDB, veri kalıcılığından sorumlu olan bir halkada çalıştırılır. Diğer tüm alanlar yalnızca bu katmanla konuşur, ancak artık doğrudan MongoDB ile konuşmaz, bu nedenle (uzman) MongoDB bilgisine ihtiyacınız yoktur ve bunun yerine farklı bir veritabanı kullanmak isteseydik daha sonra düzinelerce ince ayar yapılmaz.

Mono


Kod havuzlarımızın yapısı da Janus ile değişti: bir monorepoya geçtik. Bizim için temel sebep, farklı depolarla yaşanan kötü deneyimlerdi. Harici olarak, Haberler online bir web sitesidir, ancak dahili olarak kendi depolarındaki çeşitli projelerden oluşur. Bu projeler burada burada örtüşüyor ve iç içe geçiyor. Bu genellikle bir sorun değildir, ancak zaman zaman farklı dallardaki üç projenin belirli uygulamaların geliştirilmesi için test edilmesi gerekmiştir. Fırlatmanın da bir o kadar karmaşık olduğu tahmin edilebilir.

Monorepo ile artık bu tür durumlar için bir şube var ve taahhütler de farklı projelere ait kod düzeltmelerini yararlı bir şekilde kaydedebilir. Deponun bakımı da kolaylaştı. CI ayarlarının birden çok kez sürdürülmesi gerekmez ve bağımlılıkları güncel tutmak daha kolay yönetilebilir.

Kendisine erkek diyen çocuk


Yeni mimarinin bir başka özelliği de TypeScript kullanarak sürekli yazmadır. Veritabanında hangi veri tiplerinin bulunduğu, hangi veri tiplerinin metotlar tarafından parametre olarak kabul edildiği ve hangi tip verinin dönüş değerine sahip olduğu açıkça tanımlanmıştır. Kodun yeniden düzenlenmesi de çok daha kolaydır ve çalışma zamanı hataları neredeyse ortadan kalkar. Yanlışlıkla tanımlanmış türü ihlal eden bir kod yazdıysanız, editör bunu hemen belirtir ve hatayı hemen düzeltebilirsiniz. Son olarak, bir ön işleme kancası, gözden kaçan editör notlarının kesinlikle depoda kalmamasını sağlar. Yazma sadece arka uç kodunda değil, modele kadar devam ediyor.

Ön uçta da çok şey oldu. Bunu yakında ayrı bir gönderide daha ayrıntılı olarak ele alacağız.


(hehe)



ana sayfaya
 
Üst