Saltar para o conteúdo principal
O 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

Aceita significa enfileirada para entrega, não entregue — exatamente como um 200 no REST. O desfecho só te chega como um recibo de entrega.

Campos

Todo campo exceto to é 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.
No JSON do proto3 — o que o 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 pelo correlation_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 com OK, 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:
  1. As requisições que já estão sendo submetidas terminam, e seus resultados são enviados.
  2. As requisições recebidas mas ainda não iniciadas são respondidas com UNAVAILABLE / SHUTTING_DOWN sem serem submetidas.
  3. O stream termina com UNAVAILABLE (SHUTTING_DOWN).
Reconecte — a outro nó, ou a este quando ele voltar — faça login de novo e reenvie só o que não tem resultado, com o mesmo 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.