Menurut saya sepertinya Anda memiliki beberapa teknologi campuran di sini:
komunikasi (yang pada dasarnya Anda andalkan 100% andal ... yang bisa berakibat fatal)
mengunci / saling pengecualian
batas waktu (untuk tujuan apa)?
Kata peringatan: Timeout dalam sistem terdistribusi dapat penuh dengan bahaya dan kesulitan. Jika digunakan, mereka harus diatur dan digunakan dengan sangat hati-hati karena penggunaan timeout yang tidak membeda-bedakan tidak memperbaiki masalah, itu hanya akan mengalahkan malapetaka. (Jika Anda ingin melihat bagaimana timeout harus digunakan, baca dan pahami dokumentasi protokol komunikasi HDLC. Ini adalah contoh yang baik dari penggunaan yang cocok dan cerdas, dikombinasikan dengan sistem pengkodean bit yang pintar untuk memungkinkan deteksi hal-hal seperti jalur IDLE) .
Untuk beberapa waktu saya bekerja di sistem terdistribusi multi-prosesor yang terhubung menggunakan tautan komunikasi (bukan TCP, sesuatu yang lain). Salah satu hal yang saya pelajari adalah bahwa sebagai generalisasi kasar, ada beberapa tempat multi-pemrograman yang berbahaya untuk dikunjungi:
mengandalkan antrian biasanya berakhir dengan air mata (jika antrian mengisi, Anda dalam kesulitan. KECUALI Anda dapat menghitung ukuran antrian yang tidak akan pernah terisi, dalam hal ini Anda mungkin dapat menggunakan solusi no-antrian)
mengandalkan penguncian itu menyakitkan, coba dan pikirkan jika ada cara lain (jika Anda harus menggunakan penguncian, lihat literatur, penguncian terdistribusi multi-prosesor telah menjadi subjek banyak makalah acedemik selama 2-3 dekade terakhir)
Saya Anda harus melanjutkan menggunakan penguncian, kemudian:
Saya akan berasumsi bahwa Anda akan menggunakan batas waktu hanya sebagai alat pemulihan pilihan terakhir - yaitu untuk mendeteksi kegagalan sistem komunikasi yang mendasarinya. Saya selanjutnya akan berasumsi bahwa sistem komunikasi TCP / IP Anda adalah bandwidth tinggi dan dapat dianggap sebagai latensi rendah (idealnya nol, tetapi ini tidak pernah terjadi).
Apa yang saya sarankan adalah bahwa setiap node memiliki daftar konektivitas dari node lain yang dapat terhubung. (Node tidak akan peduli dari mana koneksi berasal.) Populasi dari tabel yang node dapat terhubung ke node dibiarkan sebagai hal yang terpisah untuk memilah, Anda belum mengatakan apakah itu akan diatur secara statis atau sebaliknya. Juga mudah diabaikan adalah hal-hal seperti alokasi nomor port IP di mana koneksi akan masuk ke sebuah simpul - mungkin ada alasan bagus untuk menerima permintaan hanya pada satu port, atau pada beberapa port. Ini perlu dipertimbangkan dengan cermat. Faktor-faktor akan mencakup antrian tersirat, pemesanan, penggunaan sumber daya, jenis dan kemampuan sistem operasi.
Setelah node tahu dengan siapa mereka terhubung, mereka dapat mengirim permintaan kunci ke simpul itu, dan harus menerima kembali dari balasan kunci dari simpul jarak jauh itu. Anda dapat mengemas kedua operasi tersebut menjadi pembungkus agar terlihat atom. Efek dari ini adalah bahwa node yang ingin memperoleh kunci akan membuat panggilan seperti:
if (get_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
/* Lock is now acquired - do work here */
if (release_lock(remote_node) == timeout) then
{
take some failure action - the comms network is down
}
panggilan get_lock dan release_lock harus seperti (pada prinsipnya):
send_to_remote_node(lock_request)
get_from_remote_node_or_timeout(lock_reply, time)
if (result was timeout) then
return timeout
else
return ok
Anda harus sangat berhati-hati dengan sistem penguncian terdistribusi yang unit kerjanya dilakukan saat kunci dipegang kecil dan cepat karena Anda akan memiliki banyak node jarak jauh yang berpotensi menunggu untuk mendapatkan kunci. Ini secara efektif merupakan sistem multiprosesor / komunikasi stop-and-wait yang kuat tetapi tidak memiliki kinerja setinggi mungkin.
Saran adalah mengambil pendekatan yang sama sekali berbeda. Bisakah Anda menggunakan panggilan prosedur jarak jauh di mana setiap panggilan RPC membawa paket informasi yang dapat ditangani oleh penerima, dan yang menghilangkan kebutuhan untuk kunci?
Saat membaca kembali pertanyaannya, sepertinya Anda tidak benar-benar ingin peduli dengan sisi komunikasi berbagai hal, Anda hanya ingin menyelesaikan masalah penguncian Anda.
Karena itu, jawaban saya mungkin tampak agak di luar topik, namun saya yakin Anda tidak dapat menyelesaikan masalah penguncian Anda tanpa membuat bagian di bawahnya juga benar. Analogi: Membangun rumah di atas fondasi yang buruk menyebabkannya jatuh ... Akhirnya.