Bir Microservice Mimarisinde büyük dosya / veri aktarımı


22

Şirketim şu anda bir mikro hizmet mimarisi benimsemek için çalışıyor ancak yol boyunca bazı artan acılar (şok!) İle karşılaşıyoruz. Karşılaştığımız önemli tartışma noktalarından biri, farklı servislerimiz arasında büyük miktardaki verilerin nasıl iletileceğidir.

Bir parça arka plan olarak, şirket genelinde ele almamız gerekebilecek tüm belgeler için depo görevi gören bir belge depomuz var. Bahsedilen mağaza ile etkileşim, müşteriye benzersiz bir kimlik ve belgeyi akış için bir konum sağlayan bir servis aracılığıyla gerçekleştirilir. Dokümanın konumuna daha sonra, verilen kimliğe bakılarak erişilebilir.

Sorun şudur - Tüm mikro hizmetlerimizin bu benzersiz kimliği belgelerle etkileşimde bulunmak amacıyla API'lerinin bir parçası olarak kabul etmeleri mantıklı mı? Bana göre bu doğal olarak yanlış geliyor - hizmetler artık bağımsız değil ve belge deposunun hizmetine bağlı. Bunu kabul etmeme rağmen, bunun API tasarımını basitleştirebileceğini ve hatta belki de bazı performans kazanımlarının elde edilen eşleştirmeyi faydaları dengelemekten daha fazla kazandığını söyleyebilirim.

Gökkuşağı tek boynuzlu atların (Netflix, Amazon, Google vb.) Hizmetleri arasında büyük dosya / veri alışverişi yapmasını nasıl bilen var mı?


Yüksek oranda kullanılabilir bir belge / dosya deposu için ne kullanıyorsunuz?
Terence Johnson

@TerenceJohnson Şimdilik evde yetiştirilen bir çözüm kullanıyoruz. Yalnızca benzersiz bir belge kimliğini ve konumunu (gereksiz dahili ağ yükünü önlemek için bir akıştan ziyade müşteriye sağlanır) kaldıran bir RESTful Api'den yararlanan bir çözüme doğru ilerliyoruz. Asıl sebat AWS ile yapılacaktır.
PremiumTier

Yanıtlar:


7

Gökkuşağı tek boynuzlu atların (Netflix, Amazon, Google vb.) Hizmetleri arasında büyük dosya / veri alışverişi yapmasını nasıl bilen var mı?

Ne yazık ki, bu tür problemlerle nasıl baş ettiklerini bilmiyorum.

Sorun şudur - Tüm mikro hizmetlerimizin bu benzersiz kimliği belgelerle etkileşimde bulunmak amacıyla API'lerinin bir parçası olarak kabul etmeleri mantıklı mı?

Kendi mikro servisinizin mimarisinde olması gereken Tek Sorumluluk İlkesini ihlal ediyor. Bir mikro hizmet - mantıksal olarak bir, fiziksel olarak birini temsil eden birçok örnek - bir konuyla ilgileniyor olmalıdır .

Belge deponuz durumunda, belgeler için tüm sorguların gittiği bir noktaya sahipsiniz (elbette bu mantıksal birimi birkaç tür belge için birden fazla belge deposuna bölebilirsiniz).

  • Uygulamanızın bir belge üzerinde çalışması gerekiyorsa, ilgili mikro servisi sorar ve sonuçlarını işler.

  • Başka bir servis gerçek bir belgeye veya onun bir kısmına ihtiyaç duyuyorsa, belge servisine sorması gerekir.

Karşılaştığımız önemli tartışma noktalarından biri, farklı servislerimiz arasında büyük miktardaki verilerin nasıl iletileceğidir.

Bu mimari bir sorundur:

  1. Büyük miktarda veri aktarma ihtiyacını azaltın

    İdeal olarak, her hizmetin tüm verileri vardır ve yalnızca talepleri yerine getirmek için aktarım gerektirmez. Bu fikrin bir uzantısı olarak - veri aktarma gereksiniminiz varsa, fazlalığı düşünün (* olumlu bir şekilde_): Verilerin birçok yerde (ihtiyaç duyulan yerlerde) gereksiz olması mantıklı mı? Tutarsızlıkların süreçlerinize nasıl zarar verebileceğini düşünün. Aslında hiç olmadığı kadar hızlı transfer yok .

  2. Verilerin boyutunu küçült

    Verilerinizi nasıl sıkıştırabileceğinizi düşünün : Akıllı veri yapılarına kadar gerçek sıkıştırma algoritmalarıyla başlayın . Tel ne kadar az olursa, o kadar hızlısınız demektir.


2

Belgeniz deposunda tarafından döndürülen kimlik ise sistem boyunca referans belgelere yolu, o zaman hizmet ihtiyaçları onunla çalışmak için ihtiyacı olan belgelemek bilmek zaman tüm hizmetler, API o 'Belge Kimliği' kabul etmek için mantıklı.

Bu, hizmetler arasında gerekenden daha sıkı bir bağlantı sağlamaz. Belgelere erişmesi gereken hizmetlerin yine de belge deposu hizmetine erişmesi gerekir ve bu kimliğe, depoya hangi belgeye erişileceğini söylemesi gerekir.
Doğrudan belgelere erişmeyen hizmetlerin Belge Kimliğini birlikte geçirmesi gerekebilir, ancak bu hizmetlere bağımlılık yaratmayan rastgele bir dize olur.


Cevabın için teşekkürler. Mikro hizmetlerimizi, dahili belge depomuzdan da yararlanmak istemeyebilecek dış tüketicilere maruz bırakmaktan potansiyel olarak fayda sağlayabileceğimizi de eklemeliyim. Bununla birlikte, bunun hala en iyi yaklaşım olduğunu düşünüyor musunuz?
PremiumTier

@ PremiumTier: Evet. Ancak bu dış müşteriler, kendi hizmetinizle işbirliği yapabilmeleri için kendi iç mağazanızla aynı API'yi destekleyen kendi mağazalarını sağlamak zorunda kalacaklardır.
Bart van Ingen Schenau

Bu mantıklı ancak hizmetlerin belge referansları yerine akışları, bayt dizilerini veya json bloblarını kabul etmesinden daha zahmetli geliyor. Bu durumda, bir sonraki adaptör çağırılmadan önce gerekirse gerektiğinde dosya akışını almak için ilk önce bir 'adaptör' hizmeti çağrılabilir. Bu arada tartışmacı olmaya çalışmıyorum ama sadece bu yaklaşımın özelliklerini anlamaya çalışıyorum :)
PremiumTier

2

Şahsen, ayrı bir belge deposu hizmeti ve belge kimliği değil, belgelere erişmek için bir URL (uygun başlık doğrulaması ile) kullanmayı tercih ederim. Bu yaklaşımla, belge hizmetine güvenmek için diğer hizmetlere ihtiyaç duymazsınız, bunun yerine belgeye erişmek için tam URL'yi kullanabilirler. Ayrıca ölçeklendirme söz konusu olduğunda birden fazla belge deposunu da kullanabilirsiniz. depolama alanı büyüdüğünde ve URL'yi sağladığında.

Ancak, bir belge yüklemek ve URL'sini almak için bir hizmete ihtiyacınız olabilir.


1

Gökkuşağı tek boynuzlu atların (Netflix, Amazon, Google vb.) Hizmetleri arasında büyük dosya / veri alışverişi yapmasını nasıl bilen var mı?

Ödeme Amazon S3 REST API özellikleri, görünüşte bayt cinsinden tam nesne döndürürler. Bir mikro hizmet tasarlıyorsanız pek seçenek görünmüyor. Amazon S3 yanıt biçimi bağlantısı

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.