Storacle - ապակենտրոնացված ֆայլերի պահեստավորում

Storacle - ապակենտրոնացված ֆայլերի պահեստավորում

Նախքան սկսելը, ես պետք է հեռանամ հղում նախորդ հոդվածինորպեսզի պարզ լինի, թե կոնկրետ ինչի մասին է խոսքը։

Այս հոդվածում ես կցանկանայի տեսնել այն շերտը, որը պատասխանատու է ֆայլերի պահպանման համար, և թե ինչպես այն կարող է օգտագործվել որևէ մեկի կողմից: Storacle-ը ինքնուրույն գրադարան է, երաժշտության հետ ուղղակի կապ չկա։ Դուք կարող եք կազմակերպել ցանկացած ֆայլի պահեստավորում:

Նախորդ հոդվածում ես մի փոքր «գլորեցի տակառը»։ ipfs, բայց դա տեղի ունեցավ հենց այն խնդրի համատեքստում, որը ես լուծում էի։ Ընդհանուր առմամբ, ես կարծում եմ, որ այս նախագիծը հիանալի է: Ես պարզապես նախընտրում եմ տարբեր խնդիրների համար տարբեր ցանցեր ստեղծելու ունակությունը: Սա թույլ է տալիս ավելի լավ կազմակերպել կառուցվածքը և նվազեցնել բեռը առանձին հանգույցների և ամբողջ ցանցի վրա: Նույնիսկ մեկ նախագծի շրջանակներում, անհրաժեշտության դեպքում, կարող եք ցանցը բաժանել մասերի ըստ որոշ չափանիշների՝ նվազեցնելով ընդհանուր ծանրաբեռնվածությունը։

Այսպիսով, storacle-ն օգտագործում է մեխանիզմը տարածվող ցանց կազմակերպելու համար։ ԿԱՐԵՎՈՐ մասեր:

  • Ֆայլերը կարող են ավելացվել պահեստարան ցանկացած հանգույցի միջոցով:
  • Ֆայլերը պահվում են ամբողջությամբ, ոչ թե բլոկներում:
  • Յուրաքանչյուր ֆայլ ունի իր յուրահատուկ բովանդակության հեշը՝ դրա հետ հետագա աշխատանքի համար:
  • Ֆայլերը կարող են կրկնօրինակվել ավելի մեծ հուսալիության համար
  • Մեկ հանգույցում ֆայլերի քանակը սահմանափակվում է միայն ֆայլային համակարգով (բացառություն կա, դրա մասին ավելին ստորև)
  • Ցանցում ֆայլերի քանակը սահմանափակվում է տարածվող հնարավորություններով՝ ըստ ցանցում վավեր հանգույցների քանակի, ինչը երկրորդ տարբերակում թույլ կտա աշխատել անսահման թվով հանգույցների հետ (այս մասին ավելին մեկ այլ հոդվածում)

Պարզ օրինակ, թե ինչպես է դա սովորաբար աշխատում ծրագրից.

Սերվեր:

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

Հաճախորդ:

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

Ներսի տեսարան

Կափարիչի տակ ոչ մի շքեղ բան չկա: Ֆայլերի քանակի, դրանց ընդհանուր չափի և այլ կետերի մասին տեղեկատվությունը պահվում է հիշողության տվյալների բազայում և թարմացվում է, երբ ֆայլերը ջնջվում և ավելացվում են, ուստի կարիք չկա հաճախակի մուտք գործել ֆայլային համակարգ: Բացառություն է աղբահանին միացնելը, երբ անհրաժեշտ է ֆայլեր շրջանառել, երբ հասնում է պահեստի որոշակի չափի, և չարգելել նորերը ավելացնել: Այս դեպքում դուք պետք է շրջանցեք պահեստը, և մեծ թվով ֆայլերի հետ աշխատելը (> ասենք մեկ միլիոն) կարող է հանգեցնել զգալի բեռների։ Եվ ավելի լավ է ավելի քիչ ֆայլեր պահել և ավելի շատ հանգույցներ գործարկել: Եթե ​​«հավաքարարն» անջատված է, ուրեմն նման խնդիր չկա։

Ֆայլի պահեստը բաղկացած է 256 թղթապանակից և 2 մակարդակի բույնից: Ֆայլերը պահվում են երկրորդ մակարդակի թղթապանակներում: Այսինքն, եթե 1 մլն. Յուրաքանչյուր նման թղթապանակում կլինի մոտ 62500 ֆայլ (1000000 / sqrt(256)):

Թղթապանակների անունները ձևավորվում են ֆայլի հեշից, որպեսզի կարողանաք արագ մուտք գործել այն, եթե գիտեք հեշը:

Այս կառուցվածքը ընտրվել է ելնելով պահեստավորման մեծ թվով տարբեր պահանջներից՝ թույլ ֆայլային համակարգերի աջակցություն, որտեղ ցանկալի չէ մեկ թղթապանակում շատ ֆայլեր ունենալ, անհրաժեշտության դեպքում բոլոր թղթապանակների արագ անցում և այլն։ Ինչ-որ ոսկե միջին:

caching

Ֆայլեր ավելացնելիս, ինչպես նաև դրանք ստանալիս, ֆայլերի հղումները գրվում են քեշում:
Դրա շնորհիվ շատ հաճախ անհրաժեշտություն չի լինում անցնել ամբողջ ցանցը՝ ֆայլ փնտրելու համար: Սա արագացնում է հղումների ստացումը և նվազեցնում ցանցի բեռը: Քեշավորումը տեղի է ունենում նաև http վերնագրերի միջոցով:

Իզոմորֆիա

Հաճախորդը գրված է javascript-ով և իզոմորֆ է, այն կարող է օգտագործվել անմիջապես բրաուզերից: 
Դուք կարող եք վերբեռնել ֆայլը https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js որպես սցենար և մուտք պատուհան.ClientStoracle կամ ներմուծել build համակարգի միջոցով և այլն:

Հետաձգված հղումներ

Հետաքրքիր հատկանիշ է նաև «հետաձգված հղումը»: Սա ֆայլի հղում է, որը կարելի է ձեռք բերել համաժամանակյա, այստեղ և հիմա, և ֆայլը կվերցվի, երբ այն արդեն գտնվի պահեստում: Սա շատ հարմար է, երբ, օրինակ, պետք է կայքում ցուցադրել որոշ նկարներ։ Մենք ուղղակի հետաձգված հղում ենք դնում src-ում և վերջ։ Դուք կարող եք գալ բազմաթիվ դեպքերի:

Հաճախորդի API

  • ասինկ Client.prototype.storeFile() - ֆայլի պահպանում
  • ասինկ Client.prototype.getFileLink() — ստանալ ուղղակի հղում դեպի ֆայլ
  • ասինկ Client.prototype.getFileLinks() — ստանալով ֆայլի ուղիղ հղումների ցանկ բոլոր հանգույցներից, որտեղ այն գոյություն ունի
  • ասինկ Client.prototype.getFileToBuffer() - ֆայլը մտցրեք բուֆեր
  • ասինկ Client.prototype.getFileToPath() — ֆայլ մտցնել ֆայլային համակարգ
  • ասինկ Client.prototype.getFileToBlob() - ստացեք ֆայլը blob-ում (բրաուզերի տարբերակի համար)
  • ասինկ Client.prototype.removeFile() - ջնջել ֆայլը
  • Client.prototype.createRequestedFileLink() - ստեղծել հետաձգված հղում

Արտահանել ֆայլերը մեկ այլ սերվեր

Ֆայլերը մեկ այլ հանգույց տեղափոխելու համար կարող եք.

  • Պարզապես պատճենեք պահեստավորման ամբողջ թղթապանակը կարգավորումների հետ միասին: (սա ապագայում կարող է չաշխատել)
  • Պատճենեք միայն ֆայլերով թղթապանակը: Բայց, այս դեպքում, դուք պետք է գործարկեք գործառույթը մեկ անգամ node.normalizeFilesInfo()վերահաշվարկել բոլոր տվյալները և մուտքագրել դրանք տվյալների բազա:
  • օգտագործել գործառույթը node.exportFiles()որը կսկսի ֆայլերի պատճենումը:

Հիմնական հանգույցի կարգավորումները
Պահպանման հանգույցը սկսելիս կարող եք նշել բոլոր անհրաժեշտ պարամետրերը:
Ես նկարագրելու եմ ամենահիմնականները, մնացածը կարելի է գտնել Github-ում:

  • storage.dataSize — ֆայլերով թղթապանակի չափը
  • storage.tempSize - թղթապանակի ժամանակավոր չափը
  • storage.autoCleanSize - պահեստավորման նվազագույն չափը, որը պետք է պահվի: Եթե ​​նշեք այս պարամետրը, ապա հենց որ տարածքը սկսի սպառվել, ամենաքիչ օգտագործվող ֆայլերը կջնջվեն:
  • file.maxSize - ֆայլի առավելագույն չափը
  • file.minSize - ֆայլի նվազագույն չափը
  • file.preferredDuplicates — ցանցում ֆայլերի կրկնօրինակների նախընտրելի թիվը
  • file.mimeWhitelist - վավեր ֆայլի տեսակներ
  • file.mimeՍև ցուցակ - անվավեր ֆայլի տեսակներ
  • file.extWhitelist - վավեր ֆայլերի ընդարձակումներ
  • file.extBlacklist - ֆայլի անվավեր ընդլայնումներ
  • file.linkCache - հղումների քեշավորման տարբեր կարգավորումներ

Չափերի հետ կապված գրեթե բոլոր պարամետրերը կարող են մուտքագրվել ինչպես բացարձակ, այնպես էլ հարաբերական արժեքներով:

Աշխատում է հրամանի տողի միջոցով
Գրադարանը կարող է օգտագործվել հրամանի տողի միջոցով: Դա անելու համար դուք պետք է այն գլոբալ տեղադրեք. npm i -g storacle. Դրանից հետո դուք կարող եք գործարկել անհրաժեշտ գործողությունները նախագծի գրացուցակից, որտեղ գտնվում է հանգույցը: Օրինակ, storacle -a storeFile -f ./file.txt -c ./config.jsֆայլը ավելացնելու համար: Բոլոր գործողությունները կարելի է գտնել https://github.com/ortexx/storacle/blob/master/bin/actions.js

Ինչու կարող է դա ձեզ անհրաժեշտ լինել:

  • Եթե ​​ցանկանում եք ստեղծել ինչ-որ ապակենտրոնացված նախագիծ, որում նախատեսում եք պահպանել և աշխատել ֆայլերի հետ՝ օգտագործելով հարմար մեթոդներ: Օրինակ, հոդվածի սկզբի հղման մեջ նկարագրված երաժշտական ​​նախագիծը օգտագործում է պահեստարան.
  • Եթե ​​դուք աշխատում եք որևէ այլ նախագծի վրա, որտեղ դուք պետք է ֆայլերը բաշխված ձևով պահեք: Դուք կարող եք հեշտությամբ կառուցել ձեր փակ ցանցը, ճկուն կերպով կարգավորել հանգույցները և անհրաժեշտության դեպքում ավելացնել նորերը:
  • Եթե ​​ձեզ պարզապես անհրաժեշտ է ինչ-որ տեղ պահել ձեր կայքի ֆայլերը, և ձեզ համար չափազանց շատ է ամեն ինչ ինքներդ գրելը: Միգուցե այս գրադարանն ավելի հարմար է, քան մյուսները ձեր դեպքում:
  • Եթե ​​ունեք նախագիծ, որում աշխատում եք ֆայլերի հետ, բայց ցանկանում եք կատարել բոլոր մանիպուլյացիաները բրաուզերից: Դուք կարող եք խուսափել սերվերի կոդը գրելուց:

Իմ կոնտակտները.

Source: www.habr.com

Добавить комментарий