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:
- ünite olarak başlatılır ve durdurulur. Sisteminizi başlatmak ve durdurmak, içindeki tüm uygulamaları başlatmak meselesidir
- 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
- 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:
- kodlarının nasıl başlatılıp durdurulduğu
- bir uygulamanın parçası olan süreçler nelerdir ve bu nedenle uygulama durumu nedir
- 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:
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. :)