Elixir / erlang mikro hizmetler yaklaşımının neresinde yer alır? [kapalı]


109

Son zamanlarda birden fazla işbirliği yapan mikro hizmeti dağıtmak için docker compose ile bazı deneyler yapıyorum. Mikro hizmetlerin sağladığı birçok avantajı görebiliyorum ve artık bunları yönetmek için iyi bir araç seti olduğuna göre, mikro hizmetlere atlamanın çok zor olmadığını düşünüyorum.

Ama Elixir ile de deneyler yapıyorum ve tek başına sağladığı faydaları çok beğeniyorum. Kodunuzu birden fazla ayrıştırılmış uygulamada paketlemeyi teşvik ettiği ve sıcak kod yükseltmelerini desteklediği göz önüne alındığında, docker'ı iksir (veya bu konuda erlang) ile nasıl karıştırırsınız?

Örneğin docker'ı dev-prod eşliği sağladığı için kullanmak istersem, iksir buna nasıl uyuyor? Docker container'larının değişmez olduğu düşünüldüğünde, sıcak kod yükseltmeleri yapma yeteneğimi kaybediyorum, değil mi? Mavi / yeşil dağıtımlar veya kanarya sürümleri ne olacak?

Demek istediğim, Elixir ile mikro hizmetler yazabilir ve bunları başka bir dilde yazılmış gibi kullanabilirim, poliglotizm yine de mikro hizmetlerin faydalarından biridir, ancak o zaman OTP platformunu kullanmanın tüm faydalarından yararlanamıyorum. Tamamen işbirliğine dayalı erlang uygulamalarının, farklı dillerde yazılmış (veya yazılmayan) mikro hizmetler arasında iletişim kurmak için ara kuyrukları kullanmaktan çok daha optimal olduğunu tahmin edin.


7
Olumsuz oylamanın, sorunun "herhangi bir araştırma çabası göstermemesi" olduğunu görüyorum. Bu üzücü, çünkü gerçekten doğru değil, elbette sorun sorunun kendisinde olabilir, ancak araştırma yapmamakla suçlanamam çünkü son zamanlarda yaptığım tek şey bu. Çok.
Papipo

1
Bu soru çok geniştir - yığın aşımı ile ilgili soruların belirli sorunları içermesi amaçlanmıştır.
Paweł Obrok

4
onu başka bir stackexchange sitesine taşımalı mıyım? Çünkü soru meşru IMO'dur.
Papipo

2
Bunun ilginç bir soru olduğunu düşünüyorum, ancak programcıların değişimine ait olabilir mi? Olduğu söyleniyor, kapatma oyu vermiyor
George Mauer

1
Harika ve tamamen iş için yapıldı.
bryan hunt

Yanıtlar:


139

Bu çok açık bir soru, ancak Elixir / Erlang'ın neden dağıtılmış sistemler geliştirmek için en iyi platform olabileceğini göstermeye çalışacağım (mikro hizmetlerle çalışıyor olmanıza bakılmaksızın).

İlk olarak, biraz arka planla başlayalım. Erlang VM ve standart kitaplığı, dağıtılmış sistemler oluşturmak için önceden tasarlandı ve bu gerçekten ortaya çıkıyor. Bildiğim kadarıyla, bu kullanım durumu için önceden tasarlanmış üretimde yaygın olarak kullanılan tek çalışma zamanı ve sanal makinedir.

Uygulamalar

Örneğin, zaten "uygulamalara" işaret ettiniz. Erlang / Elixir'de kod, aşağıdakileri sağlayan uygulamalar içinde paketlenmiştir:

  1. ünite olarak başlatılır ve durdurulur. Sisteminizi başlatmak ve durdurmak, içindeki tüm uygulamaları başlatmak meselesidir
  2. birleşik bir dizin yapısı ve yapılandırma API'si (XML değil!) sağlayın. Zaten bir OTP uygulamasıyla çalışmış ve yapılandırmışsanız, başka bir uygulamayla nasıl çalışacağınızı bilirsiniz
  3. tüm süreçleri (işlemle basit hesaplama konuları olan "VM işlemlerini" kastediyorum) ve durumlarıyla birlikte uygulama denetim ağacınızı içerir

Bu tasarımın etkisi çok büyük. Bu, Elixir geliştiricilerinin uygulama yazarken aşağıdakilere daha açık bir yaklaşımı olduğu anlamına gelir:

  1. kodlarının nasıl başlatılıp durdurulduğu
  2. bir uygulamanın parçası olan süreçler nelerdir ve bu nedenle uygulama durumu nedir
  3. Bu süreç, çökme durumunda veya bir şeyler ters gittiğinde nasıl tepki verecek ve etkilenecek

Sadece bu da değil, bu soyutlamanın etrafındaki araçlar harika. Eğer İksir yüklüyse, "IEX" ve türünü açmak: :observer.start(). Canlı sisteminiz hakkında bilgi ve grafikler göstermenin yanı sıra, rastgele süreçleri öldürebilir, bellek kullanımlarını, durumlarını ve daha fazlasını görebilirsiniz. Bunu bir Phoenix uygulamasında çalıştırmanın bir örneği:

Phoenix uygulamasıyla çalışan gözlemci

Buradaki fark, Uygulamalar ve Süreçlerin size üretimdeki kodunuz hakkında mantık yürütmek için bir soyutlama vermesidir . Çoğu dil, çalışma zamanı sistemi üzerinde hiçbir yansıması olmayan, çoğunlukla kod organizasyonu için paketler, nesneler ve modüller sağlar. Bir sınıf özniteliğiniz veya tekil bir nesneniz varsa: onu işleyebilecek varlıklar hakkında nasıl mantık yürütebilirsiniz? Bir bellek sızıntınız veya darboğazınız varsa, bundan sorumlu varlığı nasıl bulabilirsiniz?

Dağıtılmış bir sistemi çalıştıran herhangi birine sorarsanız, istedikleri türden bir anlayış budur ve Erlang / Elixir ile yapı taşı olarak buna sahipsiniz.

İletişim

Bütün bunlar gerçekten sadece başlangıç. Dağıtılmış bir sistem oluştururken, bir iletişim protokolü ve veri serileştiricisi seçmeniz gerekir. Pek çok insan, düşündüğünüzde, gerçekten RPC çağrılarını gerçekleştirmek için çok ayrıntılı ve pahalı bir kombinasyon olan HTTP ve JSON'u seçiyor.

Erlang / Elixir ile zaten bir iletişim protokolüne ve kutudan çıkar çıkmaz bir serileştirme mekanizmasına sahipsiniz. Birbiriyle iletişim kuran iki makineye sahip olmak istiyorsanız, onlara sadece isim vermeniz, aynı sırra sahip olduklarından emin olmanız gerekir ve işiniz bitti.

Jamie, Erlang Factory 2015'te bundan ve bir oyun platformu oluşturmak için bundan nasıl yararlanabildiklerinden bahsetti: https://www.youtube.com/watch?v=_i6n-eWiVn4

HTTP ve JSON kullanmak istiyorsanız, bu da sorun değil ve Plug ve Phoenix gibi çerçeveler gibi kitaplıklar da burada üretken olduğunuzu garanti edecek.

Microservices

Şimdiye kadar mikro hizmetler hakkında konuşmadım. Çünkü bu noktaya kadar gerçekten önemli değiller. Zaten sisteminizi ve düğümlerinizi izole edilmiş çok küçük süreçler etrafında tasarlıyorsunuz. İsterseniz onlara nanoservices deyin!

Sadece bu değil, aynı zamanda uygulamalar halinde paketlenirler ve onları birim olarak başlatılıp durdurulabilen varlıklar olarak gruplandırırlar. A, B ve C uygulamalarınız varsa ve bunları [A, B] + [C] veya [A] + [B] + [C] olarak dağıtmak istiyorsanız, bunu yapmakta çok az sorun yaşarsınız doğal tasarımlarına. Veya daha da iyisi, mikro hizmet dağıtımlarının karmaşıklığını sisteminize önceden eklemekten kaçınmak istiyorsanız, bunları aynı düğümde tamamen dağıtabilirsiniz.

Ve günün sonunda, bunların hepsini Erlang Dağıtılmış Protokolü kullanarak çalıştırıyorsanız, bunları farklı düğümlerde çalıştırabilirsiniz ve {:node@network, :name}yerine ile onlara atıfta bulunduğunuz sürece diğerlerine erişebilirler :name.

Daha ileri gidebilirim ama umarım sizi bu noktada ikna etmişimdir. :)


Aslında Elixir ve OTP'yi çok seviyorum, soru daha çok Elixir'i kullanırken mikro hizmetlerden (dev-prod paritesi, kanarya sürümleri gibi) bazı faydaların nasıl elde edileceğiyle ilgiliydi.
Papipo

Docker hakkında bir paragrafım vardı ama kayboldu. :) Buradaki ana nokta, onu düğüm dağıtımı için kullanmanızdır, böylece düğüm başına hangi uygulamaların anlamlı olacağını seçersiniz. Mavi / yeşil dağıtımlar kesinlikle başarılabilir ancak protokole, duruma ve diğer faktörlere bağlıdır.
José Valim

5
Bahsettiğim konuşma, mavi / yeşil veya kanarya için kullanılabilecek bir yönlendirme katmanını kapsar. Yine, tercih edilen protokole bağlıdır, ancak dağıtılmış Erlang'daki global bir girişten, konsül kullanan bir şeyden veya HTTP tabanlı bir şey için haproxy'den gidebilirsiniz.
José Valim

Hizmet keşfi yaklaşımı mantıklı. Sanırım her zaman yük dengeleme terimlerini düşünüyordum.
Papipo

1
Belirli bir görev için en iyi dili seçmek gibi mikro hizmetlerin diğer faydalarından biri ne olacak? İksiri seviyorum, ancak her görev için en iyi dil değil. Demek istediğim, belirli bir mikro hizmetin iksir yerine farklı bir dil kullanması gerekebilir. O halde hala geleneksel bir mikro servis mimarisini takip etmeli mi?
Jeancarlo
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.