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: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.
Com
--firewall, o instalador abre a porta gRPC só quando ela está em bind em algo diferente de
loopback.
Verificando
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. Umproxy_pass HTTP/1.1 não o transporta. Com nginx:
Subscribe quieto depois de 60 segundos.
Diga ao gateway que o proxy está lá
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: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 mesmoauth-failed.log do
SMPP e do REST, nomeando o listener e a porta:
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 semdlr_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.
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
Todo login recusado, e toda sessão, mostra o endereço do proxy
Todo login recusado, e toda sessão, mostra o endereço do proxy
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.As chamadas falham no transporte antes de o gateway responder
As chamadas falham no transporte antes de o gateway responder
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.O feed de um cliente não para de crescer
O feed de um cliente não para de crescer
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.