Storacle - storan fail terdesentralisasi

Storacle - storan fail terdesentralisasi

Sebelum saya mulakan, saya mesti pergi pautan ke artikel sebelumnyasupaya jelas apa sebenarnya yang kita bincangkan.

Dalam artikel ini saya ingin melihat lapisan yang bertanggungjawab untuk menyimpan fail, dan bagaimana ia boleh digunakan oleh sesiapa sahaja. Storacle ialah perpustakaan kendiri, tiada kaitan langsung dengan muzik. Anda boleh mengatur penyimpanan mana-mana fail.

Dalam artikel sebelum ini, saya "menggulung tong" sedikit ipfs, tetapi ini berlaku tepat dalam konteks masalah yang saya selesaikan. Secara keseluruhan, saya rasa projek ini bagus. Saya hanya lebih suka keupayaan untuk mencipta rangkaian yang berbeza untuk tugas yang berbeza. Ini membolehkan anda mengatur struktur dengan lebih baik dan mengurangkan beban pada nod individu dan rangkaian secara keseluruhan. Walaupun dalam rangka satu projek, jika perlu, anda boleh membahagikan rangkaian mengikut beberapa kriteria, mengurangkan beban keseluruhan.

Jadi storacle menggunakan mekanisme boleh disebarkan untuk mengatur rangkaian. Ciri-ciri utama:

  • Fail boleh ditambah ke repositori melalui mana-mana nod.
  • Fail disimpan sepenuhnya, bukan dalam blok.
  • Setiap fail mempunyai cincang kandungan uniknya sendiri untuk kerja selanjutnya dengannya.
  • Fail boleh disalin untuk kebolehpercayaan yang lebih besar
  • Bilangan fail pada satu nod dihadkan hanya oleh sistem fail (terdapat pengecualian, lebih lanjut mengenainya di bawah)
  • Bilangan fail dalam rangkaian dihadkan oleh keupayaan yang boleh disebarkan mengikut bilangan nod yang sah dalam rangkaian, yang dalam versi kedua akan dapat berfungsi dengan bilangan nod yang tidak terhingga (lebih lanjut mengenai ini dalam artikel lain)

Contoh mudah bagaimana ini biasanya berfungsi daripada program:

Pelayan:

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);
  }
})();

Pandangan dalam

Tidak ada yang mewah di bawah tudung. Maklumat tentang bilangan fail, jumlah saiznya dan titik lain disimpan dalam pangkalan data dalam memori dan dikemas kini apabila fail dipadam dan ditambah, jadi tidak perlu kerap mengakses sistem fail. Pengecualian adalah mendayakan pengumpul sampah apabila anda perlu mengedarkan fail apabila saiz storan tertentu dicapai dan tidak melarang menambah yang baharu. Dalam kes ini, anda perlu memintas storan, dan bekerja dengan sejumlah besar fail (> katakan sejuta) boleh membawa kepada beban yang ketara. Dan lebih baik untuk menyimpan lebih sedikit fail dan menjalankan lebih banyak nod. Jika "pembersih" dilumpuhkan, maka tidak ada masalah seperti itu.

Storan fail terdiri daripada 256 folder dan 2 peringkat sarang. Fail disimpan dalam folder peringkat kedua. Iaitu, jika ada 1 juta. Terdapat kira-kira 62500 fail dalam setiap folder tersebut (1000000 / persegi(256)).

Nama folder dibentuk daripada cincangan fail supaya anda boleh mengaksesnya dengan cepat jika anda mengetahui cincangan tersebut.

Struktur ini dipilih berdasarkan sejumlah besar keperluan storan yang berbeza: sokongan untuk sistem fail yang lemah, di mana tidak diingini untuk mempunyai banyak fail dalam satu folder, traversal pantas semua folder jika perlu, dsb. Beberapa jenis maksud emas.

Caching

Apabila menambah fail, serta semasa menerimanya, pautan ke fail ditulis ke cache.
Terima kasih kepada ini, selalunya tidak perlu melintasi seluruh rangkaian untuk mencari fail. Ini mempercepatkan penerimaan pautan dan mengurangkan beban pada rangkaian. Caching juga berlaku melalui pengepala http.

Isomorfi

Pelanggan ditulis dalam javascript dan bersifat isomorfik, ia boleh digunakan terus dari pelayar. 
Anda boleh memuat naik fail https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js sebagai skrip dan akses window.ClientStoracle atau import melalui sistem binaan, dsb.

Pautan tertunda

Ciri yang menarik juga ialah "rujukan tertunda". Ini ialah pautan ke fail yang boleh diperoleh secara serentak, di sini dan sekarang, dan fail itu akan ditarik ke atas apabila ia sudah ditemui dalam storan. Ini sangat mudah apabila, sebagai contoh, anda perlu menunjukkan beberapa gambar di tapak. Kami hanya meletakkan pautan tertunda dalam src dan itu sahaja. Anda boleh membuat banyak kes.

API Pelanggan

  • async Client.prototype.storeFile() - menyimpan fail
  • async Client.prototype.getFileLink() β€” mendapatkan pautan terus ke fail
  • async Client.prototype.getFileLinks() β€” mendapatkan senarai pautan terus ke fail daripada semua nod di mana ia wujud
  • async Client.prototype.getFileToBuffer() β€” masukkan fail ke dalam penimbal
  • async Client.prototype.getFileToPath() β€” masukkan fail ke dalam sistem fail
  • async Client.prototype.getFileToBlob() β€” dapatkan fail dalam gumpalan (untuk versi penyemak imbas)
  • async Client.prototype.removeFile() - memadam fail
  • Client.prototype.createRequestedFileLink() β€” buat pautan tertunda

Eksport fail ke pelayan lain

Untuk memindahkan fail ke nod lain, anda boleh:

  • Hanya salin keseluruhan folder storan bersama-sama dengan tetapan. (ini mungkin tidak berfungsi pada masa hadapan)
  • Salin hanya folder dengan fail. Tetapi, dalam kes ini, anda perlu menjalankan fungsi itu sekali node.normalizeFilesInfo()untuk mengira semula semua data dan memasukkannya ke dalam pangkalan data.
  • Gunakan fungsi node.exportFiles()yang akan mula menyalin fail.

Tetapan nod asas
Apabila memulakan nod storan, anda boleh menentukan semua tetapan yang diperlukan.
Saya akan menerangkan yang paling asas, selebihnya boleh didapati di Github.

  • storan.dataSize β€” saiz folder dengan fail
  • penyimpanan.tempSize β€” saiz folder sementara
  • penyimpanan.autoCleanSize β€” saiz storan minimum yang perlu dipegang. Jika anda menentukan parameter ini, maka sebaik sahaja ruang mula kehabisan, fail yang paling kurang digunakan akan dipadamkan.
  • file.maxSize β€” saiz fail maksimum
  • fail.minSize β€” saiz fail minimum
  • file.preferredDuplicates β€” bilangan pendua fail pilihan pada rangkaian
  • file.mimeWhitelist - jenis fail yang sah
  • file.mimeBlacklist - jenis fail tidak sah
  • file.extWhitelist - sambungan fail yang sah
  • file.extBlacklist - sambungan fail tidak sah
  • file.linkCache - pelbagai tetapan caching pautan

Hampir semua parameter yang berkaitan dengan dimensi boleh dimasukkan dalam nilai mutlak dan relatif.

Bekerja melalui baris arahan
Perpustakaan boleh digunakan melalui baris arahan. Untuk melakukan ini, anda perlu memasangnya secara global: npm i -g storacle. Selepas ini, anda boleh melancarkan tindakan yang diperlukan dari direktori projek di mana nod itu berada. Sebagai contoh, storacle -a storeFile -f ./file.txt -c ./config.jsuntuk menambah fail. Semua tindakan boleh didapati di https://github.com/ortexx/storacle/blob/master/bin/actions.js

Mengapa anda mungkin memerlukan ini?

  • Jika anda ingin mencipta beberapa jenis projek terdesentralisasi di mana anda merancang untuk menyimpan dan bekerja dengan fail menggunakan kaedah yang mudah. Contohnya, projek muzik yang diterangkan dalam pautan pada permulaan artikel menggunakan storacle.
  • Jika anda bekerja pada mana-mana projek lain di mana anda perlu menyimpan fail dalam cara yang diedarkan. Anda boleh membina rangkaian tertutup anda dengan mudah, mengkonfigurasi nod secara fleksibel dan menambah yang baharu apabila diperlukan.
  • Jika anda hanya perlu menyimpan fail tapak web anda di suatu tempat dan terlalu banyak untuk anda menulis semuanya sendiri. Mungkin perpustakaan ini lebih sesuai daripada perpustakaan lain dalam kes anda.
  • Jika anda mempunyai projek di mana anda bekerja dengan fail, tetapi ingin melakukan semua manipulasi daripada penyemak imbas. Anda boleh mengelak daripada menulis kod pelayan.

kenalan saya:

Sumber: www.habr.com

Tambah komen