Rangkaian DHT ialah protokol untuk penyimpanan dan carian data teragih. Ia memperoleh maklumat daripada nod yang berbeza, membolehkan nod ini berkongsi sumber dan membentuk rangkaian. Rangkaian DHT ialah rangkaian terdesentralisasi sepenuhnya yang tidak bergantung pada mana-mana nod pusat khusus untuk menyediakan perkhidmatan. Dalam artikel ini, kami akan meneroka cara melaksanakan rangkaian DHT menggunakan Node.js.
Apakah rangkaian DHT?
Rangkaian DHT ialah rangkaian berdasarkan jadual cincang teragih (Distributed Hash Table) yang dibina pada rangkaian sedia ada. Rangkaian DHT membolehkan penyimpanan data terpencar dan perkhidmatan carian antara nod, yang bermaksud bahawa ia tidak perlu bergantung pada nod pusat tertentu untuk menyediakan perkhidmatan kepada nod lain seperti rangkaian tradisional.
Rangkaian DHT mempunyai ciri-ciri berikut:
Rangkaian DHT digunakan terutamanya untuk perkongsian dan carian fail P2P, pengkomputeran teragih dan storan teragih.
Bagaimana untuk melaksanakan rangkaian DHT?
Melaksanakan rangkaian DHT memerlukan menyelesaikan tugas berikut:
Berikut ialah contoh pelaksanaan rangkaian DHT menggunakan Node.js:
Kita boleh menggunakan modul crypto Gunakan fungsi cincang dalam untuk menjana ID, seperti SHA1:
const crypto = require('crypto'); function generateNodeId() { const nodeId = crypto.createHash('sha1') .update(`${Date.now()}_${Math.random()}`) .digest('hex') .substring(0, 20); return nodeId; }
Apabila nod menyertai rangkaian, ia perlu menjana ID terlebih dahulu, kemudian menghantar maklumat gabungan ke nod lain yang diketahui, dan pada masa yang sama masa menyimpan maklumat nod lain di tengah jadual penghalaan.
const Node = require('./node'); const bootstrapNodes = [ { id: 'node1', address: '127.0.0.1:8001' }, { id: 'node2', address: '127.0.0.1:8002' } ]; const node = new Node(generateNodeId(), '127.0.0.1:8000'); for (const bootstrapNode of bootstrapNodes) { node.joinNetwork(bootstrapNode.id, bootstrapNode.address); }
Kita boleh menggunakan tatasusunan untuk melaksanakan jadual penghalaan, di mana setiap elemen mewakili julat ID, contohnya:
ID范围 | 节点列表 |
---|---|
[0, 2^160/2^1) | [node1, node2] |
[2^160/2^1, 2^160/2^2) | [node3, node4] |
... | ... |
Apabila mencari nod, anda boleh mencari nod yang paling hampir dengannya berdasarkan awalan ID, dan kemudian nod akan melakukan carian seterusnya.
Storan data boleh dicapai dengan menyimpan data pada nod yang paling hampir dengan ID data, yang membolehkan data disimpan dengan cekap dalam rangkaian diedarkan. Apabila mencari data, anda hanya perlu mencari nod yang paling hampir dengan ID sasaran daripada jadual penghalaan dan nod akan mencarinya bagi pihak anda. Jika nod tidak menemui data sasaran, ia boleh memajukan permintaan carian ke nod jiran sehingga data sasaran ditemui atau bilangan nod yang dicapai mencapai had atas.
class Node { // ... lookup(key, callback) { const targetId = getKeyId(key); const tableIds = getTableIds(targetId); const closestNodes = this.getClosestNodes(tableIds); const seenNodes = {}; const next = () => { const node = closestNodes.shift(); if (!node || seenNodes[node.id]) { return callback(null, null); } seenNodes[node.id] = true; if (node.id === this.id) { // key found return callback(null, this.store[key]); } else { // find key in next node this.findKeyInNode(node.id, targetId, (err, val) => { if (err || val) { return callback(err, val); } else { return next(); } }); } }; next(); } findKeyInNode(nodeId, targetId, callback) { // send find_key request to node // ... // callback with result if found } }
Ringkasan
Dalam artikel ini, kami memperkenalkan rangkaian DHT dan kaedah pelaksanaannya, dan melaksanakan rangkaian DHT mudah menggunakan Node.js. Oleh kerana rangkaian DHT sangat terpencar dan teratur sendiri, ia mampu memainkan peranan penting dalam pengkomputeran dan penyimpanan teragih. Bagi pembangun yang perlu membina aplikasi teragih, amat berguna untuk membiasakan diri dengan rangkaian DHT dan belajar menggunakan Node.js untuk melaksanakannya.
Atas ialah kandungan terperinci rangkaian dht melaksanakan nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!