paint-brush
„GitHub“ slapto plano atskleidimas – kaip kasdien atlikti milijonus operacijųpateikė@oleksiijko
183 skaitymai Nauja istorija

„GitHub“ slapto plano atskleidimas – kaip kasdien atlikti milijonus operacijų

pateikė Oleksii Bondar6m2025/03/02
Read on Terminal Reader

Per ilgai; Skaityti

„GitHub“ yra labai keičiamo dydžio paskirstyta sistema, kasdien apdorojanti milijonus operacijų. Jis remiasi patikimais algoritmais ir architektūra, kad užtikrintų aukštą našumą ir patikimumą. Šiame straipsnyje nagrinėjama, kaip „GitHub“ apdoroja didžiulius duomenų kiekius ir naudoja diferencijavimo algoritmus, kad galėtų efektyviai sekti failų pakeitimus.
featured image - „GitHub“ slapto plano atskleidimas – kaip kasdien atlikti milijonus operacijų
Oleksii Bondar HackerNoon profile picture
0-item
1-item

„GitHub“ yra daugiau nei tik saugyklų prieglobos platforma – tai labai keičiamo dydžio paskirstyta sistema, kasdien apdorojanti milijonus operacijų. Nuo „git push“ užklausų tvarkymo iki efektyvaus failų skirtumų skaičiavimo, „GitHub“ remiasi patikimais algoritmais ir architektūra, kad užtikrintų aukštą našumą ir patikimumą.


Šiame straipsnyje nagrinėjama, kaip „GitHub“ apdoroja didžiulius duomenų kiekius, keičia milijonus operacijų ir naudoja diferencijavimo algoritmus, kad galėtų efektyviai sekti failų pakeitimus. Straipsnyje taip pat pateikiami išsamūs pagrindinių algoritmų, naudojamų versijų valdymo sistemose, „JavaScript“ diegimai.


1. Didelio masto versijų valdymo sistemų iššūkiai.

Šiuolaikinės versijų valdymo sistemos turi susidoroti su keliais pagrindiniais iššūkiais:


  • Per dieną apdorojama milijonai operacijų, įskaitant įsipareigojimų, sujungimų ir ištraukimo užklausas.
  • Efektyviai apskaičiuoja failų skirtumus, o tai labai svarbu sekant ir sujungiant versijas.
  • Padidinkite saugojimo ir apdorojimo galią, užtikrindami greitą atsako laiką kūrėjams visame pasaulyje.


Šie principai nėra išskirtiniai „GitHub“. Panašios architektūros ir algoritmai naudojami „GitLab“, „Bitbucket“ ir kitose platformose, kurios sprendžia versijų valdymą dideliu mastu.



2. Kaip „GitHub“ apskaičiuoja failų skirtumus (skirtingo algoritmo diegimas „JavaScript“)

Stebėdamas failo pakeitimus, „GitHub“ (ir pats „Git“) naudoja diferencijavimo algoritmus, kad apskaičiuotų minimalų pakeitimų skaičių, reikalingą vienai failo versijai paversti kita. Plačiai naudojamas algoritmas yra Myers' Diff Algorithm.

2.1. Kaip veikia Myerso algoritmas.

Myers algoritmas suranda trumpiausią įterpimų ir ištrynimų seką, reikalingą norint konvertuoti vieną failą į kitą. Jis veikia kartodamas galimus redagavimo atstumus (d) ir apskaičiuodamas galimas transformacijas pagal „įstrižaines“ redagavimo grafike.


2.2. Myerso algoritmo „JavaScript“ diegimas.


 /** * 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}`);


Kodo suskirstymas:


  • Inicijavimas: algoritmas inicijuoja masyvą v, kad išsaugotų maksimalias x reikšmes kiekvienai redagavimo grafiko įstrižainei.

  • Pereikite per galimus redagavimo atstumus (d): kartoja kiekvieną galimą reikalingų pakeitimų skaičių.

  • Optimalaus kelio apskaičiavimas: pagal v[k] reikšmes nustatoma, ar įterpti, ar ištrinti.

  • Žingsnis „Godus atitikmuo“: juda įstrižai tol, kol sutampa simboliai, sumažinant nereikalingas operacijas.


3. GitHub operacijų apdorojimo architektūra.

Norėdami tvarkyti milijonus operacijų, „GitHub“ naudoja daugiasluoksnę architektūrą. Štai kaip vyksta įprastas sandoris:


  1. Užklausos gavimas: API ir Webhooks gauna operacijas (git push, git pull ir kt.).
  2. Prašymo sudarymas eilėje: operacijos dedamos į paskirstytą eilę (Redis/Kafka) lygiagrečiam apdorojimui.
  3. Apdorojimas mikropaslaugose: skirtos paslaugos tvarko indeksavimą, diferencijavimo skaičiavimą ir statistikos atnaujinimus.
  4. Atnaujinama saugykla: rezultatai saugomi duomenų bazėje (SQL / NoSQL) ir talpykloje, kad būtų galima greitai pasiekti.


Ši architektūra leidžia „GitHub“ efektyviai keisti mastelį ir užtikrinti, kad nė vienas komponentas netaptų kliūtimi


4. „GitHub“ tipo operacijų apdorojimo „JavaScript“ diegimas.

„GitHub“ apdoroja operacijas asinchroniškai, kad būtų galima valdyti didelį srautą. Šis JavaScript kodas imituoja lygiagretų operacijų apdorojimą naudojant pažadus.


 /** * 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();


Pagrindiniai šio kodo elementai:


  • Asinchroninis apdorojimas: operacijos vykdomos lygiagrečiai naudojant Promise.all().
  • Žingsnis po žingsnio modeliavimas: kiekviena operacija atliekama pagal tą patį apdorojimo srautą – indeksuojama, skaičiuojami skirtumai ir atnaujinama saugykla.
  • Mastelio keitimas: panašūs principai taikomi realiose sistemose, pvz., „GitHub“, kur „Redis“ / „Kafka“ eilės padeda paskirstyti darbo krūvius mikropaslaugoms.


5. Išvada: „GitHub“ keičiamas versijos valdymo metodas.

„GitHub“ galimybė apdoroti milijonus operacijų per dieną priklauso nuo šių derinio:


  • Optimizuoti diferencijavimo algoritmai, tokie kaip Myerso algoritmas, kad būtų galima efektyviai apskaičiuoti failų pakeitimus.
  • Keičiama paskirstyta architektūra, naudojant mikropaslaugas ir pranešimų eiles darbo krūviui subalansuoti.
  • Lygiagretus operacijų apdorojimas, užtikrinantis greitą atsakymą net esant didelėms apkrovoms.


Šie metodai nėra išskirtiniai „GitHub“ – jie plačiai naudojami „GitLab“, „Bitbucket“ ir didelės apimties duomenų apdorojimo sistemose. Šių principų supratimas padeda kūrėjams kurti efektyvias, keičiamo dydžio programas, skirtas dideliam operacijų kiekiui tvarkyti.