
Преди да започна, трябва да оставя , за да е понятно за какво точно става въпрос.
В тази статия бих искал да разгледам слоя, който отговаря за съхранението на файлове и как това може да бъде използвано от всеки. , няма пряка връзка с музиката. Може да се организира съхранение на всякакви файлове.
В предишната статия малко "написах негативно" за ipfs, но това се случи именно в контекста на задачата, която решавах. Като цяло, смятам, че проектът е страхотен. Просто предпочитам възможността да създавам различни мрежи за различни задачи. Това позволява по-добра организация на структурата и намалява натоварването на отделни възли и мрежата като цяло. Може дори в рамките на един проект, при необходимост, да се раздели мрежата на части по определени критерии, което намалява общото натоварване.
И така, storacle използва механизма за организиране на мрежата. Основни характеристики:
- Файловете могат да бъдат добавяни в хранилището през всякакъв възел.
- Файловете се запазват изцяло, не на блокове.
- Всеки файл има свой уникален хеш по съдържание за по-нататъшна работа с него.
- Файловете могат да се дублират за повишаване на надеждността
- Броят на файловете на един възел е ограничен само от файловата система (има изключение, за него ще говорим по-долу)
- Броят на файловете в мрежата е ограничен от възможностите на spreadable относно броя допустими възли в мрежата, които във втората версия ще могат да позволят работа с безкраен брой възли (за това в друга статия)
Прост пример как това всъщност работи от програмата:
Сървър:
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);
}
})();Взгляд отвътре
Под капота няма нищо извънземно. Информацията за количеството файлове, общия им размер и други детайли се съхраняват в in-memory база и се обновяват при изтриване и добавяне на файлове, поради което няма нужда често да се обръщаме към файловата система. Изключение прави активирането на боклукосъбирача, когато е необходима циркулация на файловете при достигане на определен размер на хранилището, а не забрана за добавяне на нови. В този случай се налага да обходите хранилището, и работата с голямо количество файлове (> милион да кажем) може да доведе до значителни натоварвания. По-добре е да се съхраняват по-малко файлове и да се стартират повече възли. Ако "почистващият" е изключен, такава проблема няма.
Хранилището на файлове се състои от 256 папки и 2 нива вложеност. Файловете се съхраняват в папките от второ ниво. Тоест, при наличие на 1 млн. файлове, в такава папка ще има около 62500 файла (1000000 / sqrt(256)).
Имената на папките се генерират от хеша на файла, за да може бързо да се получи достъп, знаейки хеша.
Тази структура беше избрана, имайки предвид многото различни изисквания към хранилището: поддръжка на слаби файлови системи, където в една папка не е желателно да има много файлове, бързо обхождане на всички папки при необходимост и т.н. Някаква златна среда.
Кеширане
При добавяне на файлове, а също и при тяхното получаване, в кеша се записват линкове към файловете.
Благодарение на това, много често няма необходимост да се обхожда цялата мрежа в търсене на файл. Това ускорява получаването на линкове и намалява натоварването на мрежата. Кеширането също така става чрез http заглавия.
Изоморфност
Клиентът е написан на javascript и е изоморфен, може да се използва директно от браузера.
Може да се зареди файл като скрипт и да получите достъп до window.ClientStoracle или да се импортира чрез системата за изграждане и т.н.
Отложени линкове
Интересна функция е "отложен линк". Това е линк към файл, който може да бъде получен синхронно, тук и сега, а файлът ще бъде извлечен, когато бъде намерен в хранилището. Това е много удобно, когато, например, е нужно да покажете на сайта някои снимки. Просто поставяме в src отложения линк и всичко. Могат да се измислят много казуси.
API на клиента
- async Client.prototype.storeFile() — запазване на файл
- async Client.prototype.getFileLink() — получаване на директен линк към файл
- async Client.prototype.getFileLinks() — получаване на списък с директни линкове към файла от всички възли, където той съществува
- async Client.prototype.getFileToBuffer() — получаване на файла в буфер
- async Client.prototype.getFileToPath() — получаване на файла в файловата система
- async Client.prototype.getFileToBlob() — получаване на файла в blob (за браузърната версия)
- async 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.mimeBlacklist — недопустими типове файлове
- file.extWhitelist — допустими разширения на файловете
- file.extBlacklist — недопустими разширения на файловете
- file.linkCache — различни настройки за кеширане на линкове
Почти всички параметри, свързани с размерите, могат да бъдат задавани както в абсолютни, така и в относителни величини.
Работа чрез команден ред
Библиотеката може да се използва чрез команден ред. За целта трябва да я инсталирате глобално: npm i -g storacle. След това можете да стартирате необходимите действия от директорията с проекта, където е възелът. Например, storacle -a storeFile -f ./file.txt -c ./config.js, за да добавите файл. Всички действия можете да намерите в
Защо може да ви е необходимо това
- Ако искате да създадете някакъв децентрализован проект, в който се предвижда съхранение и работа с файлове по удобни методи. Например, проект с музика, описан по линка в началото на статията, използва storacle.
- Ако работиш по всякакви други проекти, където е нужно да се съхраняват файлове разпределено. Можеш лесно да изградиш своя собствена затворена мрежа, да настройваш гъвкаво възлите и да добавяш нови, когато е необходимо.
- Ако просто ти трябва място за съхранение на файловете на твоя сайт и ти е неудобно да пишеш всичко сам. Вероятно тази библиотека ще е по-добра от другите в твоя случай.
- Ако имаш проект, в който работиш с файлове, но искаш да извършваш всички манипулации от браузъра. Можеш да избегнеш писането на сървърен код.
Моите контакти:
Източник: habr.com
