SendService tem dois métodos. Send recebe uma mensagem e dá uma resposta, e espelha o
POST /secure/send campo a campo. SendStream carrega muitas mensagens num
stream bidirecional, para volume sustentado.
Os dois precisam do token de sessão do Login no metadado
authorization.
Send: uma mensagem
Campos
Todo campo excetoto é optional: um campo que você não define se comporta exatamente como uma
chave JSON que você deixa de fora de uma requisição REST, e assume o mesmo padrão. As mesmas
aprovações, produtos, gramática de TLV e limites se aplicam, porque os dois passam pelas mesmas
verificações.
dlr_method e tags do REST não são transportados; os números de campo deles ficam reservados para
que nunca possam ser reutilizados para outra coisa.
Valores de custom_tlvs
Cada valor é um TlvValue contendo exatamente um destes:
A chave decide a codificação no fio, exatamente como no REST.
"0x1401:Int8" com int_value: 42
é o inteiro de 8 bytes 42, como "0x1401:Int8": 42 é no REST.
grpcurl lê — um inteiro de 64 bits é escrito como string. Clientes
gerados recebem um inteiro nativo.
Recibos: dlr e dlr_url
O webhook sempre vence: uma mensagem com
dlr_url nunca aparece no feed.
Se seu provedor desligou o feed de recibos,
dlr: true sem dlr_url é recusado com
INVALID_ARGUMENT nomeando dlr_url — a mesma recusa que o REST dá — porque os recibos não teriam
para onde ir.A resposta
price é uma string de propósito: assim um valor decimal sobrevive inalterado em qualquer linguagem,
coisa que um número de ponto flutuante não faria.
Repetindo com segurança com client_ref
Defina client_ref em todo envio que você possa repetir. Uma repetição dentro de 24 horas a partir
da mesma conta — via gRPC ou REST, seja qual for o login que enviou — é respondida com o
message_id do primeiro envio e duplicate: true, e nada é enviado nem cobrado de novo.
Um envio que foi recusado libera sua referência, então a requisição corrigida pode reutilizá-la. As
regras são as do REST, descritas por completo em
Repetindo com segurança com client_ref — incluindo a única brecha estreita
num cluster de gateways.
Isso importa sobretudo para uma resposta em particular: UNKNOWN com OUTCOME_UNKNOWN, em que a
mensagem pode estar a caminho. Repita essa só com o mesmo client_ref. Veja
Erros e códigos de status.
SendStream: muitas mensagens em um stream
Para volume alto e sustentado. Você escreve SendStreamRequests e lê SendStreamResults num stream
bidirecional.
Cada requisição é um correlation_id à sua escolha e um SendRequest — exatamente a mensagem que
você passaria para Send.
Cada resultado é:
correlation_id precisa ter 1–64 caracteres. Um vazio ou mais longo é respondido — só para aquela
requisição — com INVALID_ARGUMENT e field: correlation_id. Use algo único por requisição no
stream; seu client_ref costuma ser a escolha natural.
Um resultado por requisição, em qualquer ordem
As requisições são submetidas concorrentemente, então uma rápida ultrapassa uma lenta. Case pelocorrelation_id, nunca pela posição.
Uma recusa é um resultado, não um erro do stream
Um saldo vazio, o limite de taxa ou um campo inválido respondem àquela requisição, e o stream segue. O próprio stream só termina quando você fecha o seu lado — então comOK, depois do último
resultado — ou quando o gateway para.
Leia continuamente, ou o stream trava
O gateway segura no máximo 256 das suas requisições ao mesmo tempo num stream — sendo submetidas, ou respondidas e esperando você ler o resultado. Além disso, ele para de ler do stream até que um resultado seja lido, e o controle de fluxo comum do HTTP/2 segura suas escritas. Então: escreva tão rápido quanto sua biblioteca permitir, e leia os resultados continuamente em outra thread ou task. Um cliente que escreve tudo primeiro e lê depois para em 256. Para mais concorrência, abra mais streams — cada um tem seus próprios 256. Todos compartilham o limite de mensagens por segundo da sua conta, então mais streams compram concorrência, não taxa.Quando o gateway para
Um gateway sendo reiniciado encerra seus streams de forma limpa:- As requisições que já estão sendo submetidas terminam, e seus resultados são enviados.
- As requisições recebidas mas ainda não iniciadas são respondidas com
UNAVAILABLE/SHUTTING_DOWNsem serem submetidas. - O stream termina com
UNAVAILABLE(SHUTTING_DOWN).
client_ref, para que nada seja enviado duas vezes.
Uma conexão que cai sem esse encerramento ordenado te deixa com requisições sem resultado. Reenvie
essas também, com o mesmo client_ref: as que foram aceitas voltam com duplicate: true.
Relacionados
Exemplos
Send e SendStream em Python, Java e Go.
POST /secure/send
O gêmeo REST de cada campo acima.