Análisis de código fuente gRPC Solicitud RPC síncrona y análisis de cola de finalización

Arquitectura de la cola de finalización de gRPC

Esquema de gRPC cq

 

  • grpc utiliza complete_queue para almacenar en caché los eventos, generalmente como solicitudes rpc.
  • Use grpc_cq_end_op para agregar eventos a cq, use grpc_completion_queue_next o pulse para obtener eventos de la cola.
  • La diferencia entre next / pluck es que luego toma los eventos de la cola en orden, y pluck puede obtener eventos específicos al especificar las condiciones de la etiqueta.

 

A continuación, entendemos el uso específico de complete_queue a través del flujo de proceso de solicitudes RPC sincrónicas.

  • Para grpc_server, el número especificado de cqs se usa para procesar solicitudes RPC de acuerdo con la configuración al inicio. El valor predeterminado es 1.
  • Para cada cq, se inicia un ThreadManager (grupo de subprocesos) que procesa, que usa 1 ~ subprocesos centrales de CPU para procesar solicitudes epoll, y luego usa otros subprocesos dinámicos para procesar métodos RPC específicos.
  • Para cada método RPC registrado en grpc_server, se administrará con register_method, cada register_method tiene un request_matcher para rastrear la solicitud RPC recibida

request_matcher rastrea las solicitudes RPC de la siguiente manera:

  1. Mantenga internamente un número fijo de tokens (el número de tokens es el mismo que el número de cq). Si hay un token cuando llega la solicitud, especifique para ponerlo en la cola de cq. Si el token se consume actualmente, se colocará en la cola para ser procesado (la solicitud está en estado pendiente).
  2. grpc_server solicitará un token cada vez que reciba una solicitud RPC. Al procesar realmente el método RPC, devolverá el token y, al mismo tiempo, determinará si hay una solicitud de estado pendiente para procesar.
  3. A través de este mecanismo, cierto control de flujo se realiza en solicitudes RPC.

Las diversas relaciones de objeto mencionadas anteriormente se muestran a continuación:

 

Veamos cómo usar la cola cuando llega la solicitud RPC.

La relación general que involucra a los objetos es la siguiente:

Un cq generalmente consta de 3 partes

  1. El encabezado de estructura grpc_completion_queue se usa para almacenar información de gestión de colas.
  2. complete_queue_data, almacenamiento de datos en cola. Almacenar eventos internamente a través de grpc_cq_event_queue. Esta cola es una MPSC (cola de un solo productor multiproductor), cuando solo hay un consumidor, no tiene bloqueos y tiene un alto rendimiento. Cuando hay varios consumidores, el bloqueo se utilizará para la sincronización.
  3. grpc_pollset se usa para administrar el fd en cuestión, impulsando el bucle de eventos

Cuando llega una solicitud RPC, grpc_cq_end_op encapsula la solicitud RPC en grpc_cq_completion y la coloca en la cola. Si es el primer evento en la cola, llamará a la patada de grpc_pollset para despertar a un trabajador para completar la tarea.

230 artículos originales publicados · 160 alabanzas · 820,000 visitas

Supongo que te gusta

Origin blog.csdn.net/happyAnger6/article/details/103997269
Recomendado
Clasificación