Skip to main content

A edição que aparentemente não fez nada

Uma regra malformada falha o reload inteiro, e a tabela anterior é retida. Uma linha ruim não desabilita uma regra — ela rejeita o conjunto de tabelas inteiro, e o gateway segue roteando contra a configuração que já estava servindo.Nada parece errado: o tráfego continua fluindo, o arquivo em disco diz o que você quis, e o único rastro é Error parsing new routing table em ERROR no log. Cheque depois de toda edição.
routingTable.conf é hot reloaded — uma edição se aplica em cerca de 200 ms, sem restart. Essa velocidade é exatamente por que o caso de tabela retida é fácil de perder: não há restart para notar, então “minha mudança não fez nada” é o sintoma inteiro.

O que o router faz com uma mensagem

1

A submissão é respondida primeiro

O gateway envia submit_sm_resp, ou o 200 do REST, antes de o roteamento rodar. O cliente já foi informado de que a mensagem foi aceita, e cobrado por ela.
2

A mensagem vai para a fila do router

Trabalho aceito espera aqui. Veja Queues and retries.
3

A tabela `default` é varrida

Regras são tentadas de cima para baixo e o primeiro match ganha. Uma regra pode enviar a um fornecedor, a um grupo de fornecedores, ou a outra tabela.
4

O worker escolhido a pega

A mensagem é enfileirada na fila daquele fornecedor e sai na velocidade que o fornecedor permite.
Como o passo 1 acontece antes do passo 3, uma falha de roteamento não pode ser reportada ao cliente como um erro de submit. Ela só pode aparecer depois, como um delivery receipt e uma linha em cdr_rejected.

Tabelas são um grafo, não uma lista

Uma regra cujo alvo nomeia outra tabela encadeia nela, então default → MESSAGE → cheapest é uma forma comum. Duas coisas limitam a recursão: Uma tabela alcançada duas vezes por caminhos diferentes não é um ciclo: default → a → c junto com default → b → c carrega normalmente.

As duas coisas que carregam e depois se comportam mal em silêncio

Ambas aparecem em /ops/health sob routing_warnings, e cada uma é logada uma vez quando aparece pela primeira vez em vez de a cada publicação.
O catch-all pertence ao final. Colocado acima de outras regras ele faz tudo abaixo dele inalcançável, e nada recusa a tabela — as regras parseiam perfeitamente, elas simplesmente nunca rodam. Um catch-all é uma regra que estreita nada: vendor1::default: em um arquivo, ou uma regra sem condições e sem filtros no banco.Uma regra carregando um filtro não é um catch-all, por mais que pareça um. Veja Filters.

Quando mensagens somem

Antes de editar qualquer regra, descarte as três causas que não são de roteamento. Apenas reason = 'maxAttempts' em cdr_rejected significa roteamento; headerNotApproved, templateNotMatched, missingMandatoryTlv, insufficientCredit e filtered todos significam que a mensagem foi recusada antes de o roteamento ser alcançado. Veja Nothing is delivered.
Estas linhas estão em WARN ou ERROR e não precisam de flag de debug:
routing.rule.broken é logado uma vez por regra, não uma vez por mensagem, e o contador só reseta quando uma nova tabela é publicada. Um log quieto portanto não é prova de que o problema está corrigido — é igualmente consistente com “já reportado”.Observe a contagem routing_rules_broken em /ops/health, que é o mesmo fato como número.

Perguntando por que uma mensagem não casou

Aceita um serial de mensagem ou um id de conta. Toda regra contra a qual essa mensagem é testada então loga qual condição falhou e o que a mensagem realmente carregava:
Aplica-se ao vivo, então configure durante o incidente e limpe depois. Vazio — o padrão — custa uma leitura volatile por regra.
Isto não é outSms.routing.debug. Aquele loga toda regra de toda mensagem e renderiza o objeto inteiro da mensagem para fazer isso, o que o torna inutilizável nas taxas em que perguntas de roteamento são realmente feitas. É útil apenas em um gateway ocioso reproduzindo um único envio.

Próximo

Writing rules

A gramática de quatro partes, os operadores que mentem, e grupos de fornecedores.

Least-cost routing

Onde a ordem das regras deixa de significar algo.

Filters

Condições nomeadas, e por que desabilitar uma estreita uma regra até nada.

Queues and retries

O que já está pago e sentado na memória.