Potansiyel olarak monolitik bir uygulamayı birkaç küçük uygulamaya bölmek hataların önlenmesine yardımcı olur mu? [kapalı]


48

Bunu sormanın başka bir yolu; Programlar neden monolitik olma eğilimindedir?

İnsanların farklı iş akışlarında kullandığı Maya gibi bir animasyon paketi gibi bir şey düşünüyorum.

Animasyon ve modelleme yetenekleri kendi ayrı uygulamalarına ayrılıp ayrı ayrı geliştirildiyse, aralarında dosyalar geçirilirken, bakımı daha kolay olmaz mıydı?


9
If the animation and modelling capabilities were split into their own separate application and developed separately, with files being passed between them, would they not be easier to maintain?Bir kompleksi veya şüpheli tasarımları içermeyen bir modülü korumak için daha kolay bir şekilde genişletmek için kolay karıştırmayın . Eklentileri olmasa da Maya dünyadaki cehennem olabilir. Ya da tam tersi.
Laiv

37
Tek bir monolitik programın satmanın daha kolay ve çoğu insanın kullanımında daha kolay olacağını ekleyeceğim .
DarthFennec

2
@DarthFennec En iyi uygulamalar kullanıcıya bir uygulama gibi gelir, ancak kaputun altında ne gerekiyorsa onu kullanır. Ziyaret ettiğiniz çeşitli web sitelerini kaç tane mikro hizmete yönlendirirsiniz? Neredeyse hiçbiri artık yekpare değil!
corsiKa

23
@corsiKa Genelde bir masaüstü uygulamasını başlık altında iletişim kuran çoklu programlar olarak yazarak kazanılacak hiçbir şey yoktur, bu sadece çoklu modüller / kütüphaneler yazarak ve bunları bir monolitik ikili sisteme bağlayarak kazanılmaz. Mikro servisler, tek bir uygulamanın birden fazla fiziksel sunucu üzerinde çalışmasına izin vererek, performansın yük ile ölçeklendirilmesine izin verdiğinden, tamamen farklı bir amaca hizmet eder.
DarthFennec

5
@corsiKa - Kullandığım çok sayıda web sitesinin hala yekpare olduğunu tahmin ediyorum. Sonuçta internetin çoğu Wordpress ile çalışıyor.
Davor Ždralo

Yanıtlar:


94

Evet. Genel olarak iki küçük daha az karmaşık uygulamanın bakımı, tek bir büyük uygulamadan daha kolaydır.

Ancak, uygulamalar bir hedefe ulaşmak için bir araya geldiğinde yeni bir tür hata alırsınız. Birlikte çalışmalarını sağlamak için mesaj alışverişi yapmak zorundadırlar ve bu düzenleme her uygulama kusursuz şekilde çalışsa bile, çeşitli şekillerde yanlış gidebilir. Bir milyon küçük uygulamaya sahip olmak kendi özel problemlerine sahiptir.

Monolitik bir uygulama, tek bir uygulamaya daha fazla özellik eklerken elde ettiğiniz varsayılan seçenektir. Her özelliği kendi başına ele aldığınızda en kolay yaklaşım budur. Sadece bir kez büyüdükçe, bütüne bakıp "ne biliyorsan, X ve Y'yi ayırırsak daha iyi çalışacağını" söyleyebileceksin.


6
Evet ve performans göstergeleri de var; örneğin, bir göstergenin etrafında veri serileştirme.
JimmyJames

65
“Genellikle 2 daha küçük ve daha az karmaşık uygulamanın bakımı tek bir büyük uygulamadan daha kolaydır.” - Doğru olmadığı zamanlar hariç. Bu iki uygulamanın birbiriyle nerede ve nasıl bir araya gelmesi gerektiğine bağlıdır.
Doktor Brown,

10
"Genellikle 2 daha küçük ve daha az karmaşık uygulamayı sürdürmek, tek bir büyük uygulamadan çok daha kolaydır." Sanırım bunun için daha fazla açıklama isteyeceğim. Tam olarak neden bir kod tabanından bir çalıştırılabilir dosya yerine iki tane üretme işlemi sihirli bir şekilde kodu kolaylaştırıyor? Kodun ne kadar kolay olması gerektiğine karar veren şey, ne kadar sıkı bir şekilde bağlı olduğu ve benzeri şeylerdir. Ama bu mantıklı bir ayrılık ve fiziksel olanla hiçbir ilgisi yok .
Voo

11
@Ew Fiziksel ayrılma mantıklı bir ayrımı zorlamaz, sorun bu. İki ayrı uygulamanın birbirine yakın olduğu bir sistemi kolayca tasarlayabilirim. Elbette burada bir ilişki var , bir uygulamayı ayırmak için zaman harcayan insanlar bu şeyleri göz önünde bulundurmaya yetecek kadar yetkin olduğundan, ancak herhangi bir nedensellik üstlenmeleri için çok az neden olduğundan emin olun . Aynı mantıkla, en son C # versiyonunun kullanılmasının kodu korumayı çok kolaylaştırdığını iddia edebilirim, çünkü araçlarıyla güncel tutan bir ekip muhtemelen kodun bakımı konusunda da endişe duyacaktır.
Voo

9
Tam tersine, bu başarısızlık 2) Bir uygulama Yarma başka olası noktası sağlar - 1) bir uygulama daha rahat olun uymayan bir uygulama kendisini Yarma: Burada tartışma 2 ifadelerle özetlenebilir düşünüyorum güçleri bölmek nereye düşünmek Bu, hiç yapılmamış bir monolit ile karşılaştırıldığında bir avantaj sağlar.
R. Schmitz

51

Potansiyel monolitik bir uygulamayı birkaç küçük uygulamaya bölmek hataların önlenmesine yardımcı olur mu?

İşler nadiren gerçekte bu kadar basit değildir.

Ayrılmak kesinlikle ilk başta bu böcekleri önlemeye yardımcı olmaz. Bazen hataları daha hızlı bulmaya yardımcı olabilir. Küçük, yalıtılmış bileşenlerden oluşan bir uygulama, bu bileşenler için daha bireysel (tür "ünite" -) testlerine izin verebilir, bu da bazı böceklerin kök nedenini tespit etmeyi bazen kolaylaştırabilir ve böylece onları daha hızlı düzeltmelerini sağlar.

Ancak,

  • Dışarıdan monolitik görünen bir uygulama bile, içeride çok sayıda test edilebilir bileşenlerden oluşabilir, bu nedenle monolitik bir uygulama için ünite testlerinin yapılması zor değildir.

  • Ewan'ın daha önce de belirtildiği gibi, birkaç bileşenin etkileşimi ek riskler ve hatalar doğurur. Karmaşık süreçler arası iletişim ile bir uygulama sisteminde hata ayıklamak, tek işlem uygulamasında hata ayıklamaktan çok daha zor olabilir

Bu, daha büyük bir uygulamanın bileşenlere ne kadar iyi ayrılabildiğine ve bileşenler arasındaki arabirimlerin ne kadar geniş olduğuna ve bu arabirimlerin nasıl kullanıldığına da bağlıdır.

Kısacası, bu genellikle bir takastır ve genel olarak “evet” veya “hayır” cevabının doğru olduğu hiçbir şey yoktur.

Neden programlar monolitik olma eğilimindedir?

Onlar mı? Etrafınıza bakın, dünyada bana karşı çok monolitik görünmeyen, tam tersi görünen Web uygulamaları var. Eklenti bir model sağlayan birçok program vardır (AFAIK bile bahsettiğiniz Maya yazılımı bile).

bakımı daha kolay olmaz mıydı?

Buradaki "daha kolay bakım" genellikle bir uygulamanın farklı bölümlerinin farklı ekipler tarafından daha kolay geliştirilebilmesi gerçeğinden kaynaklanır, bu nedenle daha iyi dağıtılmış iş yükü, daha net odaklanmış özel ekipler ve daha fazlası.


4
son cümleyinizle Conway yasası , sistem yapısının örgütlenme taklit etme eğiliminde olduğunu söylüyor. yapısı: Devs / ekipleri düzeltmeleri / iyileştirmeler iken yani, diğerlerine göre bazı bölgelerinde daha aşina olduğu gerektiğini en alakalı kısmında gerçekleşmesi, bir dev "kendi" parçaları haline kesmek yerine (a) nasıl olduğunu öğrenmek için daha kolay olabilir diğer bölüm çalışmaları veya (b) bu ​​bölüme daha aşina olan biriyle çalışmak. Bu, "TK" lerden ve "doğru" / basit olanları bulmanın ve uygulamanın ne kadar zor olabileceğiyle ilgilidir.
Warbo,

38

Bu konuda çoğunluğa katılmam gerekecek. Bir uygulamanın iki ayrı uygulamaya bölünmesi, kodun korunmasını veya sebep oluşturmasını kolaylaştırmaz.

Kodu iki çalıştırılabilir dosyaya ayırmak, kodun fiziksel yapısını değiştirir , ancak önemli olan bu değil. Bir uygulamanın ne kadar karmaşık olduğuna karar veren, onu oluşturan farklı parçaların ne kadar sıkı bir şekilde birleştirildiğidir . Bu fiziksel bir özellik değil, mantıklı bir özelliktir .

Farklı kaygılar ve basit arayüzler arasında net bir ayrım olan monolitik bir uygulamaya sahip olabilirsiniz. Diğer mikro servislerin uygulama detaylarına dayanan ve diğerleriyle sıkı sıkıya bağlı olan bir mikro hizmet mimarisine sahip olabilirsiniz.

Gerçek olan, büyük bir uygulamayı küçük uygulamalara bölme sürecinin, her bir bölüm için net arayüzler ve gereksinimler oluşturmaya çalışırken çok yararlı olmasıdır. DDD konuşmasında sınırlanmış bağlamlarınızla ortaya çıkacaktı. Ancak daha sonra çok sayıda küçük uygulama veya aynı mantıksal yapıya sahip bir büyük uygulama oluşturup oluşturmadığınız daha teknik bir karardır.


Ancak, biri çoklu düzenleme modlarına sahip bir masaüstü uygulaması kullanıyorsa ve bunun yerine, kullanıcının arabirim kullanmak yerine tek tek açacağı her mod için bir masaüstü uygulaması yaparsa. Bu, "kullanıcı düzenleme modları arasında geçiş yapabilir" in "özelliğini" üretmeye adanmış önemsiz miktarda bir kodu ortadan kaldırmaz mıydı?
Büyük Ördek

3
@TheGreatDuck Öyle görünüyor ki, farklı uygulamalar arasında geçiş yapmak istemeyen önemsiz sayıda kullanıcıyı da ortadan kaldıracak. ;) Fakat evet, özellikleri ortadan kaldırmak genellikle daha basit kodlara yol açar. Yazım denetimini ortadan kaldırırsanız, yazım denetimi hatalarına sahip olma olasılığını ortadan kaldırırsınız. Bu nadiren yapılır çünkü özellik eklendi, çünkü birisi istedi.
Odalrick

1
@TheGreatDuck Elbette, UX'in tasarımı herhangi bir mimari karardan önce gelmelidir. Programınızı kimse kullanmazsa, en iyi tasarım mimarisine sahip olmanın bir anlamı yoktur. İlk önce neyi oluşturmak istediğinize karar verin ve teknik detaylara karar verin. İki ayrı uygulama tercih edilirse, bunun için gidin. Yine de paylaşılan kütüphaneler aracılığıyla birçok kodu paylaşabilirsiniz.
Voo

Sistemin karmaşıklığının parçaların sıkı bir şekilde bağlanmasından kaynaklandığını söylemek doğru mudur ? Belirli bileşenlerin karmaşıklığı sınırlı bir sınırlılık durumunda sınırlı bir halde izole edilse de, sisteminizi dolaylı ve iletişim kurarken bölüştürürseniz , toplam karmaşıklığın artacağını söylemek isterim .
Alex,

1
@ TheGreatDuck Buradaki temel varsayım, sistemlerin ortak bir noktaya sahip olduğu ve aslında birbirleriyle bir şekilde veya başka bir şekilde iletişim kurmaları gerektiğidir. OP'nin tuhaf bir nedenden ötürü bir araya getirilen tamamen farklı iki uygulamanın, ayrılırsa sürdürmenin daha kolay olup olmayacağını sorduğunu sanmıyorum. Pratikte sıkça ortaya çıkmayan garip bir durum gibi görünüyor (her ne kadar birisinin bunu yaptığına emin olsam da).
Voo

15

Onları bölmeyi bitirdikten sonra bakımı daha kolay, evet. Ancak onları bölmek her zaman kolay değildir. Bir programın bir parçasını tekrar kullanılabilir bir kütüphaneye bölmeye çalışmak, orijinal geliştiricilerin dikişlerin nerede olması gerektiği hakkında düşünemediklerini ortaya koyuyor . Uygulamanın bir kısmı, uygulamanın başka bir bölümüne derinlemesine ulaşıyorsa, düzeltilmesi zor olabilir. Dikişleri sökük daha net iç API'leri tanımlamak için zorlar ve bu sonuçta korumak için kod tabanı daha kolay kılıyor. Yeniden kullanılabilirlik ve bakım kolaylığı hem iyi tanımlanmış dikişlerin ürünleridir.


Harika yazı. Sanırım ne hakkında konuştuğunuzun klasik / kurallı bir örneği bir GUI uygulaması olduğunu düşünüyorum. çoğu zaman bir GUI uygulaması bir programdır ve arka uç / ön uç sıkıca birleştirilmiştir. Zaman geçtikçe meseleler ortaya çıktıkça ... birisinin arka ucu kullanması gerektiği gibi ama ön cepheye bağlı olduğu için yapamaz. veya arka uç işleme çok uzun sürüyor ve ön ucu aşağı doğru sallıyor. genellikle bir büyük GUI uygulaması iki programa bölünür: biri ön uç GUI, diğeri arka uçtur.
Trevor Boyd Smith

13

Korelasyonun nedensellik olmadığını hatırlamak önemlidir.

Büyük bir monolit inşa etmek ve daha sonra birkaç küçük parçaya bölmek iyi bir tasarıma yol açabilir veya açmayabilir. (Bu olabilir tasarımını geliştirmek, ancak garanti edilmez.)

Ancak, iyi bir tasarım genellikle bir sistemin büyük bir monolit yerine birkaç küçük parça olarak inşa edilmesine yol açar. (Bir monolit olabilir sadece çok az olasıdır olmak var, iyi tasarım olması.)

Küçük parçalar neden daha iyi? Çünkü haklı olmaları daha kolay. Ve doğruluk hakkında mantıklı olmanız kolaysa, doğru bir sonuç almanız daha olasıdır.

CAR Hoare'den alıntı yapmak için:

Bir yazılım tasarımı yapmanın iki yolu vardır: Bir yol, o kadar basit, açık bir şekilde hiçbir eksiklik olmayacak şekilde basitleştirmektir , diğer yol ise, belirgin bir eksikliğin olmadığı kadar karmaşık hale getirmektir .

Öyleyse, neden herkes gereksiz yere karmaşık veya monolitik bir çözüm üretsin? Hoare cevabı bir sonraki cümleyle sağlar:

İlk yöntem çok daha zor.

Ve daha sonra aynı kaynaktan (1980 Turing Ödülü Anlatımı):

Güvenilirliğin bedeli en yüksek basitliğin peşinde. Zenginlerin en fazla ödemeyi zor bulduğu bir fiyattır.


6

Bu evet ya da hayır cevabı olan bir soru değil. Soru sadece bakım kolaylığı değil, aynı zamanda becerilerin verimli kullanımıyla ilgili bir soru.

Genel olarak, iyi yazılmış bir yekpare uygulama etkilidir. İşlemler arası ve cihazlar arası iletişim ucuz değildir. Tek bir işlemi parçalamak verimliliği azaltır. Ancak, her şeyi tek bir işlemcide yürütmek işlemciyi aşırı yükleyebilir ve performansı yavaşlatabilir. Bu temel ölçeklenebilirlik konusudur. Ağ resme girdiğinde sorun daha da karmaşıklaşıyor.

Tek bir sunucu üzerinde tek bir işlem olarak verimli bir şekilde çalışabilen iyi yazılmış bir yekpare uygulama, bakımı ve hatasız kalması kolay olabilir, ancak yine de kodlama ve mimari becerilerin verimli kullanımı olmayabilir. İlk adım, süreci aynı işlem olarak hala yürüten, ancak uyum ve gevşek bağlanma disiplinlerini izleyen bağımsız olarak kodlanan kütüphanelere bölmektir. Bu seviyede iyi bir iş, sürdürülebilirliği arttırır ve nadiren performansı etkiler.

Bir sonraki aşama, monoliti ayrı işlemlere bölmektir. Bu daha zor çünkü zor bölgeye giriyorsunuz. Yarış durumu hatalarını tanıtmak kolaydır. İletişim yükü artıyor ve "konuşkan arayüzler" konusunda dikkatli olmalısınız. Ödüller harika çünkü ölçeklenebilirlik engelini aştınız, ancak kusur potansiyeli de artıyor. Çok işlemli uygulamaların modül seviyesinde bakımı kolaydır, ancak genel sistemin sorunlarını gidermek daha karmaşık ve zordur. Düzeltmeler şeytani bir şekilde karmaşık olabilir.

İşlemler ayrı sunuculara veya bulut tarzı bir uygulamaya dağıtıldığında, sorunlar zorlaşır ve ödüller artar. Ölçeklenebilirlik yükseliyor. (Ölçeklenebilirlik sağlamayan bir bulut uygulaması düşünüyorsanız, zor düşünün.) Ancak bu aşamada girilen sorunları tanımlamak ve düşünmek inanılmaz derecede zor olabilir.


4

Hayır . bakımını kolaylaştırmaz. Bir şey daha fazla sorun için hoş geldiniz.

Neden?

  • Programlar, birbirlerinin makul olduğu ölçüde çalışabilmeleri için ortak bir anlayış anlamına gelen ortogonal değildir.
  • Her iki programın çoğu kodu aynıdır. Ortak bir kütüphane mi kullanıyorsunuz, yoksa iki ayrı kopya mı kullanıyorsunuz?
  • Artık iki geliştirme ekibiniz var. Nasıl iletişim kuruyorlar?
  • Artık ihtiyacınız olan iki ürününüz var:

    • ortak bir UI tarzı, etkileşim mekanizmaları, vb ... Şimdi tasarım problemleriniz var. (Dev ekipleri tekrar nasıl iletişim kurar?)
    • geriye dönük uyumluluk (modeller v1 animatör v3'e aktarılabilir mi?)
    • bulut / ağ entegrasyonu (eğer bir özelliği ise) şimdi iki kat ürün kadar güncellenmesi gerekiyor.
  • Artık üç tüketici pazarınız var: Modelleyiciler, Animatörler ve Modelleyiciler Animatörler

    • Çelişkili öncelikleri olacak
    • Çelişkili destek ihtiyaçlarına sahip olacaklar
    • Çakışan kullanım stillerine sahip olacaklar
  • Modeller Animators aynı dosya üzerinde çalışmak için iki ayrı uygulama açmak zorunda mı? Her iki işlevi de içeren üçüncü bir uygulama var mı, bir uygulama diğerinin işlevlerini yüklüyor mu?
  • vb...

Küçük kod bazlarının uygulama düzeyinde bakımı daha kolay olduğu söyleniyorsa, bedava bir öğle yemeği almayacaksınız. Bu, Mikro Servis / Herhangi Bir Modüler Mimarinin merkezinde de aynı problemdir. Her derde deva değil, uygulama seviyesindeki bakım zorluğu düzenleme seviyesindeki bakım zorlukları için işlem görüyor. Bu konular hâlâ sorun, sadece artık kod tabanında değil, kaçınılması veya çözülmesi gerekecek.

Orkestrasyon seviyesindeki problemi çözmek daha basitse, her uygulama seviyesinde problem çözmek o zaman iki kod tabanına ayırmak ve orkestrasyon sorunlarıyla ilgilenmek anlamlıdır.

Aksi takdirde hayır, sadece yapmayın, uygulamanın kendi iç modülerliğini geliştirerek daha iyi hizmet edersiniz. Uygulamanın bir eklenti olarak hareket ettiği kitaplıkları sürdürmek için kod bölümlerini tutarlı hale getirin ve daha kolay hale getirin. Sonuçta bir monolit sadece bir kütüphane manzarasının sadece orkestrasyon katmanıdır.


3

Çok iyi cevaplar vardı ama neredeyse ölü bir bölünme olduğu için şapkamı da çembere atacağım.

Yazılım mühendisi olarak deneyimlerime göre, bunun basit bir sorun olmadığını gördüm. Bu gerçekten uygulamanın boyutuna , ölçeğine ve amacına bağlıdır . Bunları değiştirmek için gerekli olan atalet nedeniyle daha eski uygulamalar genellikle monolitiktir çünkü bu uzun süredir yaygın bir uygulamadır (Maya bu kategoride yer alır). Genel olarak yeni uygulamalardan bahsettiğinizi varsayıyorum.

Tek veya daha az tek kaygılı olan küçük uygulamalarda, birçok ayrı parçayı korumak için gerekli olan ek yük genellikle ayırma işleminin yapılmasının ötesine geçer. Bir kişi tarafından sağlanabilirse, muhtemelen çok fazla soruna neden olmadan monolitik yapılabilir. Bu kuralın istisnası, uygun şekilde ayrılmış (mantıksal olarak) birçok farklı bölümünüz (bir ön uç, arka uç, belki de aralarındaki bazı veri katmanları) olduğundadır.

Çok büyük tek endişe uygulamalarında bile bunu bölmek deneyimlerime göre anlamlıdır. Diğer (karşılığında çözülmesi daha kolay olan) hatalar karşılığında olası bir böcek sınıfı alt kümesini azaltma avantajına sahipsiniz. Genel olarak, verimliliği artıran yalıtımlı çalışan insan ekipleri de olabilir. Ancak bu günlerde birçok uygulama bazen kendi zararlarına göre oldukça ince bir şekilde ayrılmıştır. Ayrıca, uygulamanın gereksiz yere çok fazla mikro hizmete bölündüğü ekiplerdeydim, her şey birbirleriyle konuşmayı kestiğinde çok fazla genel gider sağladı. Ek olarak, her bir parçanın diğer parçalarla nasıl konuştuğu hakkındaki tüm bilgileri tutmak zorunda olmak, birbirini takip eden her bölünme ile daha da zorlaşmaktadır. Bir denge var ve buradaki cevapların size söyleyebileceği gibi, bunu yapmanın yolu çok net


2
Programcı olarak ilk işim millenium bug programcısıydı. Üzerinde çalıştığım yazılım, hepsi küçük bir parça yapan, toplu iş dosyaları ile birlikte dizilmiş ve durumu iletmek için dosyaları kullanan yüzlerce küçük programa bölündü. Bilgisayarların yavaş olduğu, hafızasının az olduğu ve depolamanın pahalı olduğu bir zamanda icat edilen büyük bir karmaşaydı. Onunla çalıştığımda, kod zaten 10-15 yaşındaydı. Yaptıktan sonra tavsiyemi istediler ve tavsiyem her şeyi yeni bir yekpare uygulamaya dönüştürmek oldu. Onlar yaptı ve bir yıl sonra çok teşekkür ederim.
Pieter B

@PieterB Benzer bir deneyim yaşadım. "En son teknoloji" ne yazık ki birçok yönden çok büyük bir kargo kültüdür. İş için en iyi yöntemi seçmek yerine birçok şirket, bir FAANG'ın soru sormadan ne yaptığını takip eder.
CL40

ve ayrıca: bir kez derlendikten sonra yekpare bir uygulama olarak ortaya çıkabilecek, kod açısından çok modüler bir uygulama olabilir.
Pieter B,

1

UI uygulamaları için toplam hata miktarını azaltması muhtemel değildir, ancak böcek karışımı dengesini iletişimden kaynaklanan sorunlara doğru kaydırır.

Kullanıcıya yönelik kullanıcı arayüzü uygulamalarına / sitelerine ilişkin konuşma - kullanıcılar son derece sabırlı değildir ve düşük yanıt süresi gerektirir. Bu herhangi bir iletişim gecikmesini hataya dönüştürür. Sonuç olarak, tek bir bileşenin karmaşıklığı ve çok sert hataların azalması ve çapraz işlem / çapraz makina iletişiminin zamanlama gerekliliği nedeniyle, potansiyel hataların azalması söz konusu olacaktır.

Programın uğraştığı veri birimleri büyükse (yani görüntüler), herhangi bir çapraz işlem gecikmesi daha uzun ve daha zor olacaktır - "10mb görüntüye dönüşüm uygula" gibi bir şey anında + 20 MB disk / ağ IO kazanacaktır. Bellek içi formattan seri hale getirme formatına ve geriye 2 dönüşüm. Kullanıcıdan bunu yapmak için gereken zamanı gizlemek için yapabileceğiniz pek bir şey yok.

Ek olarak, herhangi bir iletişim ve özellikle de disk IO, AntiVirus / Firewall kontrollerine tabidir - bu kaçınılmaz olarak, yeniden üretilmesi zor bir hata katmanı ve daha da fazla gecikme ekler.

Monolitik "program" bölünmesi, iletişim gecikmelerinin kritik olmadığı veya kaçınılmaz olduğu yerlerde parlar

  • Bireysel adımların belirgin şekilde iyileştirilmesi için küçük ekstra gecikmelerde işlem yapabileceğiniz bilgilerin toplu olarak işlenmesi (bazen bir kez kullanıma hazır kullanarak özel bileşenlere olan gereksinimi ortadan kaldırarak). Küçük bireysel adım ayak izi, örneğin tek bir pahalı makine yerine birden çok daha ucuz makine kullanmanıza izin verebilir.
  • monolitik hizmetleri daha az eşleşmiş mikro hizmetlere bölmek - büyük olasılıkla yerine birkaç hizmeti paralel olarak çağırmak, ekstra gecikmelere neden olmayacaktır (eğer her biri daha hızlıysa ve bağımlılık yoksa, toplam süreyi kısaltabilir)
  • kullanıcıların uzun zaman almayı umdukları işlemleri ortadan kaldırmak - karmaşık 3d sahne / film yapmak, verilerle ilgili karmaşık ölçütleri hesaplamak, ...
  • her türlü "otomatik tamamlama", "yazım denetimi" ve diğer isteğe bağlı yardımlar harici olabilir ve sıklıkla harici olabilir - en açık örnek, girişinizin her zaman harici servise (arama motoru) gönderdiği tarayıcı url otomatik önerileridir. .

Bunun hem masaüstü uygulamaları hem de web siteleri için geçerli olduğunu - programın kullanıcı tarafının "monolitik" olma eğiliminde olduğunu - tek bir veri parçasına bağlı tüm kullanıcı etkileşimi kodunun genellikle tek bir işlemde çalıştığını unutmayın (bölmek olağandışı değildir) HTML sayfası veya bir resim gibi veri başına veri bazında işler ancak bu soruya diktir). Kullanıcı girişi olan çoğu temel site için bile, istemci tarafında çalışan doğrulama mantığını göreceksiniz, sunucu tarafı yapmak daha modüler olsa ve karmaşıklığı / kod çoğaltmasını azaltacaktır.


0

[O] böcekleri önlemeye yardımcı oluyor mu?

Önlemek? Hayır, gerçekten değil.

  • Hataların tespit edilmesine yardımcı olur .
    Yani sahip olduğunuzu bile bilmediğiniz tüm böcekler, yalnızca bütün bu karışıklığı daha küçük parçalara bölmeye çalıştığınızda keşfetmişsinizdir. Böylece, bir şekilde bu böceklerin üretimde ortaya çıkmalarını önledi - ama böcekler zaten oradaydı.
  • Hataların etkisini azaltmaya yardımcı olur .
    Monolitik uygulamalardaki hatalar, tüm sistemi çökertme ve kullanıcının uygulamanızla etkileşime girmesini önleme potansiyeline sahiptir. Bu uygulamayı bileşenlere bölerseniz, çoğu hata - tasarım gereği - bileşenlerden yalnızca birini etkiler.
  • Yeni hatalar için bir senaryo yaratır .
    Kullanıcının deneyimini aynı tutmak istiyorsanız, tüm bu bileşenlerin iletişim kurması için yeni bir mantık eklemeniz gerekecektir (REST servisleri aracılığıyla, işletim sistemi sistem çağrıları aracılığıyla, neyin var), böylece kullanıcının POV'sinden sorunsuz bir şekilde etkileşime girebilirler.
    Basit bir örnek olarak: monolitik uygulamanız, kullanıcıların bir model oluşturmasını ve uygulamadan ayrılmadan canlandırmasını sağlar. Uygulamayı iki bileşene ayırırsınız: modelleme ve animasyon. Artık kullanıcılarınızın modelleme uygulamasının modelini bir dosyaya aktarması, ardından dosyayı bulması ve daha sonra animasyon uygulamasıyla açması gerekiyor ... Kabul edelim, bazı kullanıcılar bundan hoşlanmayacak, bu nedenle yeni bir mantık eklemelisiniz. dosyayı dışa aktarmak için modelleme uygulaması veotomatik animasyon uygulamasını başlatın ve bu dosyayı açmak olun. Ve bu yeni mantık, olabildiğince basit, veri serileştirme, dosya erişimi ve izinler, uygulamaların kurulum yolunu değiştiren kullanıcılar, vb.
  • Çok ihtiyaç duyulan refactoring uygulamak için mükemmel bir bahane .
    Monolitik bir uygulamayı daha küçük bileşenlere ayırmaya karar verdiğinizde, (umarız) bunu, sistem hakkında ilk tasarlandığından çok daha fazla bilgi ve tecrübe ile yaparsınız ve bu sayede kodun oluşturulması için bir dizi yeniden düzenleyici uygulayabilirsiniz. Daha temiz, daha basit, daha verimli, daha esnek, daha güvenli. Ve bu yeniden yapılandırma bir şekilde böcekleri önlemeye yardımcı olabilir. Elbette, aynı hataları önlemek için aynı şekilde yeniden yapılanma işlemini monolitik uygulamaya da uygulayabilirsiniz, ancak kullanıcı arayüzünde bir şeye dokunmaktan ve iş mantığını kırmaktan korktuğunuz için tek yönsüz olduğu için yapamazsınız ¯ \ _ (ツ) _ / ¯

Bu yüzden sadece monolitik bir uygulamayı daha küçük parçalara bölerek hataları önlediğinizi söyleyemem, ama gerçekten de böceklerin daha kolay önlenebileceği bir noktaya ulaşmayı kolaylaştırıyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.