Estudio de caso de diseño de sistemas n.° 2: Cómo indexa GitHub el código para una búsqueda y recuperación increíblemente rápidas

by tiempoantenacom

GitHub⁣ desarrolla su propio motor de⁢ búsqueda de ⁢código en Rust

GitHub ha creado su propio⁤ motor de búsqueda de código llamado Proyecto Blackbird, desarrollado desde cero en Rust. La decisión de‍ crear su propio motor se debió a que las soluciones disponibles en el mercado no⁢ cumplían con los⁣ requisitos de escala ⁣en los que GitHub opera.

El ⁣motor de búsqueda de código de ‌GitHub ofrece funciones específicas para​ búsquedas de código, como búsqueda con identificadores, puntuaciones, subcadenas,‌ expresiones regulares⁤ y⁢ comodines. Además,⁣ es capaz de ​realizar consultas globales en 200 millones ⁢de repositorios y de indexar cambios de código en cuestión de minutos. Con un clúster que cuenta con 5184 vCPU, 40 TB de ‍RAM ⁣y 1,25⁢ PB de ⁤almacenamiento de respaldo, el índice ‌de búsqueda de código de GitHub es ⁣el ⁣más grande de ‌su tipo. Además,‍ puede manejar ‌una carga de consultas de 200 solicitudes por segundo en promedio e indexar más de 53 mil millones de archivos fuente.

Código de indexación

Para indexar los documentos, GitHub utiliza índices que son claves⁣ para listas ⁣ordenadas⁤ de ID de documentos. ​Por ejemplo, para la búsqueda por ⁤lenguajes de programación, se escanean los documentos para⁢ detectar ⁤en qué ⁣lenguaje están escritos y se les asigna una identificación de documento. Luego, se crea un índice invertido donde el lenguaje de⁤ programación es la clave y la lista de ID de documentos donde aparece‍ el⁢ lenguaje de programación es el valor.

N-gramas

El motor de búsqueda⁣ de ⁢código de GitHub utiliza un‌ tipo especial de índice invertido‍ llamado índice de n-gramas. Este ⁤índice permite encontrar subcadenas de contenido y‍ es fundamental para implementar la⁤ funcionalidad “buscar mientras escribe”. Los n-gramas ‌son secuencias de n caracteres o palabras extraídas de un texto determinado. Por ejemplo, en ‍la indexación de 3 gramos, la palabra “Python” se divide ⁤en “pyt”, ‍”yth”, ⁢”tho” y “hon”. Estos ‍n-gramas ⁢se indexan⁢ en una estructura de datos que se asocia⁤ con la ubicación del documento donde ocurren.

Almacenamiento direccionable de contenido

GitHub utiliza ‍una técnica llamada almacenamiento direccionable de contenido para reducir el espacio de almacenamiento y eliminar contenido duplicado. En lugar de guardar los datos según el nombre del archivo o la ubicación, se⁤ almacenan​ en función de un hash único generado⁣ por el contenido. Esto se logra mediante funciones hash como MD5, SHA-1, SHA-2 y SHA-256. El almacenamiento direccionable de⁤ contenido garantiza la ⁣integridad de los datos y⁣ permite acceder a diferentes versiones de los mismos. Esta técnica también ⁢es utilizada por las CDNs para almacenar en caché y distribuir datos de manera eficiente ‍en todo el mundo.

Con el desarrollo de su propio⁣ motor de⁢ búsqueda de código y el uso ⁣de técnicas innovadoras como el almacenamiento direccionable de contenido, GitHub continúa mejorando​ la experiencia​ de búsqueda y navegación en su plataforma, brindando a los desarrolladores herramientas más eficientes y precisas para encontrar el código que necesitan.

GitHub ‍revoluciona el almacenamiento de datos con su sistema ​único

GitHub, la‍ plataforma líder en alojamiento ​de repositorios de código, ha implementado un sistema de almacenamiento de datos revolucionario ⁤que⁢ ha reducido significativamente ⁣el tamaño⁤ total de los ‍datos y ha​ mejorado la escalabilidad‌ del sistema.

Después de⁣ la compresión, el índice completo ahora ocupa solo 25 TB, lo⁢ que​ representa aproximadamente una cuarta parte de los datos originales. Esto incluye⁢ todos los índices, incluidos los índices ngram y todo el contenido⁣ único comprimido. El almacenamiento de contenido direccionable ​ha sido clave para lograr esta reducción⁤ de tamaño.

Una de las ventajas del nuevo sistema de almacenamiento de GitHub ⁤es su ​capacidad para escalar horizontalmente. Los ⁢datos se ‌distribuyen entre fragmentos de manera uniforme según ‌el ‍ID del objeto de blob de Git. Esto permite manejar más‌ consultas ‌por segundo (QPS) al distribuir ⁣las consultas entre ⁤fragmentos y distribuir los datos ‌entre discos para aumentar el espacio de almacenamiento. Además, el tiempo de⁢ indexación ⁢de datos se ha reducido gracias ​a la‌ optimización de los recursos de ​CPU y memoria⁤ de los hosts⁣ individuales.

Almacenamiento de código

Git, el sistema de control de⁣ versiones utilizado⁣ por GitHub, almacena ‌sus datos basados en el hash de contenido como objetos blob ⁢en un almacén de‌ objetos. Este ⁢almacén de objetos funciona como una tabla de​ base de datos clave-valor, donde cada objeto tiene un ID único que se utiliza para recuperarlo.

Aunque Git está ⁣diseñado principalmente para ⁣almacenar código, también puede almacenar otros tipos de datos no estructurados, como ​documentos, ⁢archivos de configuración, imágenes, PDF, entre ⁣otros.‌ La clave ‍única de cada dato (ID de objeto ⁢blob) permite su⁢ fácil recuperación.

En el almacén de objetos, los blobs representan‌ datos sin⁢ procesar‌ y no contienen metadatos como nombres de archivos, nombres de repositorios o⁤ información ⁤de propietarios. Esta ‍información se almacena en árboles,​ que⁣ se combinan con los objetos blob para crear ⁤una jerarquía de archivos en ​un repositorio.

Imagen de origen: GitHub

Código de‌ ingesta e indexación

GitHub ha ⁤desarrollado un sistema eficiente para la ingesta e indexación de código. A través de un diagrama de alto nivel,‌ se puede ‍apreciar cómo funciona este proceso.

Mirlo del motor de búsqueda de ⁤código GitHub
Imagen de origen: GitHub

Con este nuevo sistema de⁣ almacenamiento de datos, ⁤GitHub ha logrado optimizar el rendimiento y la eficiencia ⁤de su plataforma, brindando a ⁢los usuarios una ⁢experiencia mejorada al ​trabajar⁤ con‌ repositorios de código y otros tipos de datos no estructurados.

La tecnología detrás de⁣ la nueva ‍búsqueda ⁢de código de⁤ GitHub

GitHub ha implementado una nueva función de búsqueda⁣ de código que utiliza tecnología avanzada‍ para mejorar la eficiencia⁤ y la⁤ velocidad del proceso. En este artículo, exploraremos cómo funciona esta tecnología y cómo ha optimizado​ el sistema de búsqueda de GitHub.

Eventos y ​rastreadores de ‍ingesta

Cuando⁤ se produce un cambio ⁢en un repositorio de GitHub, se genera un ‍evento que se envía ⁤a través de Kafka. Este evento notifica a los⁣ rastreadores ‌de ingesta del motor de ‌búsqueda ⁤para que puedan ‌procesar el cambio. Los rastreadores extraen⁣ símbolos​ del código,⁣ crean documentos y ‌los almacenan en fragmentos⁣ a ⁢través de Kafka.

El sistema ⁤utiliza la codificación delta para ​reducir el tamaño de los índices de búsqueda. En lugar de ‌almacenar todo⁢ el​ archivo, solo se guardan los⁢ cambios en ‍el código. Esto acelera tanto⁢ el proceso de indexación como las consultas, evitando cálculos innecesarios del archivo ​completo. Esto es especialmente útil⁤ en un sistema donde el contenido cambia constantemente.

Optimización del ‌orden​ de⁣ ingesta

El⁣ motor⁤ de búsqueda ⁤de GitHub optimiza el orden en el que⁣ se ingieren los archivos para aprovechar‌ al máximo la codificación delta. Esto⁢ se logra mediante ⁣la creación de fragmentos de indexación que contienen índices de n-gramas con documentos. Estos ⁤fragmentos‍ se compactan para ⁣agrupar índices más pequeños en índices más grandes, lo que ​permite realizar‍ consultas eficientes antes de ‍que el contenido se descargue al ⁣disco.

El proceso de indexación‍ tiene una capacidad⁢ impresionante ​de ⁤publicar​ alrededor‌ de 120,000 documentos por ‌segundo. ​La indexación de 15.5 mil ‍millones⁢ de documentos lleva aproximadamente ‍36 horas. Sin embargo,​ gracias a la indexación delta, ‍que reduce la cantidad de documentos rastreados en más del 50%, el tiempo de indexación se reduce a​ solo⁣ 18 ⁣horas.

La optimización del orden de ingesta y la codificación delta

Para determinar el orden de ingesta ⁢óptimo⁢ y evaluar la similitud entre repositorios, GitHub ⁤ha desarrollado una ⁢nueva estructura de datos llamada filtro geométrico. Esta estructura de ‌datos probabilística utiliza la aleatorización⁢ y la aproximación para⁢ almacenar y consultar‌ datos‌ de manera eficiente, ⁣incluso con cierto margen de error. El filtro geométrico construye un gráfico que ​representa los repositorios ⁤y calcula un árbol de‍ expansión mínimo para determinar el orden de ingesta óptimo.

Aprendizajes sobre el diseño del sistema

Almacenamiento direccionable de contenido

GitHub utiliza el almacenamiento direccionable de contenido basado en hash para almacenar datos duplicados de manera ⁢eficiente. Este enfoque consiste en almacenar solo una copia ‌original de ⁢los datos en⁢ la base de datos, mientras que las copias⁣ duplicadas ⁢apuntan a ‌la misma‍ ubicación de almacenamiento. Esto se logra mediante la ⁤generación de hashes únicos del contenido de los ‍datos y utilizando estos hashes ‌como claves en un sistema de ‌almacenamiento basado en hash.

Fragmentación ‍basada⁣ en hash

GitHub fragmenta​ los datos de manera uniforme utilizando una fragmentación basada en hash. Esto garantiza ⁢que los datos se distribuyan de ‌manera equitativa entre los fragmentos, lo que facilita el acceso y la recuperación eficiente de los mismos. Además, esta técnica permite que las consultas se distribuyan uniformemente entre los nodos⁤ del clúster, evitando la sobrecarga en algunos nodos específicos.

Árboles para​ almacenar datos‌ jerárquicos

Git utiliza‍ la estructura de datos‌ de​ árbol para almacenar la jerarquía de archivos en un repositorio. ⁣Los árboles son ideales para‍ almacenar datos jerárquicos, ya ‍que modelan ⁣de forma natural las relaciones ‌entre padres e hijos. Esto​ facilita la navegación, ⁢la búsqueda y la clasificación de los datos⁢ con una latencia mínima.

En‌ resumen, la nueva tecnología de búsqueda de código de ‍GitHub utiliza una combinación de técnicas avanzadas, como la codificación delta, el filtro geométrico y la fragmentación basada en‍ hash, para mejorar⁤ la eficiencia y⁣ la velocidad del proceso de búsqueda. Estas innovaciones demuestran‌ el ⁤compromiso de GitHub con​ la ​mejora continua de su plataforma y su capacidad para satisfacer las necesidades de sus usuarios.

Sistemas de archivos: una solución eficiente para ⁤almacenar datos no⁢ estructurados

En el mundo del almacenamiento en la nube, existen diferentes enfoques para almacenar ‌datos, como ‌archivos, bloques⁤ y objetos. Sin embargo, cuando se ‍trata de datos no estructurados con una clave única,⁣ el ‌almacenamiento de objetos es la opción ideal.

GitHub, por ejemplo,​ utiliza el almacenamiento de‌ objetos ⁣para almacenar no‌ solo código, sino también ​imágenes, documentación y archivos PDF. ​Estos tipos de datos no siguen una ⁤estructura específica, por lo que el almacenamiento de objetos se adapta‍ perfectamente a este caso de uso.

Una de las ventajas de los almacenes ⁣de objetos es ⁢que los datos se pueden acceder fácilmente a través de HTTP y compartir ⁢a través de redes de ​entrega ⁤de contenido. Esto‍ permite almacenar y ‍compartir datos heterogéneos como videos,⁤ archivos de audio ‍e imágenes ‍de manera eficiente.

Desacoplando módulos ⁤del sistema con una‌ cola de eventos/agente de mensajes

En el caso de GitHub, se utiliza Kafka como intermediario de mensajes ⁣para desacoplar‍ los módulos de rastreo e indexación. Este enfoque arquitectónico estándar⁢ permite ‌un diseño ⁣de sistema ⁤flexible y débilmente acoplado.

La cola de ⁢eventos actúa como un adaptador entre los diferentes ‌módulos del sistema, permitiendo una comunicación ⁤asincrónica sin bloqueo. Esto significa que los módulos ‍no necesitan⁢ estar listos para procesar eventos simultáneamente, lo que facilita la escalabilidad⁢ y la eficiencia del sistema.

Explorando la arquitectura de mensajería en tiempo real de⁢ Slack

Si estás interesado en conocer más sobre ‍arquitecturas de sistemas‍ en tiempo‌ real, te invitamos a leer nuestro estudio de caso sobre la arquitectura de mensajería en tiempo real de Slack. En este artículo, analizamos cómo Slack⁣ utiliza diferentes tecnologías para ⁢ofrecer una experiencia de mensajería fluida‍ y confiable.

Aprende sobre diseño de sistemas distribuidos a escala web

Si deseas profundizar en los fundamentos ‌del diseño de sistemas a‌ gran escala, te recomendamos ‍nuestra ​ruta de ‍aprendizaje “De⁣ cero a dominio de la arquitectura de software”. Esta⁤ ruta consta de tres cursos diseñados para ⁤llevarte paso ⁢a paso⁢ desde los ‍conceptos básicos hasta convertirte en un‌ profesional en ‌el diseño de sistemas distribuidos a escala web.

En estos cursos, aprenderás sobre arquitectura de software, infraestructura ​en⁤ la nube y diseño de sistemas ‍distribuidos. ⁤Te proporcionaremos⁤ una experiencia de aprendizaje⁤ estructurada que te permitirá adquirir los conocimientos⁣ necesarios para diseñar sistemas similares a los utilizados por plataformas como YouTube, Netflix y ESPN.

Fuente de información: ⁢ Ingeniería GitHub

¡No dudes en‌ contactarme si tienes alguna pregunta! Si este contenido te resultó ⁢útil,‍ te agradecería que lo compartieras para que más personas puedan beneficiarse de él.

¡Hasta la‍ próxima! ¡Saludos!

You may also like

Leave a Comment