paint-brush
A GitHub titkos tervének bemutatása – Hogyan kezeljük a tranzakciók millióit napontaáltal@oleksiijko
183 olvasmányok Új történelem

A GitHub titkos tervének bemutatása – Hogyan kezeljük a tranzakciók millióit naponta

által Oleksii Bondar6m2025/03/02
Read on Terminal Reader

Túl hosszú; Olvasni

A GitHub egy rendkívül méretezhető elosztott rendszer, amely naponta több millió tranzakciót dolgoz fel. Robusztus algoritmusokra és architektúrára támaszkodik a nagy teljesítmény és megbízhatóság biztosítása érdekében. Ez a cikk azt vizsgálja, hogy a GitHub hogyan dolgoz fel hatalmas mennyiségű adatot, és hogyan alkalmaz különbségi algoritmusokat a fájlváltozások hatékony nyomon követésére.
featured image - A GitHub titkos tervének bemutatása – Hogyan kezeljük a tranzakciók millióit naponta
Oleksii Bondar HackerNoon profile picture
0-item
1-item

A GitHub több, mint pusztán tárhelyek tárolására szolgáló platform – ez egy rendkívül méretezhető elosztott rendszer, amely naponta több millió tranzakciót dolgoz fel. A git push kérések kezelésétől a fájlkülönbségek hatékony kiszámításáig a GitHub robusztus algoritmusokra és architektúrára támaszkodik a nagy teljesítmény és megbízhatóság biztosítása érdekében.


Ez a cikk azt vizsgálja, hogy a GitHub hogyan dolgoz fel hatalmas mennyiségű adatot, hogyan skálázódik tranzakciók millióinak kezelésére, és hogyan alkalmaz differenciális algoritmusokat a fájlváltozások hatékony nyomon követésére. A cikk a verziókezelő rendszerekben használt alapvető algoritmusok részletes JavaScript-megvalósításait is tartalmazza.


1. A nagyszabású verzióvezérlő rendszerek kihívásai.

A modern verziókezelő rendszereknek számos kulcsfontosságú kihívással kell szembenézniük:


  • Naponta tranzakciók millióinak feldolgozása, beleértve a véglegesítéseket, egyesítéseket és lehívási kérelmeket.
  • A fájlok közötti különbségek hatékony kiszámítása, ami kritikus a verziókövetéshez és egyesítéshez.
  • A tárolási és feldolgozási teljesítmény skálázása, gyors válaszidő biztosítása a fejlesztők számára világszerte.


Ezek az elvek nem kizárólagosak a GitHubra. Hasonló architektúrákat és algoritmusokat használnak a GitLab, a Bitbucket és más olyan platformok, amelyek nagyarányú verziókezeléssel foglalkoznak.



2. Hogyan számítja ki a GitHub a fájlkülönbségeket (különböző algoritmus-implementáció JavaScriptben)

A fájl változásainak nyomon követésekor a GitHub (és maga a Git) diff-algoritmusokat használ a szerkesztések minimális számának kiszámításához, amelyek egy fájl egyik verziójának egy másikra való átalakításához szükségesek. Erre egy széles körben használt algoritmus a Myers' Diff Algorithm.

2.1. Hogyan működik Myers algoritmusa.

Myers algoritmusa megtalálja a beszúrások és törlések legrövidebb sorozatát, amely az egyik fájl másikká konvertálásához szükséges. Úgy működik, hogy iterálja a lehetséges szerkesztési távolságokat (d), és kiszámítja a lehetséges transzformációkat a szerkesztési grafikon „átlói” mentén.


2.2. Myers algoritmusának JavaScript megvalósítása.


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


A kód bontása:


  • Inicializálás: Az algoritmus inicializál egy v tömböt, hogy a szerkesztési grafikonon minden átlóhoz a maximális x értékeket tárolja.

  • Hurok a lehetséges szerkesztési távolságokon (d): Iterál minden lehetséges számú szükséges szerkesztést.

  • Az optimális elérési út kiszámítása: A v[k] értékek alapján határozza meg, hogy beszúrjon vagy töröljön.

  • „Mohó egyezés” lépés: Átlósan mozog, amíg a karakterek egyeznek, minimalizálva a szükségtelen műveleteket.


3. A GitHub tranzakciófeldolgozási architektúrája.

A tranzakciók millióinak kezelésére a GitHub többrétegű architektúrát alkalmaz. Így zajlik egy tipikus tranzakció:


  1. A kérés fogadása: Az API és a Webhooks fogadja a tranzakciókat (git push, git pull stb.).
  2. A kérés sorba állítása: A tranzakciók egy elosztott sorba (Redis/Kafka) kerülnek párhuzamos feldolgozásra.
  3. Feldolgozás mikroszolgáltatásokban: A dedikált szolgáltatások kezelik az indexelést, a diff-számítást és a statisztikák frissítését.
  4. Tárhely frissítése: Az eredményeket egy adatbázisban (SQL/NoSQL) tároljuk, és gyorsítótárban tároljuk a gyors hozzáférés érdekében.


Ez az architektúra lehetővé teszi a GitHub számára a hatékony skálázást, biztosítva, hogy egyetlen összetevő se váljon szűk keresztmetszetté


4. A GitHub-szerű tranzakciófeldolgozás JavaScript-megvalósítása.

A GitHub aszinkron módon dolgozza fel a tranzakciókat a nagy forgalom kezelésére. A következő JavaScript-kód szimulálja a tranzakciók párhuzamos feldolgozását a Promises használatával.


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


A kód legfontosabb elemei:


  • Aszinkron feldolgozás: A tranzakciók párhuzamosan futnak a Promise.all() használatával.
  • Lépésről lépésre történő szimuláció: Minden tranzakció ugyanazt a feldolgozási folyamatot követi – indexelés, eltérések számítása és tárhely frissítése.
  • Skálázhatóság: Hasonló elvek érvényesek a valós rendszerekben, például a GitHubban, ahol a Redis/Kafka várólisták segítik a munkaterhelések elosztását a mikroszolgáltatások között.


5. Következtetés: A GitHub skálázható megközelítése a verziókezeléshez.

A GitHub azon képessége, hogy naponta több millió tranzakciót tudjon feldolgozni, a következők kombinációján alapul:


  • Optimalizált diff-algoritmusok, mint például a Myers' Algorithm, a fájlváltozások hatékony kiszámításához.
  • Skálázható elosztott architektúra, mikroszolgáltatások és üzenetsorok használatával a munkaterhelés kiegyensúlyozására.
  • Párhuzamos tranzakciófeldolgozás, gyors válaszadást biztosít még nagy terhelés esetén is.


Ezek a technikák nem kizárólagosak a GitHubon – széles körben használják a GitLab, a Bitbucket és a nagyméretű adatfeldolgozó rendszerekben. Ezen alapelvek megértése segít a fejlesztőknek hatékony, méretezhető alkalmazásokat készíteni nagy mennyiségű tranzakció kezelésére.