Subscribe) ou polling (Pull) — e remove cada recibo com Ack. Os dois leem a mesma
fila.
É a alternativa a manter um endpoint de webhook: nada para expor à
internet, nada contra o que o gateway precise fazer retries, e recibos guardados até você pegá-los.
Quais recibos chegam ao feed
Um recibo é enfileirado para o seu login quando todas estas condições valem:- a mensagem foi enviada pelo seu login HTTP — via gRPC ou via REST;
- ela pediu recibos —
dlr: trueno gRPC,"dlr": "yes"no REST — e este recibo é um dos que ela pediu (dlr_level:1progresso,2o desfecho,3os dois); - ela não traz
dlr_url.
dlr_url tem seus recibos enviados para essa URL e nunca
para o feed. Mensagens enviadas via SMPP nunca aparecem nele — elas recebem seus recibos no bind.
Envios REST também podem usar o feed. Numa plataforma com gRPC e o feed ligados, o REST aceita
"dlr": "yes" sem dlr_url, e esses recibos chegam aqui. Onde o gRPC está desligado, essa requisição
REST continua sendo recusada com 400, porque os recibos não teriam para onde ir. Veja
POST /secure/send.UNKNOWN no feed, como um webhook receberia.
A mensagem Receipt
O corpo JSON do webhook, um campo por chave, mais dois campos de entrega no final:
Campos opcionais ficam ausentes, não vazios, quando não há nada a dizer. Tudo o que o
guia de recibos de entrega diz sobre
level, stat e err
vale sem alteração.
A entrega é pelo menos uma vez
1
Um recibo só sai da fila quando você dá Ack nele
Ou quando a retenção o remove — veja Limites e retenção.
2
Um recibo entregue fica em lease com você por 120 segundos
Se não for confirmado até lá, ele é entregue de novo — a qualquer
Subscribe ou Pull do seu
login que peça em seguida — com delivery_count aumentado em um.3
Um stream que termina devolve seus recibos na hora
Quando um stream
Subscribe termina — você cancela, a conexão cai, o gateway reinicia — os recibos
que ele havia entregado e você não havia confirmado são liberados imediatamente, não depois do
lease.Ack
already_gone não é um erro. Um Ack repetido depois de um timeout é seguro, e é exatamente
nesse caso que você vai repetir um. Mais de 1000 tokens numa chamada é INVALID_ARGUMENT.
Um token funciona em qualquer nó do gateway e através de restarts, mas só para o login ao qual foi
entregue. Agrupe suas confirmações: um Ack de 500 tokens é muito mais barato que 500 de um.
Pull: polling
max recibos (no máximo 1000), os mais antigos primeiro.
- Sem nenhum esperando e com
wait_secondsacima de 0, ele espera até esse tempo — 20 segundos no máximo — e retorna assim que um chega. Isso é um long poll, e é como você evita um busy loop. - Com
wait_seconds: 0ele retorna na hora, possivelmente vazio.
Pull serve para um job em lote, um worker que acorda num timer, ou uma linguagem de cujo suporte
a streaming você prefere não depender.
Subscribe: streaming
window limita quantos recibos entregues mas não confirmados o stream segura. Ao atingir a janela, o
stream pausa até você dar Ack — em qualquer canal. Não definido, ou acima do máximo do gateway (1000
por padrão), vale o máximo.
Vários leitores compartilham a fila
Vários streamsSubscribe — e Pulls — de um mesmo login compartilham a fila: cada recibo vai
para exatamente um deles por vez. Use isso para distribuir o tratamento de recibos entre vários
workers. Para dar feeds separados a aplicações separadas, dê a elas logins HTTP separados.
Ordenação
Melhor esforço, por ordem de chegada. Não há garantia de ordem entre nós do gateway, e um recibo reentregue chega depois de outros mais novos. Um desfecho pode chegar antes de um recibo de progresso da mesma mensagem. Ordene porlevel — 2 é final — e por done_date, nunca pela chegada. Quando você já tem um
recibo level: 2 de uma mensagem, ignore qualquer level: 1 que venha depois.
Limites e retenção
Seu provedor pode alterar cada um desses.
Relacionados
Exemplos
Loops de Subscribe, Pull e Ack em Python, Java e Go.
O webhook de recibo de entrega
Os mesmos campos, enviados via POST para sua URL.