Tujuan sistem
Dukungan untuk akses jarak jauh ke file pada komputer di jaringan. Sistem "secara virtual" mendukung semua operasi file dasar (pembuatan, penghapusan, membaca, menulis, dll.) Dengan bertukar transaksi (pesan) menggunakan protokol TCP.
Area aplikasi
Fungsionalitas sistem efektif dalam kasus-kasus berikut:
- dalam aplikasi asli untuk perangkat seluler dan tertanam (smartphone, sistem kontrol terpasang, dll.) yang memerlukan akses cepat ke file di server jarak jauh dalam kondisi gangguan sementara yang mungkin terjadi dalam koneksi (dengan offline);
- dalam DBMS yang dimuat, jika permintaan diproses pada beberapa server dan penyimpanan data pada yang lain;
- dalam jaringan korporat terdistribusi untuk pengumpulan dan pemrosesan informasi yang membutuhkan pertukaran data berkecepatan tinggi, redundansi, dan keandalan;
- dalam sistem yang kompleks dengan arsitektur microservice, di mana keterlambatan pertukaran informasi antar modul sangat penting.
Struktur
Sistem Cage (ada implementasi - versi beta pada Python 3.7 di Windows OS) mencakup dua bagian utama:
- Cageserver - program server file (paket fungsi) yang berjalan pada komputer di jaringan yang membutuhkan akses jarak jauh ke file;
- Kelas kandang dengan pustaka metode untuk perangkat lunak klien yang menyederhanakan pengkodean interaksi server.
Menggunakan sistem di sisi klien
Metode kelas Cage menggantikan operasi sistem file "rutin" yang biasa: membuat, membuka, menutup, menghapus file, dan juga membaca / menulis data dalam format biner (menunjukkan posisi dan ukuran data). Secara konseptual, metode ini dekat dengan fungsi file dari bahasa C, di mana pembukaan / penutupan file dilakukan "pada saluran" dari input-output.
Dengan kata lain, pemrogram tidak bekerja dengan metode objek "file" (class _io dengan Python), tetapi dengan metode kelas Cage.
Saat membuat instance objek Cage, ia membuat koneksi awal dengan server (atau beberapa server), melewati otorisasi oleh Id klien, dan menerima konfirmasi dengan nomor port khusus untuk semua operasi file. Ketika objek Cage dihapus, ia memerintahkan server untuk mengakhiri koneksi dan menutup file. Pengakhiran komunikasi dapat memulai server sendiri.
Sistem meningkatkan kinerja baca / tulis berdasarkan buffering file yang sering digunakan dari program klien dalam cache (buffer) RAM.
Perangkat lunak klien dapat menggunakan sejumlah objek Cage dengan berbagai pengaturan (jumlah memori buffer, ukuran blok saat bertukar dengan server, dll.).
Objek Cage tunggal dapat bertukar data dengan banyak file di beberapa server. Parameter komunikasi (alamat IP atau server DNS, port utama untuk otorisasi, jalur dan nama file) ditetapkan saat membuat objek.
Karena setiap objek Cage dapat bekerja dengan banyak file pada saat yang bersamaan, ruang memori bersama digunakan untuk buffering. Ukuran Cache - jumlah halaman dan ukurannya, diatur secara dinamis saat membuat objek Cage. Misalnya, cache 1 GB berarti 1.000 halaman masing-masing 1 MB, atau 10 ribu halaman masing-masing 100 KB, atau 1 juta halaman masing-masing 1 KB. Pilihan ukuran halaman dan jumlah halaman adalah tugas khusus untuk setiap aplikasi.
Anda dapat menggunakan beberapa objek Cage secara bersamaan untuk menentukan pengaturan memori buffer yang berbeda tergantung pada fitur akses ke informasi dalam file yang berbeda. Sebagai dasar, algoritma buffering paling sederhana digunakan: setelah jumlah memori yang ditentukan telah habis, halaman-halaman baru mengeluarkan halaman-halaman lama dengan prinsip pensiun dengan jumlah hit minimum. Buffering sangat efektif dalam kasus berbagi yang tidak merata (dalam arti statistik), pertama, ke file yang berbeda, dan kedua, untuk fragmen dari setiap file.
Kelas Cage mendukung input / output tidak hanya pada alamat data (menunjukkan posisi dan panjang array, "menggantikan" operasi sistem file), tetapi juga pada level yang lebih rendah, "fisik" - dengan nomor halaman dalam memori buffer.
Untuk objek Cage, fungsi asli "hibernasi" ("tidur") didukung - mereka dapat "diminimalkan" (misalnya, jika terputus dari server, atau ketika aplikasi dihentikan, dll.) Ke file dump lokal di sisi klien dan dengan cepat pulihkan dari file ini (setelah melanjutkan komunikasi, ketika Anda me-restart aplikasi). Ini memungkinkan untuk secara signifikan mengurangi lalu lintas ketika mengaktifkan program klien setelah "luring" sementara, karena fragmen file yang sering digunakan sudah ada dalam cache.
Kandang adalah sekitar 3.600 baris kode.
Prinsip membangun server
Server file Cageserver dapat diluncurkan dengan jumlah port yang sewenang-wenang, salah satunya ("utama") hanya digunakan untuk otorisasi semua klien, sisanya untuk pertukaran data. Program server Cage hanya membutuhkan Python. Secara paralel, komputer dengan server file dapat melakukan pekerjaan lain.
Server dimulai pada awalnya sebagai kombinasi dari dua proses utama:
- "Koneksi" - proses untuk melakukan operasi membangun komunikasi dengan klien dan penghentiannya atas inisiatif server;
- "Operasi" - suatu proses untuk menyelesaikan tugas (operasi) klien untuk bekerja dengan file, serta untuk menutup sesi komunikasi pada perintah klien.
Kedua proses tidak disinkronkan dan diatur sebagai siklus tak berujung untuk menerima dan mengirim pesan berdasarkan multi-proses antrian, objek proxy, kunci dan soket.
Proses "Koneksi" menyediakan setiap klien dengan port untuk menerima dan mengirimkan data. Jumlah port diatur ketika server mulai. Korespondensi antara port dan klien disimpan dalam memori proxy yang dibagikan antara proses.
Proses "Operasi" mendukung pemisahan sumber daya file, dan beberapa klien yang berbeda dapat membaca data dari satu file bersama-sama ( kuasi-paralel , karena akses dikendalikan oleh kunci), jika ini dibolehkan ketika pertama kali dibuka oleh klien "pertama".
Pemrosesan perintah untuk membuat / menghapus / membuka / menutup file di server dilakukan dalam proses "Operasi" secara ketat secara berurutan menggunakan subsistem file dari OS server.
Untuk akselerasi baca / tulis umum, operasi ini dilakukan dalam utas yang dihasilkan oleh proses "Operasi". Jumlah utas biasanya sama dengan jumlah file yang terbuka. Tugas baca / tulis dari klien dikirim ke antrian umum dan utas yang dibebaskan pertama kali mengambil tugas itu dari kepalanya. Logika khusus menghilangkan data yang menimpa dalam RAM server.
Proses "Operasi" memantau aktivitas pelanggan dan menghentikan layanan mereka dengan perintah mereka dan ketika batas waktu tidak aktif terlampaui.
Untuk memastikan keandalan, Cageserver mencatat semua transaksi. Satu jurnal umum berisi salinan pesan dari klien dengan tugas untuk membuat / membuka / mengganti nama / menghapus file. Log terpisah dibuat untuk setiap file kerja, di mana salinan pesan ditulis dengan tugas untuk membaca dan menulis data dalam file kerja ini, serta array dari data yang direkam (baru) dan array data yang dihancurkan saat menimpa (menulis data baru "lebih") )
Log ini memberikan peluang untuk memulihkan perubahan baru dalam cadangan, serta untuk "memutar kembali" dari konten saat ini ke saat yang tepat di masa lalu.
Cageserver adalah sekitar 3.100 baris kode.

Memulai program server file Cageserver
Saat memulai dialog, Anda perlu menentukan:
- port utama untuk otorisasi;
- jumlah port untuk bertukar transaksi dengan klien yang berwenang (dari 1 atau lebih, kumpulan angka dimulai dengan yang berikutnya mengikuti nomor port utama).
Menggunakan Kelas Kandang
kandang kelas . Cage ( cage_name = "", pagesize = 0, numpages = 0, maxstrlen = 0, server_ip = {}, tunggu = 0, bangun = Salah, cache_file = "" )
Dari kelas ini, objek dibuat yang berinteraksi dengan server file dan berisi memori buffer.
Parameter
- cage_name ( str ) - nama kondisional dari objek yang digunakan untuk mengidentifikasi klien di sisi server
- pagesize ( int ) - ukuran satu halaman memori buffer (dalam byte)
- numpages ( int ) - jumlah halaman memori buffer
- maxstrlen ( int ) - panjang string byte maksimum dalam operasi tulis dan baca
- server_ip ( dict ) - kamus dengan alamat server yang digunakan, di mana kuncinya adalah nama kondisional dari server (server id di dalam aplikasi), dan nilainya adalah string dengan alamat: "ip address: port" atau "DNS: port" (pencocokan nama dan alamat asli adalah sementara , itu bisa diubah)
- wait ( int ) - waktu untuk menunggu respons dari server saat menerima port (dalam detik)
- awake ( boolean ) - flag metode membuat objek ( False - jika objek baru dibuat, True - jika objek dibuat dari yang sebelumnya "diperkecil" - menggunakan operasi "hibernasi", secara default False)
- cache_file ( str ) - nama file untuk hibernasi
Metode
Kandang. file_create ( server, path ) - buat file baru
Kandang. file_rename ( server, path, new_name ) - ganti nama file
Kandang. file_remove ( server, path ) - hapus file
Kandang. buka ( server, jalur, mod ) - buka file
Mengembalikan nomor saluran fchannel . Parameter mod adalah mode buka file: "wm" bersifat eksklusif (baca / tulis), "rs" adalah read-only, dan hanya dibagikan oleh klien lain, "ws" adalah read / write, dan dibagikan hanya oleh klien lain.
Kandang. close ( fchannel ) - tutup file
Kandang. tulis ( fchannel, begin, data ) - tulis string byte ke file
Kandang. baca ( fchannel, begin, len_data ) - baca string byte dari file
Kandang. put_pages ( fchannel ) - "pushes" dari buffer ke server semua halaman saluran yang ditentukan yang telah dimodifikasi. Ini digunakan pada titik-titik dalam algoritma ketika Anda perlu memastikan bahwa semua operasi pada saluran secara fisik disimpan dalam file di server.
Kandang. push_all () - βpushesβ dari buffer ke server semua halaman dari semua saluran untuk instance kelas Cage yang telah dimodifikasi. Ini digunakan ketika Anda perlu memastikan bahwa semua operasi di semua saluran disimpan di server.