Mikro hizmetler ve paylaşılan kütüphaneler


9

Bağımsız mikro hizmetlere (bir RabbitMq veri yolu üzerinden bağlı) dayalı bir sistem tasarlıyoruz. Kod (en azından ilk bileşenler için) python'a (hem python2 hem de python3) yazılır. Mikro hizmetler olarak yeniden düzenleme yapmak ve genişletmek istediğimiz bazı iş mantığını uygulayan monolit bir uygulamamız var. Beni endişelendiren bir soru:

Farklı mikro hizmetler arasında kod paylaşmanın en iyi yolu nedir? Birkaç mikro hizmet tarafından kullanılması gereken ortak yardımcı işlevlerimiz (veri işleme, günlük kaydı, yapılandırma ayrıştırma vb.) Var.

Mikro hizmetlerin kendileri ayrı projeler (git depoları) olarak geliştirilecektir. Ortak kütüphaneler bağımsız bir proje olarak da geliştirilebilir. Bu kütüphaneleri mikro hizmetler arasında nasıl paylaşabilirim?

Birkaç yaklaşım görüyorum:

  • her bir mikro hizmet için gereken kitaplık sürümünü kopyalayın ve gerektiği gibi güncelleyin
  • ortak kütüphaneleri dahili bir PyPi'ye bırakın ve bu kütüphaneleri mikro hizmet gereksinimlerine bağımlılık olarak listeleyin
  • kütüphane havuzunu git alt modülü olarak dahil et

Nasıl ilerleyeceğime karar vermeden önce önerilen yaklaşımlar, en iyi uygulamalar, geçmiş deneyimler hakkında biraz daha okumak istiyorum. Herhangi bir öneriniz veya bağlantınız var mı?


Mikroservislerde kendimi yeterince iyi tanımıyorum (şirketim yakın zamanda benzer bir şey yapmaya başladı), ancak burada açıkladığınız şeyin neden kırmızı bir bayrak olduğunu ve "dağıtılmış monolite" yol açabileceğine dair bir sunumun bağlantısı . Mikro hizmetler gerekli paylaşılan kitaplıklara sahip olmamalıdır. Gerçekten sadece Swagger gibi iyi tanımlanmış bir API (şimdi Açık API olarak adlandırılır ) arasında iletişim kurmalıdırlar .
Kaptan Adam

@CaptainMan: Tabii, ama diyelim ki bu basit işleve sahipsiniz: fib(n)(fibonacci serisinin uygulanması). Her mikro hizmette bu uygulamayı tekrarlamak istemezsiniz. Bu bir utilskütüphaneye aittir (özellikler ve hata düzeltmeleri için versiyonlanmıştır). Bu dağıtılmış bir monolit değildir, bu sadece ortak işlevsellik katmanıdır. Benim sorum, bu katmanı uygulama düzeyinde nasıl ele alacağım?
blueFast

Mikro hizmetlerimiz, sistemimizdeki diğer tüm mikro hizmetlerle aynı şekilde konuşmalarını sağlamak için kütüphaneleri paylaştı. Bunu paylaşılmayan kütüphanelerle nasıl yapabileceğinizden emin değilim; en azından herkes XML / JSON / etc manipülasyon kütüphanelerine ihtiyaç duyacaktır. Bu sunumu henüz izlemedim, ancak düşündüğümden daha akılda kalan "paylaşılan kütüphane" anlamı var mıydı?
Ixrec

1
@ jeckyll2hide C ++ kullanıyoruz, ancak bunun için altyapımız kabaca ikinci mermi noktanıza eşdeğer: ayrı repo, herkes bağımlılıklarını, bu bağımlılıkları oluşturma zamanında nasıl bulacağını bilen standart derleme sistemini, vb.
Ixrec

1
Kukla gibi hissediyorum, sorularınız gerçekten kütüphaneleri paylaşan mikro hizmetlerle ilgili değil, ekibinizin kütüphanelerini ekiple nasıl paylaşacağınızı soruyor. Bunun için bir cevap gönderecek kadar bilgim var.
Kaptan Adam

Yanıtlar:


5

İkinci seçeneğiniz kesinlikle gitmenin yolu. Ortak kütüphaneleri dağıtın ve yerel PyPi sunucunuza kurun.

Seçenek 1 korkunçtur, çünkü kütüphanelerde yapılan iyileştirmelerin onu kullanabilen başkalarına yayılması zor olacaktır.

Seçenek 3, seçenek 1'e benzer.

Ortak desen Jenkins'i ayarlamaktır, böylece bir kütüphane repo masterına bastığınızda, bir python derlemesi yapar ve bunu otomatik olarak PyPi deposuna yükler. Bu derleme komut dosyasını yazdıktan sonra, kitaplıkları paketleme ve bunları PyPi'ye manuel olarak yükleme konusunda asla endişelenmenize gerek kalmayacak. Ve bu seçenekle, tüm kitaplık güncellemeleri muhtemelen diğer mikro hizmetlere yükseltilmek üzere anında kullanılabilir olacaktır.

Kendi PyPi sunucunuzu kurmak çok kolaydır. Bu kılavuzu beğendim


1
Seçenek 2'nin en iyisi olduğunu kabul ediyorum, ancak alt modüllerle seçenek 3, seçenek 2 ile seçenek 1'den çok daha fazla ortak noktaya sahip.
8bittree

@ 8bittree: evet, seçenek 3 seçenek 2'ye benzer, ancak git sunucusunun ("merkezi" uzaktan kumanda) paket dağıtım mekanizması olması. Bir yandan git'e (bağımlılık yönetimi) değinilmeyen bir şey için kullanıyor, diğer yandan bileşen sayısını azaltır (özel PyPi'ye gerek yok)
blueFast

2

Bir Python adamı değil, PyPi sunucusu en iyi seçenek gibi görünüyor. Hızlı bir googling, ekibin Java kavanozları için bir Nexus deposuna benzediğini ortaya koyuyor.

Gerçekten, bağımlılık yönetimi aracınızın (okuma ve dağıtım) çalışabileceği bir tür merkezi depoya (ofise / takıma) dağıtıldığı sürece iyi bir seçenektir.

Seçenek 1 gerçekten en kötüsüdür, asla bağımlılıklarla elle uğraşmak zorunda kalmamalısınız. Bu bir acı. Üniversitede Maven'i bilmeden önce ve Git'in çok karmaşık olduğunu düşündüğümde, herkesin kodunu birleştirmekten sınıf yolları oluşturmaya, bağımlılıkları yakalamaya kadar her şeyi el ile yaptık. Bu bir acıydı, kimsenin, özellikle verimliliğin önemli olduğu bir çalışma ortamında bu sorunun bir kısmını bile geçmesini istemem.

Seçenek 3 muhtemelen işe yarayacaktır, ancak yerel bir PyPi'ye göre gerçek bir faydası yoktur (belki de kurulumu daha kolay olmakla birlikte, gerçek bir bağımlılık yönetim sisteminin faydaları çok daha iyidir).


1

Her şeyden önce, bir monoliti mikro hizmetlere bölmek her zaman zor olacaktır. Merkezi olmayan Veri Yönetimi - nedenleri hakkında bir fikir edinmek için veritabanlarını mikro hizmetlere kapsülleme konusuna bakın .

Bununla birlikte, nispeten makul bir şekilde nasıl yapılacağı için birkaç tarif var. Bunlardan biri http://12factor.net/ . Bu, her kitaplığı ve uygulamayı bağımsız olarak korumanız, sonra bağımlılıkları açıkça yönetmeniz gerektiğini söyler. Bu rotaya giderseniz, tüm bağımlılıkları güncel olan her şeye güncelleyen basit bir komutun olmasını şiddetle tavsiye ederim ve her mikro servis için düzenli olarak çalıştırırsınız. Üretimdeki kütüphanelerin sürümlerini kilitlediğiniz bir aklı başında bırakma sürecine sahip olmak önemlidir. Ancak, gerçekten, gerçekten , gerçekten bağımlılıkların bayatladığı bir pozisyonda olmak istemiyorsunuz ve orada ne olduğunu bilmiyorsunuz.

Ayrıca destek kitaplıklarınızı mümkün olduğunca sıkı ve odaklanmış hale getirmeye odaklanın. Kolay paylaşım için çekirdek kütüphanelere bir şeyler eklemeye başlamak için her zaman doğal bir çekim olacaktır. Bunu yapın ve mevcut spagetti topunu hızlı bir şekilde paylaşılan kütüphanelere çekecek ve şimdi sahip olduğunuz karmaşaya geri döneceksiniz. Bu nedenle, diğer yolu aşırı düzeltmek daha iyidir.


0

Doğrudan bir Python paketi bağımlılık dosyasından kütüphaneleri içeren özel GitHub depolarına işaret ederek sunucusuz olabilmeniz gerekir. Pipenv ve Poet bunu destekliyor.

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.