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).
Jawaban:
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:
Dampak dari desain ini sangat besar. Artinya, pengembang Elixir, saat menulis aplikasi, memiliki pendekatan yang lebih eksplisit untuk:
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. :)
sumber