BroadNet
SMPPIntegração

Boas práticas de integração SMPP

Atualizado em 3 min de leituraBaseado em padrões
Resposta direta

Uma integração SMPP robusta é sobre disciplina operacional, não apenas PDUs corretos: escolha o modo de bind certo, gira cuidadosamente o sequence_number e a janela, repita com recuo com jitter, torne a submissão idempotente para evitar dupla faturação, confirme cada deliver_sm e reconecte de forma limpa em caso de falha. Acerte nisto e os detalhes do protocolo tratam de si mesmos.

DiagramaUma sessão SMPP entre a sua plataforma e BroadNet
A sua plataforma (ESME)
BroadNet SMSC
Uma conexão TCP/TLS persistente
  1. bind_transceiverAbrir e autenticar a sessão
  2. bind_transceiver_respSessão aceita
  3. submit_smEnviar uma mensagem
  4. submit_sm_respAceito, ID da mensagem devolvida
  5. deliver_smRelatório de entrega ou mensagem recebida
  6. deliver_sm_respConfirmado
  7. enquire_linkKeepalive em modo ocioso
§01

Estratégia de bind

Prefira um bind transceiver quando o fornecedor o permitir, para que uma ligação transporte submit e receção e simplifique a correlação de DLR. Acorde por escrito o número de binds concorrentes e o TPS por bind com o fornecedor antes de escalar. Confirme a versão SMPP negociada a partir do bind_resp e trate as falhas de bind explicitamente — repita estados transitórios do tipo ESME_RALYBND, mas trate ESME_RINVPASWD/ESME_RINVSYSID como erros fatais de configuração em vez de entrar em ciclo.

§02

sequence_number e a janela

Atribua um sequence_number monotonamente crescente (1 até 0x7FFFFFFF, depois volta ao início) e use-o para correlacionar cada resposta ao seu pedido. Acompanhe os pedidos pendentes num mapa indexado por sequence_number com um tempo-limite, para que uma resposta que nunca chega seja detetada. Respeite a janela: limite os PDUs em voo por confirmar e suspenda os submits quando estiver cheia em vez de disparar às cegas, o que despoleta limitação de taxa.

Estado de correlação e controlo de fluxo a manter
EstadoPorquê
Mapa de solicitações pendentes (por sequence_number)Correlacionar respostas, detetar tempos limite
Contador de ocupação da janelaBackpressure antes de ESME_RTHROTTLED
Chave de idempotência por mensagem lógicaImpedir envios duplicados em novas tentativas
Estado do bind + hora do último enquire_link_respDetetar sessões inativas
§03

Repetições, recuo e idempotência

Repita as falhas transitórias (ESME_RMSGQFUL, ESME_RTHROTTLED, erros de sistema, tempos-limite) com recuo exponencial e jitter para que as tempestades de reconexão não se sincronizem entre workers. Não repita erros permanentes (endereço inválido, password inválida). Fundamental: torne a submissão idempotente: anexe a sua própria referência (por exemplo via user_message_reference) e desduplique, para que uma repetição após um tempo-limite ambíguo não faça dupla faturação nem dupla entrega.

§04

Tratamento de relatórios de entrega

Peça registered_delivery apenas onde consome os recibos. Responda sempre deliver_sm_resp prontamente e processe de forma assíncrona. Correlacione os recibos pelo TLV receipted_message_id, normalizando os formatos de id em hexadecimal/decimal, e encerre uma mensagem apenas com um stat final. Mapeie os códigos err da rede para uma taxonomia normalizada para que a qualidade seja comparável entre rotas. Trate as notificações intermédias separadamente dos estados terminais.

§05

Keepalive e reconexão

Envie enquire_link num temporizador de inatividade e trate uma resposta em falta como uma sessão morta. Em qualquer desligação, reconecte com recuo e jitter em vez de entrar em hot-loop. Na reconexão, retome a partir de um estado limpo: refaça o bind, reinicie o mapa de pedidos pendentes e confie na idempotência para resubmeter em segurança o que estava em voo. Instrumente o estado do bind, a ocupação da janela, a latência de submit/DLR e as taxas de código de erro, e alerte sobre todos eles.

Perguntas frequentes

Perguntas frequentes

Como devo atribuir o sequence_number?

Use um contador monotonamente crescente de 1 até 0x7FFFFFFF, depois volte ao início. Mantenha um mapa de sequence_numbers pendentes com tempos-limite para poder correlacionar cada resposta e detetar pedidos que nunca receberam uma.

Como evito dupla faturação nas repetições?

Torne a submissão idempotente. Anexe a sua própria referência (por exemplo user_message_reference), desduplique por ela e desenhe as repetições de modo a que um reenvio após um tempo-limite ambíguo seja reconhecido e suprimido em vez de entregue e faturado duas vezes.

Que erros SMPP devo repetir?

Repita os transitórios — ESME_RMSGQFUL, ESME_RTHROTTLED, erros de sistema e tempos-limite — com recuo exponencial e jitter. Não repita erros permanentes como ESME_RINVDSTADR ou ESME_RINVPASWD; corrija antes a entrada ou a configuração.

O que devo monitorizar num bind SMPP?

O estado do bind, o tempo desde o último enquire_link_resp, a ocupação da janela, a latência de submit e DLR e as taxas de erro por código (sobretudo ESME_RTHROTTLED). Alerte sobre limitação crescente ou uma janela bloqueada como sinais precoces de problema.

Como devo tratar a reconexão após uma sessão perdida?

Reconecte com recuo exponencial com jitter, refaça o bind, reinicie o mapa de pedidos pendentes e resubmeta as mensagens em voo confiando na idempotência para prevenir duplicados. Nunca faça hot-loop de reconexões, o que pode levar ao bloqueio do seu IP.

Referências

Especificações de origem

Os padrões publicados nos quais esta página se baseia. Abre num novo separador.

BNMantido pela equipa de engenharia BroadNet·Mensagens de nível de operadora desde 2003
Coloque-o no fio.

Construa com uma vinculação SMPP real e uma API REST.

Solicite acesso de teste com chaves de teste reais: envie primeiro para o seu próprio número verificado e, em seguida, passe para o ambiente de produção em mais de 200 países assim que a sua identidade de remetente e rotas forem aprovadas.