SKILL.md
grpc_server
Implementa un servidor gRPC para la comunicación de baja latencia entre los microservicios de inferencia del sistema de verificación de identidad. Reemplaza las llamadas REST entre servicios internos (face recognition, liveness detection, OCR, anti-spoofing) con comunicación binaria serializada mediante Protocol Buffers, reduciendo significativamente la latencia y el overhead de red en el pipeline.
When to use
Usa esta skill cuando necesites implementar o configurar la comunicación gRPC entre microservicios de inferencia dentro del modelserveragent. Aplica cuando la latencia de comunicación REST entre servicios internos impacte el objetivo de tiempo de respuesta total de 8 segundos del pipeline de verificación.
Instructions
- Definir los servicios y mensajes en archivos
.protopara cada módulo de inferencia:
```protobuf syntax = "proto3"; package kyc.inference;
service FaceRecognitionService { rpc GetEmbedding (FaceRequest) returns (EmbeddingResponse); rpc CompareFaces (FaceCompareRequest) returns (MatchResponse); }
message FaceRequest { bytes imagedata = 1; string sessionid = 2; }
message EmbeddingResponse { repeated float embedding = 1; float confidence = 2; int64 inferencetimems = 3; }
message MatchResponse { float similarityscore = 1; bool ismatch = 2; float threshold_used = 3; } ```
- Generar el código Python a partir de los archivos proto:
``bash python -m grpctools.protoc -I./protos \ --pythonout=./generated \ --grpcpythonout=./generated \ protos/face_recognition.proto ``
- Implementar el servidor gRPC con el servicio de inferencia:
```python import grpc from concurrent import futures from generated import facerecognitionpb2grpc as pb2grpc
class FaceRecognitionServicer(pb2grpc.FaceRecognitionServiceServicer): def init(self, modelrunner): self.model = model_runner
def GetEmbedding(self, request, context): image = self.deserializeimage(request.image_data) embedding = self.model.predict(image) return EmbeddingResponse(embedding=embedding.tolist())
server = grpc.server(futures.ThreadPoolExecutor(maxworkers=10)) pb2grpc.addFaceRecognitionServiceServicertoserver(servicer, server) server.addinsecure_port('[::]:50051') server.start() ```
- Configurar interceptores para logging, métricas y autenticación entre servicios:
``python class MetricsInterceptor(grpc.ServerInterceptor): def interceptservice(self, continuation, handlercalldetails): starttime = time.time() response = continuation(handlercalldetails) latency = time.time() - starttime metrics.recordgrpclatency(handlercall_details.method, latency) return response ``
- Implementar el cliente gRPC para que los servicios consumidores (API gateway, motor de decisión) invoquen la inferencia:
``python channel = grpc.insecurechannel('model-server:50051') stub = pb2grpc.FaceRecognitionServiceStub(channel) response = stub.GetEmbedding(FaceRequest(imagedata=imagebytes, sessionid=sessionid)) ``
- Configurar health checking gRPC para integración con Kubernetes readiness/liveness probes:
``python from grpchealth.v1 import healthpb2grpc, health healthservicer = health.HealthServicer() healthpb2grpc.addHealthServicertoserver(healthservicer, server) ``
- Habilitar compresión gzip para las imágenes transmitidas entre servicios y configurar timeouts apropiados para cada tipo de llamada de inferencia.
Notes
- Usar comunicación gRPC solo para la capa interna entre microservicios de inferencia; la API pública del sistema KYC debe mantener REST/HTTP para compatibilidad con clientes frontend.
- La serialización binaria de Protocol Buffers reduce significativamente el tamaño de las imágenes transmitidas entre servicios comparado con JSON/base64, lo cual es crítico para el pipeline facial donde se transfieren múltiples imágenes por verificación.
- Configurar deadlines (timeouts) por tipo de llamada: face embedding (~500ms), liveness check (~1s), face comparison (~300ms) para evitar que un servicio lento bloquee el pipeline completo.