Saltar para o conteúdo principal
A partir do gateway 0.15.9, os clientes podem enviar via gRPC além de REST e SMPP, e coletar recibos de entrega de um feed durável em vez de manter um webhook. O lado do cliente está descrito em API gRPC; esta página é a do operador.
O gRPC fica desligado a menos que você o configure. Um upgrade para a 0.15.9 não muda nada que um cliente possa ver: sem uma porta gRPC, o gateway responde toda chamada gRPC com UNAVAILABLE (GRPC_DISABLED), e a API REST se comporta exatamente como antes.

Ligando

Defina a porta no arquivo de ambiente e reinicie:
Ou deixe o instalador escrevê-la, numa instalação nova ou existente:
O update só escreve a porta quando você passa --grpc ou --grpc-port; sem eles, um valor existente é mostrado e deixado como está, e nenhum é adicionado.
Nunca dê ao gRPC a porta de gerenciamento (9000) nem a porta REST. O instalador recusa uma porta gRPC que já seja a porta SMPP, HTTP ou de gerenciamento da instalação.
Com --firewall, o instalador abre a porta gRPC só quando ela está em bind em algo diferente de loopback.

Verificando

lista fireflo.v1.AuthService, fireflo.v1.SendService e fireflo.v1.ReceiptService (com a reflection ligada). /ops/health traz um bloco grpc — enabled, host, port como está em bind, tls, as sessions ativas neste nó, os streams abertos, e um bloco receipts para o feed.

Atrás de um proxy

O gRPC precisa de HTTP/2 de ponta a ponta. Um proxy_pass HTTP/1.1 não o transporta. Com nginx:
Sem os dois timeouts, o nginx fecha um stream Subscribe quieto depois de 60 segundos.

Diga ao gateway que o proxy está lá

Atrás de um proxy, toda chamada chega do endereço do proxy. A menos que o gateway confie no X-Forwarded-For do proxy, toda sessão fica vinculada ao proxy, toda verificação de endereço permitido vê o proxy, e todo login recusado é registrado com o endereço do proxy — então o fail2ban bane o proxy, e todos os clientes atrás dele.
As duas são configurações de plataforma e valem para a próxima chamada. O gateway loga um aviso uma vez quando vê X-Forwarded-For vindo de um endereço privado em que não confia — o sinal de que isso está faltando.

TLS na própria porta

O listener fala HTTP/2 puro (h2c) por padrão, para um proxy que termina o TLS. Para o próprio gateway falar TLS, adicione ao arquivo de ambiente:
O health então reporta grpc.tls: true, e os clientes conectam com TLS em vez de -plaintext.

Logins recusados e fail2ban

O gRPC não precisa de uma jail própria. Um login gRPC recusado é escrito no mesmo auth-failed.log do SMPP e do REST, nomeando o listener e a porta:
Uma sessão expirada nunca bane. As sessões vivem na memória do gateway, então um restart expira todas elas, e cada cliente que reconecta é recusado uma vez (reason=sessionExpired) antes de fazer login de novo. O filtro distribuído ignora esse motivo; uma chamada sem token nenhum é missingCredential, e é contada. O fireflo-install update atualiza o filtro de um gateway instalado quando o da versão é diferente, e depois recarrega o fail2ban. Veja Bloqueando clientes abusivos.

Limites

Não existe um teto de taxa separado para o gRPC, de propósito: um teto à parte dobraria o que uma conta pode enviar. Os listeners SMPP mantêm o seu próprio (conf.maxRate.*), como antes.

O feed de recibos

Uma mensagem enviada por um login HTTP — via gRPC ou REST — que pede recibos sem dlr_url tem seus recibos enfileirados para esse login, até que o cliente os confirme. Um dlr_url sempre vence. Com o feed ligado, o REST também aceita dlr=yes sem dlr-url; com ele desligado, isso continua sendo um 400. Todas são configurações de plataforma, lidas ao vivo. Onde a fila fica segue o store de recibos. Num único nó com o store padrão, ela fica no disco desse nó, ao lado do store de recibos. Onde os recibos ficam no PostgreSQL, o feed fica no banco também, compartilhado por todos os nós, então um cliente pode ler em qualquer nó. Um nó que para de forma limpa devolve seus leases ao parar; os de um que morre são liberados pelos nós sobreviventes, ou expiram depois do lease.
Um login que pede recibos e nunca lê seu feed o enche até o limite. Observe grpc.receipts.logins_capped no health e fireflo_grpc_receipts_oldest_age_seconds; um cliente no limite parou de ler, não parou de enviar.

Plataformas

A partir do gateway 0.15.10, uma plataforma que provisiona contas com o token de gestão do gateway (o OMNI, por exemplo) pode usar a porta gRPC sem a senha de nenhuma conta: PlatformLogin é assinado com o token de gestão exatamente como as requisições da API de gestão, e a sessão que ele devolve envia em nome das contas cujo ref começa com o ref da sessão (um prefixo terminado em /, como omni:<install>/<tenant>/) — e lê os recibos de entrega delas —, e de nenhuma outra. Não há nada a ativar além da porta gRPC e do token de gestão que você já configurou; sem o token, PlatformLogin responde UNAVAILABLE (MANAGEMENT_DISABLED). As regras do token de gestão valem como na API de gestão: FIREFLO_MANAGEMENT_ALLOWED_IPS se você a definir, e TLS — na porta ou em um proxy confiável — a menos que a plataforma se conecte por loopback. Os envios contam no limite de taxa de cada conta; não há limite por plataforma. Uma assinatura inválida, expirada ou repetida é uma recusa surface=grpc passível de banimento que nomeia platform:<ref>, e grpc.sessions_platform no health mostra quantas sessões de plataforma um nó mantém. A capacidade é grpc_platform.

Métricas

Os gauges são atualizados a cada 10 segundos. Os SendStreams abertos e as requisições seguradas neles estão no bloco grpc do health.

Quando algo está errado

FIREFLO_GRPC_PORT não está definida no ambiente com que o gateway de fato sobe, ou o gateway não foi reiniciado desde então. O grpc.enabled do health diz qual dos dois.
smsg.grpc.proxy.forwarding está desligado, ou hops não corresponde ao número de proxies. Corrija antes que o fail2ban conte dez recusas do proxy e o bana.
Algo no caminho fala HTTP/1.1 — um proxy_pass em vez de grpc_pass, ou um load balancer sem HTTP/2 até o back end. Ou o cliente usa TLS contra o listener puro, ou o contrário.
Ele pede recibos sem dlr_url e não os lê, ou lê sem confirmar. O grpc.receipts do health lista os logins com mais recibos; redelivered_total subindo com acked_total parado é o segundo caso.

Relacionados

API gRPC

O que seus clientes veem.

Bloqueando clientes abusivos

O registro de logins recusados, e os motivos que nunca banem.