Նախքան սկսելը, ես պետք է հեռանամ
Այս հոդվածում ես կցանկանայի տեսնել այն շերտը, որը պատասխանատու է ֆայլերի պահպանման համար, և թե ինչպես այն կարող է օգտագործվել որևէ մեկի կողմից:
Նախորդ հոդվածում ես մի փոքր «գլորեցի տակառը»։ 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-ով և իզոմորֆ է, այն կարող է օգտագործվել անմիջապես բրաուզերից:
Դուք կարող եք վերբեռնել ֆայլը
Հետաձգված հղումներ
Հետաքրքիր հատկանիշ է նաև «հետաձգված հղումը»: Սա ֆայլի հղում է, որը կարելի է ձեռք բերել համաժամանակյա, այստեղ և հիմա, և ֆայլը կվերցվի, երբ այն արդեն գտնվի պահեստում: Սա շատ հարմար է, երբ, օրինակ, պետք է կայքում ցուցադրել որոշ նկարներ։ Մենք ուղղակի հետաձգված հղում ենք դնում 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ֆայլը ավելացնելու համար: Բոլոր գործողությունները կարելի է գտնել
Ինչու կարող է դա ձեզ անհրաժեշտ լինել:
- Եթե ցանկանում եք ստեղծել ինչ-որ ապակենտրոնացված նախագիծ, որում նախատեսում եք պահպանել և աշխատել ֆայլերի հետ՝ օգտագործելով հարմար մեթոդներ: Օրինակ, հոդվածի սկզբի հղման մեջ նկարագրված երաժշտական նախագիծը օգտագործում է պահեստարան.
- Եթե դուք աշխատում եք որևէ այլ նախագծի վրա, որտեղ դուք պետք է ֆայլերը բաշխված ձևով պահեք: Դուք կարող եք հեշտությամբ կառուցել ձեր փակ ցանցը, ճկուն կերպով կարգավորել հանգույցները և անհրաժեշտության դեպքում ավելացնել նորերը:
- Եթե ձեզ պարզապես անհրաժեշտ է ինչ-որ տեղ պահել ձեր կայքի ֆայլերը, և ձեզ համար չափազանց շատ է ամեն ինչ ինքներդ գրելը: Միգուցե այս գրադարանն ավելի հարմար է, քան մյուսները ձեր դեպքում:
- Եթե ունեք նախագիծ, որում աշխատում եք ֆայլերի հետ, բայց ցանկանում եք կատարել բոլոր մանիպուլյացիաները բրաուզերից: Դուք կարող եք խուսափել սերվերի կոդը գրելուց:
Իմ կոնտակտները.
Source: www.habr.com