Ini adalah pertanyaan yang sangat terbuka tetapi saya akan mencoba menggambarkan mengapa Elixir / Erlang mungkin menjadi platform terbaik di luar sana untuk mengembangkan sistem terdistribusi (terlepas dari apakah Anda bekerja dengan layanan mikro).
Pertama, mari kita mulai dengan beberapa latar belakang. VM Erlang dan pustaka standarnya dirancang di muka untuk membangun sistem terdistribusi dan ini benar-benar muncul. Sejauh yang saya tahu, ini adalah satu-satunya runtime dan VM yang digunakan secara luas dalam produksi yang dirancang di muka untuk kasus penggunaan ini.
Aplikasi
Misalnya, Anda telah mengisyaratkan "aplikasi". Di Erlang / Elixir, kode dikemas di dalam aplikasi yang:
- dimulai dan dihentikan sebagai unit. Memulai dan menghentikan sistem Anda adalah masalah memulai semua aplikasi di dalamnya
- menyediakan struktur direktori dan API konfigurasi terpadu (yang bukan XML!). Jika Anda telah bekerja dengan dan mengkonfigurasi aplikasi OTP, Anda tahu bagaimana bekerja dengan yang lain
- berisi pohon pengawasan aplikasi Anda, dengan semua proses (yang saya maksud dengan proses adalah "proses VM" yang merupakan utas komputasi ringan) dan statusnya
Dampak dari desain ini sangat besar. Artinya, pengembang Elixir, saat menulis aplikasi, memiliki pendekatan yang lebih eksplisit untuk:
- bagaimana kode mereka dimulai dan dihentikan
- apa proses yang menjadi bagian dari aplikasi dan apa status aplikasinya
- bagaimana proses tersebut akan bereaksi dan terpengaruh jika terjadi crash atau ketika terjadi kesalahan
Tidak hanya itu, perkakas seputar abstraksi ini sangat bagus. Jika Anda memiliki Elixir terinstal, membuka "IEX" dan ketik: :observer.start()
. Selain menampilkan informasi dan grafik tentang sistem langsung Anda, Anda dapat menghentikan proses acak, melihat penggunaan memori, status, dan lainnya. Berikut adalah contoh menjalankan ini di aplikasi Phoenix:
Perbedaannya di sini adalah bahwa Aplikasi dan Proses memberi Anda abstraksi tentang kode Anda dalam produksi . Banyak bahasa menyediakan paket, objek, dan modul terutama untuk organisasi kode tanpa refleksi pada sistem runtime. Jika Anda memiliki atribut kelas atau objek tunggal: bagaimana Anda bisa bernalar tentang entitas yang dapat memanipulasinya? Jika Anda mengalami kebocoran memori atau hambatan, bagaimana Anda dapat menemukan entitas yang bertanggung jawab untuk itu?
Jika Anda bertanya kepada siapa pun yang menjalankan sistem terdistribusi, itulah jenis wawasan yang mereka inginkan, dan dengan Erlang / Elixir Anda memilikinya sebagai blok bangunan.
Komunikasi
Semua ini sebenarnya hanyalah permulaan. Saat membangun sistem terdistribusi, Anda perlu memilih protokol komunikasi dan serializer data. Banyak orang memilih HTTP dan JSON yang, jika dipikir-pikir, merupakan kombinasi yang sangat bertele-tele dan mahal untuk melakukan panggilan RPC yang sebenarnya.
Dengan Erlang / Elixir, Anda sudah memiliki protokol komunikasi dan mekanisme serialisasi di luar kotak. Jika Anda ingin dua mesin berkomunikasi satu sama lain, Anda hanya perlu memberi mereka nama, memastikan mereka memiliki rahasia yang sama, dan Anda selesai.
Jamie membicarakan hal ini di Erlang Factory 2015 dan bagaimana mereka dapat memanfaatkannya untuk membangun platform game: https://www.youtube.com/watch?v=_i6n-eWiVn4
Jika Anda ingin menggunakan HTTP dan JSON, itu juga bagus dan pustaka seperti Plug dan kerangka kerja seperti Phoenix akan menjamin Anda juga produktif di sini.
Layanan mikro
Sejauh ini saya belum berbicara tentang layanan mikro. Itu karena, sampai saat ini, mereka tidak terlalu penting. Anda sudah mendesain sistem dan node di sekitar proses yang sangat kecil yang terisolasi. Sebut mereka layanan nano jika Anda mau!
Tidak hanya itu, mereka juga dikemas ke dalam aplikasi, yang mengelompokkan mereka sebagai entitas yang dapat dimulai dan dihentikan sebagai unit. Jika Anda memiliki aplikasi A, B dan C, dan kemudian Anda ingin menerapkannya sebagai [A, B] + [C] atau [A] + [B] + [C], Anda tidak akan kesulitan melakukannya karena untuk desain bawaan mereka. Atau, lebih baik lagi, jika Anda ingin menghindari penambahan kerumitan penerapan layanan mikro ke sistem Anda di awal, Anda dapat menerapkannya secara bersamaan di node yang sama.
Dan, pada akhirnya, jika Anda menjalankan semua ini menggunakan Erlang Distributed Protocol, Anda dapat menjalankannya di node yang berbeda dan mereka akan dapat menjangkau yang lain selama Anda merujuknya {:node@network, :name}
alih-alih :name
.
Saya bisa melangkah lebih jauh tetapi saya harap saya telah meyakinkan Anda saat ini. :)