Storacle - penyimpanan file terdesentralisasi

Storacle - penyimpanan file terdesentralisasi

Sebelum saya mulai, saya harus pergi tautan ke artikel sebelumnyaagar jelas apa sebenarnya yang sedang kita bicarakan.

Pada artikel ini saya ingin melihat lapisan yang bertanggung jawab untuk menyimpan file, dan bagaimana lapisan tersebut dapat digunakan oleh siapa saja. Storacle adalah perpustakaan mandiri, tidak ada hubungan langsung dengan musik. Anda dapat mengatur penyimpanan file apa pun.

Pada artikel sebelumnya, saya β€œmenggulung larasnya” sedikit ipfs, tapi ini terjadi justru dalam konteks masalah yang saya pecahkan. Secara keseluruhan, menurut saya proyek ini keren. Saya hanya lebih menyukai kemampuan membuat jaringan berbeda untuk tugas berbeda. Hal ini memungkinkan Anda untuk mengatur struktur dengan lebih baik dan mengurangi beban pada masing-masing node dan jaringan secara keseluruhan. Bahkan dalam kerangka satu proyek, jika perlu, Anda dapat membagi jaringan menjadi beberapa bagian sesuai dengan kriteria tertentu, sehingga mengurangi beban keseluruhan.

Jadi storakel menggunakan mekanisme tersebut menyebar untuk mengatur jaringan. Fitur Utama:

  • File dapat ditambahkan ke repositori melalui node mana pun.
  • File disimpan seluruhnya, bukan dalam blok.
  • Setiap file memiliki hash konten uniknya sendiri untuk dikerjakan lebih lanjut.
  • File dapat diduplikasi untuk keandalan yang lebih baik
  • Jumlah file dalam satu node hanya dibatasi oleh sistem file (ada pengecualian, lebih lanjut tentang itu di bawah)
  • Jumlah file dalam jaringan dibatasi oleh kemampuan penyebarannya sesuai dengan jumlah node yang valid dalam jaringan, yang pada versi kedua akan dapat bekerja dengan jumlah node yang tidak terbatas (lebih lanjut tentang ini di artikel lain)

Contoh sederhana cara kerjanya dari program:

Server:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Pelanggan:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Tampilan dalam

Tidak ada yang mewah di balik tenda. Informasi tentang jumlah file, ukuran totalnya, dan poin lainnya disimpan dalam database di dalam memori dan diperbarui ketika file dihapus dan ditambahkan, sehingga tidak perlu sering mengakses sistem file. Pengecualian adalah mengaktifkan pengumpul sampah ketika Anda perlu mengedarkan file ketika ukuran penyimpanan tertentu tercapai, dan tidak melarang penambahan yang baru. Dalam hal ini, Anda harus melewati penyimpanan, dan bekerja dengan sejumlah besar file (>katakanlah satu juta) dapat menyebabkan beban yang signifikan. Dan lebih baik menyimpan lebih sedikit file dan menjalankan lebih banyak node. Jika "pembersih" dinonaktifkan, maka tidak ada masalah seperti itu.

Penyimpanan file terdiri dari 256 folder dan 2 level nesting. File disimpan di folder tingkat kedua. Artinya kalau ada 1 juta. Akan ada sekitar 62500 file di setiap folder tersebut (1000000 / sqrt(256)).

Nama folder dibentuk dari hash file sehingga Anda dapat mengaksesnya dengan cepat jika Anda mengetahui hashnya.

Struktur ini dipilih berdasarkan sejumlah besar kebutuhan penyimpanan yang berbeda: dukungan untuk sistem file yang lemah, di mana tidak diinginkan untuk memiliki banyak file dalam satu folder, penelusuran cepat semua folder jika perlu, dll. Semacam cara emas.

caching

Saat menambahkan file, serta saat menerimanya, tautan ke file ditulis ke cache.
Berkat ini, seringkali tidak perlu melintasi seluruh jaringan untuk mencari file. Ini mempercepat penerimaan tautan dan mengurangi beban pada jaringan. Caching juga terjadi melalui header http.

Isomorfi

Klien ditulis dalam javascript dan bersifat isomorfik, dapat digunakan langsung dari browser. 
Anda dapat mengunggah file tersebut https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js sebagai skrip dan akses jendela.ClientStoracle atau mengimpor melalui sistem build, dll.

Tautan yang ditangguhkan

Fitur yang menarik juga adalah β€œreferensi yang ditangguhkan”. Ini adalah tautan ke file yang dapat diperoleh secara sinkron, di sini dan saat ini, dan file tersebut akan ditarik ketika sudah ditemukan di penyimpanan. Ini sangat nyaman ketika, misalnya, Anda perlu menampilkan beberapa gambar di situs. Kami baru saja memasang tautan yang ditangguhkan di src dan hanya itu. Anda dapat menemukan banyak kasus.

API Klien

  • Async Klien.prototipe.storeFile() - menyimpan file
  • Async Klien.prototipe.getFileLink() β€” mendapatkan tautan langsung ke file tersebut
  • Async Klien.prototipe.getFileLinks() β€” mendapatkan daftar tautan langsung ke file dari semua node yang ada
  • Async Klien.prototipe.getFileToBuffer() β€” memasukkan file ke dalam buffer
  • Async Klien.prototipe.getFileToPath() β€” memasukkan file ke dalam sistem file
  • Async Klien.prototipe.getFileToBlob() β€” dapatkan file dalam blob (untuk versi browser)
  • Async Klien.prototipe.removeFile() - menghapus file
  • Klien.prototipe.createRequestedFileLink() β€” membuat tautan yang ditangguhkan

Ekspor file ke server lain

Untuk mentransfer file ke node lain, Anda dapat:

  • Cukup salin seluruh folder penyimpanan beserta pengaturannya. (ini mungkin tidak berfungsi di masa depan)
  • Salin hanya folder dengan file. Namun, dalam kasus ini, Anda perlu menjalankan fungsi tersebut satu kali simpul.normalisasiFileInfo()untuk menghitung ulang semua data dan memasukkannya ke dalam database.
  • gunakan fungsi simpul.exportFiles()yang akan mulai menyalin file.

Pengaturan simpul dasar
Saat memulai node penyimpanan, Anda dapat menentukan semua pengaturan yang diperlukan.
Saya akan menjelaskan yang paling dasar, sisanya dapat ditemukan di Github.

  • penyimpanan.dataSize β€” ukuran folder dengan file
  • penyimpanan.tempSize β€” ukuran folder sementara
  • penyimpanan.autoCleanSize β€” ukuran penyimpanan minimum yang perlu ditampung. Jika Anda menentukan parameter ini, segera setelah ruang mulai habis, file yang paling jarang digunakan akan dihapus.
  • file.maxSize β€” ukuran file maksimum
  • file.minSize β€” ukuran file minimum
  • file.preferredDuplikat β€” jumlah duplikat file yang diinginkan di jaringan
  • file.mimeDaftar Putih - jenis file yang valid
  • file.mimeBlacklist - jenis file tidak valid
  • file.extDaftar Putih - ekstensi file yang valid
  • file.extDaftar Hitam - ekstensi file tidak valid
  • file.linkCache - berbagai pengaturan cache tautan

Hampir semua parameter yang berhubungan dengan dimensi dapat dimasukkan baik nilai absolut maupun nilai relatif.

Bekerja melalui baris perintah
Perpustakaan dapat digunakan melalui baris perintah. Untuk melakukan ini, Anda perlu menginstalnya secara global: npm i -g penyimpanan. Setelah ini, Anda dapat meluncurkan tindakan yang diperlukan dari direktori proyek tempat node tersebut berada. Misalnya, penyimpanan -a storeFile -f ./file.txt -c ./config.jsuntuk menambahkan file. Semua tindakan dapat ditemukan di https://github.com/ortexx/storacle/blob/master/bin/actions.js

Mengapa Anda memerlukan ini?

  • Jika Anda ingin membuat semacam proyek terdesentralisasi di mana Anda berencana untuk menyimpan dan bekerja dengan file menggunakan metode yang mudah. Misalnya, proyek musik yang dijelaskan pada tautan di awal artikel menggunakan gudang.
  • Jika Anda mengerjakan proyek lain di mana Anda perlu menyimpan file secara terdistribusi. Anda dapat dengan mudah membangun jaringan tertutup, mengonfigurasi node secara fleksibel, dan menambahkan node baru bila diperlukan.
  • Jika Anda hanya perlu menyimpan file situs web Anda di suatu tempat dan terlalu berat bagi Anda untuk menulis semuanya sendiri. Mungkin perpustakaan ini lebih cocok daripada perpustakaan lain dalam kasus Anda.
  • Jika Anda memiliki proyek tempat Anda bekerja dengan file, tetapi ingin melakukan semua manipulasi dari browser. Anda dapat menghindari penulisan kode server.

Kontak saya:

Sumber: www.habr.com

Tambah komentar