Saltar al contenido principal
A partir de la pasarela 0.15.9 los clientes pueden enviar por gRPC además de por REST y SMPP, y recoger los acuses de entrega de un feed duradero en lugar de mantener un webhook. El lado del cliente se describe en API gRPC; esta página es la del operador.
gRPC está desactivado salvo que lo configures. Actualizar a 0.15.9 no cambia nada que un cliente pueda ver: sin un puerto gRPC la pasarela responde a cada llamada gRPC UNAVAILABLE (GRPC_DISABLED), y la API REST se comporta exactamente igual que antes.

Activarla

Establece el puerto en el archivo de entorno y reinicia:
O deja que lo escriba el instalador, en una instalación nueva o en una existente:
update escribe el puerto solo cuando pasas --grpc o --grpc-port; sin ellos, un valor existente se muestra y se deja como está, y nunca se añade uno.
Nunca des a gRPC el puerto de gestión (9000) ni el puerto REST. El instalador rechaza un puerto gRPC que ya sea el puerto SMPP, HTTP o de gestión de la instalación.
Con --firewall, el instalador abre el puerto gRPC solo cuando está ligado a algo distinto de loopback.

Comprobarlo

lista fireflo.v1.AuthService, fireflo.v1.SendService y fireflo.v1.ReceiptService (con la reflexión activada). /ops/health lleva un bloque grpc: enabled, host, port tal como quedó ligado, tls, las sessions vivas en este nodo, los streams abiertos, y un bloque receipts para el feed.

Detrás de un proxy

gRPC necesita HTTP/2 de extremo a extremo. Un proxy_pass HTTP/1.1 no lo transporta. Con nginx:
Sin los dos timeouts, nginx cierra un stream Subscribe inactivo a los 60 segundos.

Dile a la pasarela que el proxy está ahí

Detrás de un proxy, cada llamada llega desde la dirección del proxy. Salvo que la pasarela confíe en el X-Forwarded-For del proxy, cada sesión queda ligada al proxy, cada comprobación de direcciones permitidas ve el proxy, y cada login rechazado se registra con la dirección del proxy, así que fail2ban banea el proxy, y a todos los clientes que hay detrás.
Ambos son ajustes de plataforma y se aplican a la siguiente llamada. La pasarela registra un aviso una sola vez cuando ve X-Forwarded-For desde una dirección privada en la que no confía: la señal de que falta esto.

TLS en el propio puerto

El listener habla HTTP/2 sin cifrar (h2c) por defecto, para un proxy que termina TLS. Para que la propia pasarela hable TLS, añade al archivo de entorno:
Health informa entonces grpc.tls: true, y los clientes se conectan con TLS en lugar de -plaintext.

Logins rechazados y fail2ban

gRPC no necesita un jail propio. Un login gRPC rechazado se escribe en el mismo auth-failed.log que SMPP y REST, indicando el listener y el puerto:
Una sesión caducada nunca banea. Las sesiones viven en la memoria de la pasarela, así que un reinicio caduca todas, y cada cliente que se reconecta es rechazado una vez (reason=sessionExpired) antes de volver a iniciar sesión. El filtro incluido ignora ese motivo; una llamada sin ningún token es missingCredential, y sí se cuenta. fireflo-install update actualiza el filtro de una pasarela instalada cuando el de la release es distinto, y luego recarga fail2ban. Consulta Bloquear clientes abusivos.

Límites

No hay un límite de tasa gRPC separado, deliberadamente: uno propio duplicaría lo que se permite a una cuenta. Los listeners SMPP mantienen el suyo (conf.maxRate.*), como antes.

El feed de acuses

Un mensaje enviado por un login HTTP (por gRPC o REST) que pide acuses sin dlr_url tiene sus acuses encolados para ese login, hasta que el cliente los confirme. Un dlr_url siempre gana. Con el feed activado, REST también acepta dlr=yes sin dlr-url; con él desactivado, sigue siendo un 400. Todos son ajustes de plataforma, leídos en vivo. Dónde vive la cola depende del almacén de acuses. En un solo nodo con el almacén por defecto, se guarda en el disco de ese nodo, junto al almacén de acuses. Donde los acuses se guardan en PostgreSQL, el feed también está en la base de datos, compartido por todos los nodos, así que un cliente puede leer en cualquier nodo. Un nodo que se detiene de forma ordenada devuelve sus leases al detenerse; los de uno que muere los liberan los nodos supervivientes, o caducan tras el lease.
Un login que pide acuses y nunca lee su feed lo llena hasta el tope. Vigila grpc.receipts.logins_capped en health y fireflo_grpc_receipts_oldest_age_seconds; un cliente en el tope ha dejado de leer, no de enviar.

Plataformas

Desde el gateway 0.15.10 una plataforma que aprovisiona cuentas con el token de gestión del gateway (OMNI, por ejemplo) puede usar el puerto gRPC sin la contraseña de ninguna cuenta: PlatformLogin se firma con el token de gestión igual que las peticiones de la API de gestión, y la sesión que devuelve envía como las cuentas cuyo ref empieza por el ref de la sesión (un prefijo que termina en /, como omni:<install>/<tenant>/) —y lee sus recibos de entrega—, y como ninguna otra. No hay nada más que activar aparte del puerto gRPC y el token de gestión que ya tiene; sin el token, PlatformLogin responde UNAVAILABLE (MANAGEMENT_DISABLED). Se aplican las reglas del token de gestión, como en la API de gestión: FIREFLO_MANAGEMENT_ALLOWED_IPS si lo define, y TLS —en el puerto o en un proxy de confianza— salvo que la plataforma se conecte por loopback. Los envíos cuentan contra el límite de velocidad de cada cuenta; no hay límite por plataforma. Una firma incorrecta, caducada o repetida es un rechazo surface=grpc sancionable que nombra platform:<ref>, y grpc.sessions_platform en health muestra cuántas sesiones de plataforma tiene un nodo. La capacidad es grpc_platform.

Métricas

Los gauges se actualizan cada 10 segundos. Los SendStream abiertos y las peticiones retenidas en ellos están en el bloque grpc de health.

Cuando algo va mal

FIREFLO_GRPC_PORT no está establecido en el entorno con el que realmente arranca la pasarela, o la pasarela no se ha reiniciado desde entonces. grpc.enabled en health dice cuál de los dos.
smsg.grpc.proxy.forwarding está desactivado, o hops no coincide con el número de proxies. Corrígelo antes de que fail2ban cuente diez rechazos desde el proxy y lo banee.
Algo en el camino habla HTTP/1.1: un proxy_pass en lugar de grpc_pass, o un balanceador de carga sin HTTP/2 hacia el back end. O el cliente usa TLS contra el listener sin cifrar, o al revés.
Pide acuses sin dlr_url y no los lee, o los lee sin confirmarlos. grpc.receipts en health lista los logins con más profundidad; redelivered_total subiendo con acked_total plano es el segundo caso.

Relacionado

API gRPC

Lo que ven tus clientes.

Bloquear clientes abusivos

El registro de logins rechazados, y los motivos que nunca banean.