Di mana Elixir / erlang cocok dengan pendekatan layanan mikro? [Tutup]

109

Akhir-akhir ini saya telah melakukan beberapa eksperimen dengan docker compose untuk menerapkan beberapa layanan mikro yang berkolaborasi. Saya bisa melihat banyak manfaat yang diberikan layanan mikro, dan sekarang ada perangkat yang bagus untuk mengelolanya, saya pikir tidak terlalu sulit untuk terjun ke gerobak layanan mikro.

Tapi, saya telah bereksperimen dengan Elixir juga, dan saya sangat menyukai manfaat yang diberikan dengan sendirinya. Mengingat bahwa itu mendorong pengemasan kode Anda ke dalam beberapa aplikasi yang dipisahkan, dan mendukung peningkatan kode panas, bagaimana Anda akan mencampur buruh pelabuhan dengan elixir (atau erlang, dalam hal ini)?

Misalnya, jika saya ingin menggunakan buruh pelabuhan karena menyediakan paritas dev-prod, bagaimana elixir cocok dengan itu? Mengingat bahwa kontainer buruh pelabuhan tidak dapat diubah, saya kehilangan kemampuan untuk melakukan peningkatan kode panas, bukan? Bagaimana dengan penyebaran biru / hijau atau rilis kenari?

Maksud saya, saya bisa menulis layanan mikro dengan Elixir dan menggunakannya seolah-olah ditulis dalam bahasa lain, poliglotisme adalah salah satu manfaat dari layanan mikro, tetapi kemudian saya tidak mendapatkan manfaat penuh dari penggunaan platform OTP, saya tebak bahwa aplikasi erlang kolaboratif murni jauh lebih optimal daripada menggunakan antrian perantara untuk berkomunikasi antara layanan mikro yang ditulis dalam bahasa yang berbeda (atau tidak).

Papipo
sumber
7
Saya melihat bahwa downvote tersebut karena pertanyaan "tidak menunjukkan adanya upaya penelitian". Itu menyedihkan karena itu tidak benar, tentu saja masalahnya mungkin pada pertanyaan itu sendiri, tetapi saya tidak dapat dituduh tidak meneliti karena akhir-akhir ini satu-satunya hal yang saya lakukan. Banyak.
Papipo
1
Pertanyaan ini terlalu luas - pertanyaan tentang stackoverflow dimaksudkan untuk menyertakan masalah tertentu.
Paweł Obrok
4
haruskah saya memindahkannya ke situs stackexchange lain? Karena pertanyaannya adalah IMO yang sah.
Papipo
2
Saya pikir ini pertanyaan yang menarik, tetapi mungkin termasuk dalam stackexchange programmer? Yang sedang berkata, tidak memberikan suara untuk menutup
George Mauer
1
Ini luar biasa, dan benar-benar dibuat untuk pekerjaan itu.
perburuan Bryan

Jawaban:

138

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:

  1. dimulai dan dihentikan sebagai unit. Memulai dan menghentikan sistem Anda adalah masalah memulai semua aplikasi di dalamnya
  2. 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
  3. 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:

  1. bagaimana kode mereka dimulai dan dihentikan
  2. apa proses yang menjadi bagian dari aplikasi dan apa status aplikasinya
  3. 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:

Pengamat berjalan dengan 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. :)

José Valim
sumber
Sebenarnya saya sangat menyukai Elixir dan OTP, pertanyaannya lebih banyak tentang bagaimana mendapatkan beberapa manfaat dari layanan mikro (seperti paritas dev-prod, rilis kenari, dll) saat menggunakan Elixir.
Papipo
Saya memiliki paragraf tentang Docker tetapi paragraf itu hilang. :) Intinya adalah Anda menggunakannya untuk penyebaran node sehingga Anda memilih aplikasi mana yang masuk akal untuk setiap node. Penerapan biru / hijau pasti dapat dicapai tetapi tergantung pada protokol, jenis status, dan faktor lainnya.
José Valim
5
Pembicaraan yang saya sebutkan mencakup lapisan perutean yang dapat digunakan untuk biru / hijau atau kenari. Sekali lagi, itu tergantung pada protokol pilihan, tetapi Anda dapat beralih dari entri global dalam Erlang terdistribusi, sesuatu yang menggunakan konsul, atau haproxy untuk sesuatu yang berbasis HTTP.
José Valim
Pendekatan penemuan layanan masuk akal. Saya rasa saya selalu memikirkan istilah load balancing.
Papipo
1
Bagaimana dengan salah satu manfaat lain dari layanan mikro seperti memilih bahasa terbaik untuk tugas tertentu. Saya suka obat mujarab, namun itu bukan bahasa terbaik untuk setiap tugas. Yang saya maksud adalah seseorang mungkin perlu layanan mikro tertentu untuk menggunakan bahasa yang berbeda, bukan elixir. Haruskah tetap mengikuti arsitektur layanan mikro tradisional?
Jeancarlo