ก่อนที่ฉันจะเริ่มฉันต้องจากไป
ในบทความนี้ ฉันอยากจะดูเลเยอร์ที่รับผิดชอบในการจัดเก็บไฟล์ และวิธีที่ใครๆ ก็สามารถนำไปใช้ได้
ในบทความที่แล้ว ฉัน "รีดถัง" เล็กน้อย ไอพีเอสแต่สิ่งนี้เกิดขึ้นอย่างแน่นอนในบริบทของปัญหาที่ฉันกำลังแก้ไข โดยรวมแล้วผมคิดว่าโปรเจ็กต์นี้เจ๋งนะ ฉันแค่ชอบความสามารถในการสร้างเครือข่ายที่แตกต่างกันสำหรับงานที่แตกต่างกัน สิ่งนี้ช่วยให้คุณจัดระเบียบโครงสร้างได้ดีขึ้นและลดภาระในแต่ละโหนดและเครือข่ายโดยรวม แม้จะอยู่ในกรอบของโครงการเดียว หากจำเป็น คุณสามารถแบ่งเครือข่ายออกเป็นชิ้นๆ ตามเกณฑ์บางประการ ซึ่งจะช่วยลดภาระโดยรวม
สตอราเคิลจึงใช้กลไกนี้
- สามารถเพิ่มไฟล์ลงในที่เก็บผ่านโหนดใดก็ได้
- ไฟล์จะถูกบันทึกทั้งหมด ไม่ใช่เป็นบล็อก
- แต่ละไฟล์มีแฮชเนื้อหาเฉพาะของตัวเองเพื่อการทำงานต่อไป
- ไฟล์สามารถทำซ้ำได้เพื่อความน่าเชื่อถือที่มากขึ้น
- จำนวนไฟล์ในหนึ่งโหนดถูกจำกัดโดยระบบไฟล์เท่านั้น (มีข้อยกเว้น โปรดดูข้อมูลเพิ่มเติมด้านล่าง)
- จำนวนไฟล์ในเครือข่ายถูกจำกัดด้วยความสามารถในการแพร่กระจายตามจำนวนโหนดที่ถูกต้องในเครือข่าย ซึ่งในเวอร์ชันที่สองจะอนุญาตให้ทำงานกับโหนดจำนวนไม่สิ้นสุด (เพิ่มเติมเกี่ยวกับเรื่องนี้ในบทความอื่น)
ตัวอย่างง่ายๆ ของวิธีการทำงานโดยทั่วไปจากโปรแกรม:
เซิร์ฟเวอร์:
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))
ชื่อโฟลเดอร์ถูกสร้างขึ้นจากแฮชของไฟล์เพื่อให้คุณสามารถเข้าถึงได้อย่างรวดเร็วหากคุณรู้แฮช
โครงสร้างนี้ถูกเลือกตามความต้องการพื้นที่จัดเก็บข้อมูลที่แตกต่างกันจำนวนมาก: การรองรับระบบไฟล์ที่อ่อนแอ โดยที่ไม่ต้องการให้มีหลายไฟล์ในโฟลเดอร์เดียว การข้ามผ่านโฟลเดอร์ทั้งหมดอย่างรวดเร็วหากจำเป็น เป็นต้น ค่าเฉลี่ยสีทองบางชนิด
เก็บเอาไว้
เมื่อเพิ่มไฟล์รวมถึงเมื่อได้รับลิงก์ไปยังไฟล์จะถูกเขียนลงในแคช
ด้วยเหตุนี้ บ่อยครั้งจึงไม่จำเป็นต้องข้ามเครือข่ายทั้งหมดเพื่อค้นหาไฟล์ ซึ่งจะช่วยเพิ่มความเร็วในการรับลิงก์และลดภาระบนเครือข่าย การแคชยังเกิดขึ้นผ่านส่วนหัว http
ไอโซมอร์ฟีย์
ไคลเอนต์เขียนด้วยจาวาสคริปต์และเป็น isomorphic ซึ่งสามารถใช้งานได้โดยตรงจากเบราว์เซอร์
คุณสามารถอัพโหลดไฟล์
ลิงค์ที่เลื่อนออกไป
คุณลักษณะที่น่าสนใจก็คือ "การอ้างอิงที่รอการตัดบัญชี" นี่คือลิงก์ไปยังไฟล์ที่สามารถรับพร้อมกันได้ที่นี่และเดี๋ยวนี้ และไฟล์จะถูกดึงขึ้นมาเมื่อพบแล้วในที่เก็บข้อมูล วิธีนี้จะสะดวกมากเมื่อคุณต้องการแสดงรูปภาพบางส่วนบนเว็บไซต์ เราเพิ่งใส่ลิงค์ที่เลื่อนออกไปใน 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() — รับไฟล์ในรูปแบบหยด (สำหรับเวอร์ชันเบราว์เซอร์)
- async Client.prototype.removeFile() - ลบไฟล์
- Client.prototype.createRequestedFileLink() — สร้างลิงค์เลื่อน
ส่งออกไฟล์ไปยังเซิร์ฟเวอร์อื่น
ในการถ่ายโอนไฟล์ไปยังโหนดอื่น คุณสามารถ:
- เพียงคัดลอกโฟลเดอร์จัดเก็บข้อมูลทั้งหมดพร้อมกับการตั้งค่า (สิ่งนี้อาจไม่ทำงานในอนาคต)
- คัดลอกเฉพาะโฟลเดอร์ที่มีไฟล์ แต่ในกรณีนี้ คุณจะต้องเรียกใช้ฟังก์ชันนี้อีกครั้ง โหนด.normalizeFilesInfo()เพื่อคำนวณข้อมูลทั้งหมดใหม่และป้อนลงในฐานข้อมูล
- ใช้ฟังก์ชั่น โหนดส่งออกไฟล์()ซึ่งจะเริ่มทำการคัดลอกไฟล์
การตั้งค่าโหนดพื้นฐาน
เมื่อเริ่มต้นโหนดจัดเก็บข้อมูล คุณสามารถระบุการตั้งค่าที่จำเป็นทั้งหมดได้
ฉันจะอธิบายสิ่งพื้นฐานที่สุด ส่วนที่เหลือสามารถพบได้บน Github
- storage.dataSize — ขนาดของโฟลเดอร์พร้อมไฟล์
- storage.tempSize — ขนาดโฟลเดอร์ชั่วคราว
- storage.autoCleanSize — ขนาดการจัดเก็บขั้นต่ำที่ต้องเก็บไว้ หากคุณระบุพารามิเตอร์นี้ ทันทีที่พื้นที่เริ่มหมด ไฟล์ที่ใช้น้อยที่สุดจะถูกลบ
- ไฟล์.maxSize - ขนาดไฟล์สูงสุด
- ไฟล์.minSize - ขนาดไฟล์ขั้นต่ำ
- file.preferredDuplicates — จำนวนไฟล์ที่ต้องการซ้ำบนเครือข่าย
- file.mimeWhitelist - ประเภทไฟล์ที่ถูกต้อง
- ไฟล์.mimeBlacklist - ประเภทไฟล์ไม่ถูกต้อง
- file.extWhitelist - นามสกุลไฟล์ที่ถูกต้อง
- file.extBlacklist - นามสกุลไฟล์ไม่ถูกต้อง
- ไฟล์.linkCache - การตั้งค่าแคชลิงก์ต่างๆ
พารามิเตอร์เกือบทั้งหมดที่เกี่ยวข้องกับมิติสามารถป้อนได้ทั้งค่าสัมบูรณ์และค่าสัมพัทธ์
ทำงานผ่านบรรทัดคำสั่ง
สามารถใช้ไลบรารีผ่านบรรทัดคำสั่งได้ ในการดำเนินการนี้ คุณจะต้องติดตั้งทั่วโลก: npm ฉัน -g storacle. หลังจากนี้ คุณสามารถเริ่มการดำเนินการที่จำเป็นได้จากไดเร็กทอรีโปรเจ็กต์ที่มีโหนดอยู่ ตัวอย่างเช่น, storacle -a storeFile -f ./file.txt -c ./config.jsเพื่อเพิ่มไฟล์. สามารถดูการดำเนินการทั้งหมดได้ใน
ทำไมคุณถึงต้องการสิ่งนี้?
- หากคุณต้องการสร้างโปรเจ็กต์แบบกระจายอำนาจที่คุณวางแผนจะจัดเก็บและทำงานกับไฟล์โดยใช้วิธีที่สะดวก ตัวอย่างเช่น โครงการเพลงที่อธิบายไว้ในลิงก์ตอนต้นของบทความใช้ ที่เก็บ.
- หากคุณทำงานในโครงการอื่นที่คุณต้องการจัดเก็บไฟล์ในลักษณะกระจาย คุณสามารถสร้างเครือข่ายแบบปิด กำหนดค่าโหนดได้อย่างยืดหยุ่น และเพิ่มเครือข่ายใหม่เมื่อจำเป็น
- หากคุณต้องการจัดเก็บไฟล์เว็บไซต์ของคุณไว้ที่ใดที่หนึ่งและมันมากเกินไปสำหรับคุณที่จะเขียนทุกอย่างด้วยตัวเอง บางทีห้องสมุดนี้อาจเหมาะสมกว่าห้องสมุดอื่นในกรณีของคุณ
- หากคุณมีโปรเจ็กต์ที่คุณทำงานกับไฟล์ แต่ต้องการดำเนินการจัดการทั้งหมดจากเบราว์เซอร์ คุณสามารถหลีกเลี่ยงการเขียนโค้ดเซิร์ฟเวอร์ได้
ผู้ติดต่อของฉัน:
ที่มา: will.com