
GitHub diňe bir ammarlary ýerleşdirmek üçin platforma däl, eýsem her gün millionlarça amallary gaýtadan işleýän ýokary göwrümli paýlanan ulgam. GitHub haýyşlaryny işlemekden başlap, faýl tapawudyny netijeli hasaplamaga çenli, GitHub ýokary öndürijiligi we ygtybarlylygy üpjün etmek üçin berk algoritmlere we arhitektura bil baglaýar.
Bu makala, GitHub-yň köp mukdarda maglumatlary, millionlarça amallary dolandyrmak üçin terezini we faýl üýtgemelerini netijeli yzarlamak üçin dürli algoritmleri ulanýandygyny öwrenýär. Makalada wersiýa gözegçilik ulgamlarynda ulanylýan esasy algoritmleriň JavaScript jikme-jiklikleri hem bar.
Häzirki zaman wersiýa dolandyryş ulgamlary birnäçe möhüm kynçylyklary başdan geçirmeli:
Bu ýörelgeler diňe GitHub-a degişli däl. Şuňa meňzeş arhitektura we algoritmler GitLab, Bitbucket we göwrümde wersiýa gözegçilik bilen meşgullanýan beýleki platformalarda ulanylýar.
Faýldaky üýtgeşmeleri yzarlanda, GitHub (we Gitiň özi) faýlyň bir wersiýasyny beýlekisine öwürmek üçin zerur bolan iň az üýtgeşmäni hasaplamak üçin diff algoritmleri ulanýar. Munuň üçin giňden ulanylýan algoritm Myers 'Diff algoritmidir.
Myersiň algoritmi, bir faýly başga bir faýla öwürmek üçin zerur bolan goýulmalaryň we öçürmeleriň iň gysga yzygiderliligini tapýar. Mümkin bolan redaktirleme aralyklaryny (d) gaýtalamak we redaktirleme grafasyndaky “diagonallar” boýunça bolup biljek üýtgeşmeleri hasaplamak arkaly işleýär.
/** * Computes the minimum edit distance between two arrays using Myers' Diff Algorithm. * @param {Array} a - The original array (eg, characters of a file) * @param {Array} b - The modified array * @returns {number} The minimum number of edit operations required */ function myersDiff(a, b) { const N = a.length; const M = b.length; const maxD = N + M; let v = { 1: 0 }; for (let d = 0; d <= maxD; d++) { for (let k = -d; k <= d; k += 2) { let x; if (k === -d || (k !== d && (v[k - 1] || 0) < (v[k + 1] || 0))) { x = v[k + 1] || 0; } else { x = (v[k - 1] || 0) + 1; } let y = x - k; while (x < N && y < M && a[x] === b[y]) { x++; y++; } v[k] = x; if (x >= N && y >= M) { return d; } } } return maxD; } // Example usage: const oldVersion = Array.from("Hello World"); const newVersion = Array.from("Hello GitHub World"); const operations = myersDiff(oldVersion, newVersion); console.log(`Minimum number of edits: ${operations}`);
Koduň bozulmagy:
Başlangyç: Algoritm redaktirleme grafiginde her diagonal üçin iň ýokary x bahalary saklamak üçin v massiwini başlaýar.
Mümkin bolan redaktirleme aralyklaryndan aýlaň (d): Gerekli üýtgeşmeleriň sanyny gaýtalaň.
Iň amatly ýoly hasaplamak: v [k] bahalaryna esaslanyp salmaly ýa-da pozmalydygyny kesgitleýär.
“Açgöz oýun” ädimi: Gereksiz amallary azaldyp, simwollar gabat gelýänçä diagonally hereket edýär.
Millionlarça amallary amala aşyrmak üçin GitHub köp gatly arhitekturany ulanýar. Ine, adaty bir geleşigiň akymy:
Bu arhitektura, GitHub-a hiç bir komponentiň päsgelçilik bolup bilmezligini netijeli ölçemäge mümkinçilik berýär
GitHub ýokary traffigi dolandyrmak üçin amallary birkemsiz işleýär. Aşakdaky JavaScript kody, Wadalary ulanyp, amallaryň paralel gaýtadan işlenmegini simulasiýa edýär.
/** * Simulates a transaction in a version control system. */ class Transaction { constructor(id, action, payload) { this.id = id; this.action = action; this.payload = payload; } } /** * Simulates processing a transaction step-by-step. * @param {Transaction} tx - The transaction to process * @returns {Promise<string>} The result of processing */ function processTransaction(tx) { return new Promise((resolve) => { console.log(`Processing transaction ${tx.id}: ${tx.action}`); setTimeout(() => { console.log(`Indexing ${tx.id}...`); setTimeout(() => { console.log(`Computing diff for ${tx.id}...`); setTimeout(() => { console.log(`Updating database for ${tx.id}...`); resolve("success"); }, 100); }, 50); }, 100); }); } /** * Simulates processing multiple transactions in parallel. */ async function processTransactions() { const transactions = [ new Transaction("tx001", "commit", "Modified file A"), new Transaction("tx002", "commit", "Fixed bug in file B"), new Transaction("tx003", "merge", "Merged branches"), ]; const promises = transactions.map(async (tx) => { const result = await processTransaction(tx); console.log(`Transaction ${tx.id} result: ${result}`); }); await Promise.all(promises); console.log("All transactions processed."); } // Run transaction processing processTransactions();
Bu koddan esasy netijeler:
GitHub-yň günde millionlarça amallary gaýtadan işlemek ukyby:
Bu usullar diňe GitHub-a mahsus däl, olar GitLab, Bitbucket we uly göwrümli maglumatlary gaýtadan işlemek ulgamlarynda giňden ulanylýar. Bu ýörelgelere düşünmek işläp düzüjilere ýokary göwrümli amallary dolandyrmak üçin täsirli, ulaldylan programmalary gurmaga kömek edýär.