Topik ini menuntaskan dua cara menjalankan pekerjaan di node lain, yaitu spawn/4 jarak jauh dan modul rpc, beserta sifat transparansi lokasi yang membuat pesan lintas node tidak terasa berbeda dari pesan lokal. Semua contoh memakai pasangan node dari topik node dan cookie.
Spawn di node lain#
Bentuk spawn/4 menerima nama node sebagai argumen pertama dan membuat proses di sana, bukan di node pemanggil. Contoh berikut dijalankan dari node a terhadap node b yang hidup di latar belakang:
# mulai node b, lalu spawn dari node a
erl -sname b -noshell -setcookie kunci_rahasia -eval 'receive after 15000 -> ok end'
erl -sname a -noshell -setcookie kunci_rahasia -eval "net_adm:ping('b@host'), spawn('b@host', fun() -> io:format(\"kode ini berjalan di node ~p~n\", [node()]) end), timer:sleep(300), init:stop()."kode ini berjalan di node 'b@c-6ae9b560-14127d0f-ff7b7b884eca'Fungsi yang dieksekusi mencetak nilai node/0 dari tempat ia berjalan, dan keluarannya menunjukkan node b. Kode yang dipanggil harus tersedia di node tujuan, karena proses jarak jauh memuat modul dari node tempat ia berjalan. Kelalaian paling umum adalah memanggil modul yang hanya ada di node pemanggil, dan gejalanya adalah error modul tidak ditemukan di log node tujuan. Kesalahan lain yang sering mengejutkan adalah mengirim pesan ke atom nama node: atom bukan alamat proses, sehingga 'a@host' ! Pesan memicu error badarg di proses pengirim, sedangkan PID yang sesungguhnya, diperoleh dari self() atau pendaftaran nama, tetap sah sebagai tujuan lintas node.
Modul rpc#
Untuk memanggil fungsi dan menunggu hasilnya, modul rpc menyediakan bentuk yang lebih siap pakai daripada spawn plus pertukaran pesan manual:
1> net_adm:ping('b@c-6ae9b560-14127d0f-ff7b7b884eca').
pong
2> rpc:call('b@c-6ae9b560-14127d0f-ff7b7b884eca', erlang, node, []).
'b@c-6ae9b560-14127d0f-ff7b7b884eca'rpc:call/4 menerima node, modul, fungsi, dan argumen, lalu mengembalikan nilai kembaliannya atau tuple error bila node tidak terjangkau. Di atasnya tersedia rpc:multicall/5 yang memanggil banyak node sekaligus dalam satu kembalian, dan rpc:cast/4 untuk versi sekali kirim tanpa menunggu. Karena panggilan itu juga bisa gagal, kode pemanggil yang hati-hati membedakan nilai kembalian normal dari {badrpc, Alasan}, dan bentuk bawaan batas waktunya mencegah pemanggil menggantung pada node yang mati di tengah jalan.
Transparansi lokasi#
Sifat yang menyatukan seluruh topik ini adalah transparansi lokasi: PID tetap sah sebagai tujuan pengiriman pesan berapa pun node asalnya, link/1 dan monitor/2 bekerja lintas node dengan semantik yang sama, dan pendaftaran nama dengan register/2 tetap berlaku per node. Program yang berbicara dengan PID tidak perlu tahu di mana prosesnya hidup, dan inilah yang membuat pohon supervisi dapat disebar tanpa mengubah protokolnya. Sisi yang tidak transparan perlu diingat juga: state tidak dibagikan, sehingga dua node yang terhubung tidak otomatis berbagi tabel ETS, dan nama terdaftar bersifat lokal per node, kecuali layanan global menyediakan nama yang berlaku lintas klaster dengan biaya koordinasinya sendiri.
multicall dan bentuk kegagalan badrpc#
Pemanggilan lintas node dapat gagal karena dua keluarga alasan: fungsi tujuan gagal, atau jaringannya yang mati. Kedua keluarga itu dipisahkan secara eksplisit: kegagalan di dalam fungsi tiba sebagai nilai kembaliannya, sedangkan ketidakmampuan mencapai node tiba sebagai {badrpc, Alasan}. Percobaan terhadap node yang tidak ada memperlihatkannya:
1> rpc:call('x@tak_ada', erlang, node, []).
{badrpc,nodedown}Untuk memanggil banyak node sekaligus, rpc:multicall/5 mengembalikan pasangan daftar hasil dan daftar node yang gagal dijangkau, sehingga satu panggilan melayani seluruh klaster tanpa loop manual. Kebiasaan pemakaiannya konsisten: bedakan nilai normal dan badrpc sejak pencocokan pola pertama, tetapkan batas waktu yang sesuai sifat pekerjaannya, dan jangan menelan badrpc sebagai nilai kosong karena itu menutupi pemutusan jaringan yang seharusnya naik laporan.
Kebiasaan yang menjaga kode distribusi tetap sehat berangkat dari dua syarat yang sudah terlihat di atas. Pertama, pastikan modul yang dipanggil jarak jauh tersedia di node tujuan sebelum spawn, karena error modul tidak ditemukan muncul di log node tujuan, bukan di pemanggil, dan pemanggil yang tidak membaca log akan mengira pekerjaan berjalan. Kedua, perlakukan batas waktu rpc sebagai bagian protokol, bukan detail. Pemanggilan yang tidak pernah selesai pada node yang sibuk menggantung pemanggil tanpa jejak bila tanpa batas waktu. Dengan keduanya, spawn jarak jauh dan rpc berubah dari fitur yang penuh kejutan menjadi alat yang perilakunya dapat diprediksi.
Ringkasan#
- spawn/4 membuat proses di node lain, dengan syarat modulnya tersedia di node tujuan.
- Atom nama node bukan alamat proses, dan pengiriman ke atom itu memicu error badarg, sedangkan PID dan nama terdaftar sah sebagai tujuan.
- rpc:call/4 memanggil fungsi lintas node dan mengembalikan hasilnya atau {badrpc, Alasan}, dengan multicall dan cast sebagai varianya.
- PID, link, dan monitor bekerja lintas node tanpa perubahan protokol, sementara state, tabel ETS, dan nama terdaftar tetap lokal per node.
Referensi#
- Distributed Erlang User Guide — Ericsson — Panduan resmi spawn jarak jauh dan transparansi lokasi.
- rpc — Ericsson — Dokumentasi resmi call, multicall, dan cast beserta bentuk errornya.
- Learn You Some Erlang for Great Good! — Fred Hebert — Bab yang memperlihatkan spawn jarak jauh dan rpc dengan contoh.