
Преди да започна, трябва да оставя , за да е ясно за какво става въпрос.
В тази статия искам да разгледам слоя, който отговаря за съхранение на файлове, и как това може да се използва от всеки. , няма пряка връзка с музиката. Възможно е да се организира съхранение на всякакви файлове.
В предишната статия малко поспоменах за 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 на клиента
- асинхронно 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.mimeBlacklist — недопустими типове файл
- file.extWhitelist — допустими разширения на файла
- file.extBlacklist — недопустими разширения на файла
- file.linkCache — различни настройки за кеширане на връзки
Почти всички параметри, свързани с размерите, могат да бъдат задавани както в абсолютни, така и в относителни величини.
Работа чрез командния ред
Библиотеката може да бъде използвана чрез командния ред. За целта трябва да я инсталирате глобално: npm i -g storacle. След това можете да стартирате необходимите действия от директорията с проекта, където е възелът. Например, storacle -a storeFile -f ./file.txt -c ./config.js, за да добавите файл. Всички действия можете да намерите в
Защо може да ти е нужно това
- Ако искаш да създадеш някакъв децентрализиран проект, в който плануваш да съхраняваш и работиш с файлове по удобни методи. Например, проект с музика, описан на връзката в началото на статията, използва storacle.
- Ако работиш по каквито и да е други проекти, при които е необходимо да съхраняваш файлове разпределено, можеш лесно да изградиш своя затворена мрежа, гъвкаво да конфигурираш възлите и да добавяш нови, когато това е необходимо.
- Ако просто ти трябва място за съхранение на файловете на сайта ти и не ти се пише всичко сам, вероятно тази библиотека ще е по-подходяща от другите в твоя случай.
- Ако имаш проект, в който работиш с файлове, но искаш всички манипулации да се извършват от браузъра, можеш да избегнеш писането на серверен код.
Моите контакти:
Източник: habr.com
