Storacle - merkezi olmayan dosya depolama

Storacle - merkezi olmayan dosya depolama

Başlamadan önce ayrılmalıyım önceki makaleye bağlantıböylece tam olarak neyden bahsettiğimiz açıkça anlaşılsın.

Bu yazıda dosyaların depolanmasından sorumlu olan katmana ve bunun herkes tarafından nasıl kullanılabileceğine bakmak istiyorum. Storacle bağımsız bir kütüphanedirmüzikle doğrudan bir bağlantısı yoktur. Herhangi bir dosyanın depolanmasını düzenleyebilirsiniz.

Önceki yazımda biraz "namluyu yuvarladım" ipf'ler, ancak bu tam olarak çözdüğüm sorun bağlamında gerçekleşti. Genel olarak bu projenin harika olduğunu düşünüyorum. Ben sadece farklı görevler için farklı ağlar oluşturma yeteneğini tercih ediyorum. Bu, yapıyı daha iyi organize etmenize ve bireysel düğümler ve bir bütün olarak ağ üzerindeki yükü azaltmanıza olanak tanır. Hatta tek bir proje çerçevesinde gerekirse ağı bazı kriterlere göre parçalara ayırarak toplam yükü azaltabilirsiniz.

Yani storacle mekanizmayı kullanıyor yayılabilir bir ağ düzenlemek için. Ana Özellikler:

  • Dosyalar herhangi bir düğüm aracılığıyla depoya eklenebilir.
  • Dosyalar bloklar halinde değil tamamen kaydedilir.
  • Her dosyanın, üzerinde daha fazla çalışılabilmesi için kendine özgü içerik karması vardır.
  • Daha fazla güvenilirlik için dosyalar çoğaltılabilir
  • Bir düğümdeki dosya sayısı yalnızca dosya sistemiyle sınırlıdır (bir istisna vardır, bunun hakkında daha fazla bilgiyi aşağıda bulabilirsiniz)
  • Ağdaki dosya sayısı, ağdaki geçerli düğümlerin sayısına göre yayılabilir yeteneklerle sınırlıdır; ikinci versiyonda sonsuz sayıda düğümle çalışabilecektir (bununla ilgili daha fazlası başka bir makalede)

Bunun genel olarak programdan nasıl çalıştığına dair basit bir örnek:

Sunucu:

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

Müşteri:

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

Içeriden göster

Kaputun altında süslü bir şey yok. Dosya sayısı, toplam boyutu ve diğer noktalara ilişkin bilgiler bellek içi bir veritabanında saklanır ve dosyalar silinip eklendiğinde güncellenir, böylece dosya sistemine sık sık erişmeye gerek kalmaz. Bunun bir istisnası, belirli bir depolama boyutuna ulaşıldığında dosyaları dağıtmanız gerektiğinde çöp toplayıcının etkinleştirilmesi ve yenilerinin eklenmesinin yasaklanmamasıdır. Bu durumda depolama alanını atlamanız gerekir ve çok sayıda dosyayla (> diyelim bir milyon) çalışmak önemli yüklere yol açabilir. Daha az dosya depolamak ve daha fazla düğüm çalıştırmak daha iyidir. "Temizleyici" devre dışı bırakılırsa böyle bir sorun olmaz.

Dosya depolama alanı 256 klasörden ve 2 düzeyde iç içe yerleştirmeden oluşur. Dosyalar ikinci düzey klasörlerde saklanır. Yani 1 milyon varsa. Bu tür klasörlerin her birinde yaklaşık 62500 dosya olacaktır (1000000 / sqrt(256)).

Klasör adları dosya karmasından oluşturulur, böylece karma değerini biliyorsanız ona hızlı bir şekilde erişebilirsiniz.

Bu yapı çok sayıda farklı depolama gereksinimlerine göre seçilmiştir: tek bir klasörde çok sayıda dosyanın bulunmasının istenmediği zayıf dosya sistemleri desteği, gerekirse tüm klasörler arasında hızlı geçiş vb. Bir çeşit altın anlam.

Önbelleğe almak

Dosya eklerken ve alırken, dosya bağlantıları önbelleğe yazılır.
Bu sayede çoğu zaman bir dosyayı aramak için tüm ağı dolaşmaya gerek kalmaz. Bu, bağlantıların alınmasını hızlandırır ve ağ üzerindeki yükü azaltır. Önbelleğe alma ayrıca http başlıkları aracılığıyla da gerçekleşir.

izomorfi

İstemci javascript ile yazılmıştır ve izomorfiktir, doğrudan tarayıcıdan kullanılabilir. 
Dosyayı yükleyebilirsiniz https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js komut dosyası ve erişim olarak window.ClientStoracle veya derleme sistemi vb. aracılığıyla içe aktarın.

Ertelenmiş bağlantılar

İlginç bir özellik de “ertelenmiş referans”tır. Bu, eşzamanlı olarak burada ve şimdi elde edilebilecek bir dosyaya bağlantıdır ve dosya, depoda zaten bulunduğunda yukarı çekilecektir. Bu, örneğin sitede bazı resimler göstermeniz gerektiğinde çok kullanışlıdır. Sadece src'ye ertelenmiş bir bağlantı koyduk ve hepsi bu. Birçok vakayla karşılaşabilirsiniz.

İstemci API'si

  • zaman uyumsuz Client.prototype.storeFile() - dosyayı kaydetme
  • zaman uyumsuz Client.prototype.getFileLink() — dosyaya doğrudan bağlantı alma
  • zaman uyumsuz Client.prototype.getFileLinks() — bir dosyanın bulunduğu tüm düğümlerden doğrudan bağlantıların listesini almak
  • zaman uyumsuz Client.prototype.getFileToBuffer() — dosyayı ara belleğe alın
  • zaman uyumsuz Client.prototype.getFileToPath() — dosya sistemine bir dosya alın
  • zaman uyumsuz Client.prototype.getFileToBlob() — dosyayı blob olarak alın (tarayıcı sürümü için)
  • zaman uyumsuz Client.prototype.removeFile() - bir dosyayı sil
  • Client.prototype.createRequestedFileLink() — ertelenmiş bir bağlantı oluştur

Dosyaları başka bir sunucuya aktar

Dosyaları başka bir düğüme aktarmak için şunları yapabilirsiniz:

  • Ayarlarla birlikte depolama klasörünün tamamını kopyalamanız yeterlidir. (bu gelecekte işe yaramayabilir)
  • Yalnızca dosyaların bulunduğu klasörü kopyalayın. Ancak bu durumda işlevi bir kez çalıştırmanız gerekecektir. node.normalizeFilesInfo()tüm verileri yeniden hesaplamak ve veritabanına girmek için.
  • işlev kullan node.exportFiles()dosyaları kopyalamaya başlayacak.

Temel düğüm ayarları
Depolama düğümünü başlatırken gerekli tüm ayarları belirleyebilirsiniz.
En temellerini anlatacağım, gerisini Github'da bulabilirsiniz.

  • depolama.veriBoyutu — dosyaların bulunduğu klasörün boyutu
  • depolama.tempSize — geçici klasör boyutu
  • depolama.autoCleanSize — tutulması gereken minimum depolama boyutu. Bu parametreyi belirtirseniz, alan dolmaya başlar başlamaz en az kullanılan dosyalar silinecektir.
  • dosya.maxSize - Maksimum dosya boyutu
  • dosya.minSize — minimum dosya boyutu
  • file.preferredDuplicates — ağdaki tercih edilen dosya kopya sayısı
  • file.mimeWhitelist - geçerli dosya türleri
  • file.mimeBlacklist - geçersiz dosya türleri
  • file.extBeyaz liste - geçerli dosya uzantıları
  • file.extKara liste - geçersiz dosya uzantıları
  • dosya.linkCache - çeşitli bağlantı önbelleğe alma ayarları

Boyutlarla ilgili hemen hemen tüm parametreler hem mutlak hem de göreceli değerlerde girilebilir.

Komut satırı üzerinden çalışma
Kütüphane komut satırı üzerinden kullanılabilir. Bunu yapmak için global olarak yüklemeniz gerekir: npm i -g depolama alanı. Bundan sonra gerekli işlemleri düğümün bulunduğu proje dizininden başlatabilirsiniz. Örneğin, storacle -a mağazaDosya -f ./file.txt -c ./config.jsDosyayı eklemek için. Tüm eylemleri şurada bulabilirsiniz: https://github.com/ortexx/storacle/blob/master/bin/actions.js

Buna neden ihtiyacınız olabilir?

  • Uygun yöntemler kullanarak dosyaları saklamayı ve dosyalar ile çalışmayı planladığınız bir tür merkezi olmayan proje oluşturmak istiyorsanız. Örneğin yazının başındaki bağlantıda anlatılan müzik projesi şunu kullanıyor: depo.
  • Dosyaları dağıtılmış bir şekilde depolamanız gereken başka projeler üzerinde çalışıyorsanız. Kapalı ağınızı kolayca oluşturabilir, düğümleri esnek bir şekilde yapılandırabilir ve gerektiğinde yenilerini ekleyebilirsiniz.
  • Web sitenizin dosyalarını bir yerde saklamanız gerekiyorsa ve her şeyi kendiniz yazmanız size çok fazla geliyorsa. Belki de bu kütüphane sizin durumunuza diğerlerinden daha uygundur.
  • Dosyalarla çalıştığınız bir projeniz varsa ancak tüm işlemleri tarayıcıdan gerçekleştirmek istiyorsanız. Sunucu kodu yazmaktan kaçınabilirsiniz.

Benim rehber:

Kaynak: habr.com

Yorum ekle