Selección y arquitectura de la tecnología de la estación B

prefacio

Taobao, Facebook, Meituan, estas grandes empresas de la industria comenzaron con PHP en los primeros días. PHP tiene las características de proyectos de código abierto ricos y listos para usar. Lo mismo es cierto para la estación B. El historial de desarrollo técnico de la estación B: se desarrolló en lenguaje PHP al principio, y luego la plataforma intermedia de la estación B fue ocupada gradualmente por Node, y la tecnología de fondo se acercó gradualmente a JAVA para una mayor concurrencia, más robustez y gran análisis de datos Esto ha llevado a la confusión general de la tecnología de Bilibili. En la etapa inicial, la estación B tenía fallas casi todos los días. Con la expansión del equipo y el negocio, la presión en todos los aspectos aumentó y hubo incendios en todas partes. El código es caótico y la estructura del marco es caótica, lo que ha llegado al punto en que es difícil de mantener. Es necesario aclarar el contexto. En tales circunstancias, sin duda, lo que se debe hacer es unificar la pila de tecnología. Al final, se encontró que reescribir era la solución óptima. ¿Por qué ir? En el análisis final, reescribir el proyecto de fondo es un intento de Bilibili de unificar la pila de tecnología. En cuanto a por qué se eligió Go al final, es muy importante que Go pueda satisfacer las necesidades de refactorización y optimización de la plataforma Bilibili; I + D El propio director Mao Jian es un fiel predicador del idioma Go.

inserte la descripción de la imagen aquí

Calle principal de la estación B

La estación B, cuando comenzó a separar los extremos delantero y trasero, siguió el primer método. Todavía hay algunas páginas que todavía usan este modelo, por ejemplo: www.bilibili.com/account/his... (ver el código fuente del sitio web). Es una buena forma para páginas que no necesitan SEO. Una vez que se completa el desarrollo de front-end, los js y css correspondientes se empaquetan a través de webpack y se cargan en CDN, y luego el archivo html empaquetado por webpack que hace referencia a los recursos correspondientes se carga en una máquina estática especial, y luego la operación y mantenimiento configura el enrutamiento para transferir la página Just flow through. Los estudiantes de back-end solo necesitan proporcionar la interfaz API correspondiente. Los extremos frontal y posterior se mantienen por separado, y usted sigue su propio ritmo, lo que reduce el acoplamiento entre la página y el servicio.Este
método es, de hecho, un método que puede separar rápidamente los extremos frontal y posterior. Nos tomó un tiempo refactorizar usando vue en el lado de la PC y reaccionar en el lado móvil H5. El progreso es rápido, pero las desventajas se muestran lentamente.
En la primera pantalla, debido a que tiene que esperar a que se cargue el recurso antes de renderizar, causará una pantalla blanca en la primera pantalla. Si es una sola página, está bien, pero si es una aplicación de spa, es el tiempo de carga será muy largo. El tiempo de pantalla blanca afectará en gran medida la experiencia del usuario, y debido a que las empresas de búsqueda nacionales no son muy compatibles con las aplicaciones de spa, la representación del lado del cliente será muy poco amigable para el SEO, y las páginas con necesidades de SEO son urgentes. necesidad de renderizado del lado del servicio.

(En la página de inicio de la estación B, el módulo de la derecha hace la representación del lado del servidor y el módulo de la izquierda no hace la representación del lado del servidor).
Luego, depender del nodo para la representación del lado del servidor se incluye en la agenda.

selección

Primero, seleccione el marco de nodo. Hay tres marcos principales en el mercado, hapi express koa, y algunos marcos que han sido empaquetados y personalizados, como eggjs. Excluí
eggjs desde el principio. La función es muy poderosa, hay muchas funciones, algunas de las cuales no son necesarias en absoluto, lo que hace que no sea liviano. En segundo lugar, eggjs es una caja negra para mí. Si hay algún problema, gastaré mucho dinero para resolverlo. Mucho tiempo. (Pero todavía tomé prestado de eggjs en muchos lugares, después de todo, es muy poderoso)
Luego, los tres marcos restantes, express es relativamente fácil de usar y los documentos son más
completos, así que elegí express (fue refactorizado más tarde) = =!)
Luego está la selección del marco de front-end porque hay muchos marcos de front-end convencionales, como ng rv, etc. Estoy usando react y vue. Tienen la ventaja de que pueden ser isomorfos en el frente. y back-ends, y no es necesario usar la misma lógica. Escriba dos copias, es genial

(La lógica isomórfica probablemente sea así).
Dado que los extremos frontal y posterior se separaron antes, la PC se refactorizó con vue, por lo que, naturalmente, esta vez la representación del servidor también se basa en vue y usa vue ssr (esto también es para La última idea sentó las bases)
Primero, elijamos una página simple para la prueba, usemos la página de etiquetas (el niño elegido por Dios: www.bilibili.com/tag/3503159)

Análisis de pila de tecnología Golang de la estación B

pila de tecnología Selección de tecnología Link de referencia
RPC El marco Warden basado en el paquete grpc ha sido de código abierto https://github.com/bilibili/kratos
Marco HTTP El marco maestro de la hoja basado en el paquete gin ha sido de código abierto como se indica arriba
Registro y descubrimiento de servicios En la etapa inicial, era zk, y luego se cambió gradualmente para referirse al descubrimiento de desarrollo propio del sistema Spring Cloud Eureka, que ha sido de código abierto https://github.com/bilibili/discovery
almacenamiento DB, redis, memcache, hbase almacenan información de kv de usuario y registros históricos, la biblioteca empaquetada biblioteca/base de datos/biblioteca cliente ha sido de código abierto https://github.com/bilibili/kratos
buscar Los videos, usuarios, registros de historial, etc. de la estación B usan es para buscar, y el cliente ha sido encapsulado en la biblioteca básica biblioteca/base de datos/elastic
almacenamiento de archivos pequeños El bfs desarrollado por Mao Jian es de código abierto. https://www.toutiao.com/i6272104949560115714/ https://github.com/Terry-Mao/bfs
cola de mensajes Bus de datos basado en el paquete kafka
registro Un marco de registro basado en el paquete zap de uber
Centro de configuración y configuración Admite la lectura de la configuración de las variables de entorno, el análisis de la configuración de toml y el centro de configuración remoto compatible (de desarrollo propio, almacenamiento mysql, aterrizaje local, protocolo http, encuesta larga, el cliente tiene eventos de actualización, similar al código abierto Apollo de Ctrip)
monitor Al usar Prometheus de código abierto, el marco y las bibliotecas (sql, redis, hbase, etc.) tienen puntos de conteo y puntos de estadísticas de tiempo preincrustados, y también se pueden usar en la lógica comercial.
rastro trace parece estar basado en agentes, utilizando un socket de dominio de Unix para la transmisión, y el marco y la biblioteca están enterrados previamente. library/net/trace.go
Gestión de procesos de I+D TAPD, jaja, hay información relacionada con la estructura tapd

Entre ellos, RPC, el marco HTTP y algunos paquetes de biblioteca para el acceso a datos, incluidas las herramientas de generación, son todos de código abierto en github con el proyecto kratos (https://github.com/bilibili/kratos Kratos es un conjunto de marcos de microservicio Go código abierto de bilibili, que incluye una gran cantidad de marcos y herramientas relacionados con microservicios)


La introducción detallada del middleware actualmente utilizado y empaquetado por la estación B se
menciona en el intercambio de Gopher China 2017 estación
B. .jianshu.com/p/923917220d23
Desarrollo del sistema de operación y mantenimiento de la estación B
https://myslide.cn/slides/ 3840

Breve presentación de Mao Jian, director técnico de bilibili

Mao Jian, director técnico de bilibili, ha sido responsable de la infraestructura y la plataforma UGC en bilibili (estación B) desde 2015, desarrolló el goim de servicio push de código abierto para bombardeo en vivo, almacenamiento distribuido BFS para la estación B, guió el desarrollo de B station cache proxy, bili twemproxy, etc., iteraron y reconstruyeron la arquitectura del sitio maestro histórico. Trabajaron en Cheetah Mobile durante los últimos seis años, trabajaron como DBA de MySQL y desarrollaron C. Entre ellos, gopush-cluster fue desarrollado para el sistema push de Cheetah Mobile. Me gusta el diagnóstico del rendimiento del servicio de aplicaciones, la investigación del kernel y la evolución estable de la arquitectura del lado del servidor. El profesional más valioso (TVP) de Tencent Cloud. Responsable del departamento de plataforma de datos de bilibili, con casi diez años de experiencia en investigación y desarrollo del lado del servidor. Bueno en el desarrollo de servidores de alto rendimiento y alta disponibilidad, familiarizado con Go, Java, C y otros lenguajes. Participó en la estación B, transformación completa de arquitectura monolítica a microservicios, incluida la gobernanza de microservicios, diseño de disponibilidad de microservicios, diseño de consistencia de datos de microservicios, middleware de microservicios, monitoreo de microservicios, recopilación de registros de microservicios, equilibrio de carga de microservicios y desarrollo de marco RPC de microservicios, etc.
Proyectos más influyentes en la industria del código abierto:

  • goim https://github.com/Terry-Mao/goim Servicio de difusión de conexión larga de mensajería instantánea distribuida;
  • bfs https://github.com/Terry-Mao/bfs almacenamiento de archivos pequeños distribuidos;

Supongo que te gusta

Origin blog.csdn.net/jgku/article/details/128447915
Recomendado
Clasificación