Tudo o que vale a pena saber, nada do que não vale.
Porque existe uma janela, afinal?
SMPP é assíncrono: você envia um submit_sm e o SMSC responde com um submit_sm_resp, mas você não precisa esperar por essa resposta antes de enviar o próximo PDU. A janela define quantas mensagens você pode enviar antecipadamente. Com uma janela de 1, a sessão se torna requisição-resposta e a sua taxa de transferência cai para uma mensagem por ida e volta — num link de 50 ms, isso representa 20 mensagens por segundo, independentemente do que o seu contrato diga.
A aritmética
A taxa de transferência aproximada é calculada dividindo-se o tamanho da janela pela latência de ida e volta. Uma janela de 10 com uma latência de ida e volta de 50 ms resulta em aproximadamente 200 mensagens por segundo numa conexão; uma janela de 50 resulta em cerca de 1.000. É por isso que dois clientes com os mesmos termos comerciais podem apresentar taxas de transferência reais muito diferentes — um otimizou a janela e o outro não. Aumentar o tamanho da janela não acarreta custos adicionais para você, exceto pelo consumo de memória para os PDU não confirmados.
Porque você não pode simplesmente definir para 1.000?
A janela de tempo é acordada com a operadora ou fornecedor, e ultrapassá-la resulta em respostas ESME_RTHROTTLED ou na perda da conexão. O SMSC também precisa manter o estado de cada PDU não confirmada. A partir de certo ponto, o gargalo passa da janela de tempo para a própria taxa de submissão do SMSC, e uma janela maior apenas aumenta uma fila que não pode ser esvaziada. Defina a janela de tempo e o limite TPS em conjunto e trate-os como uma única configuração.
Múltiplas ligações e ordenação
Quando uma conexão não é suficiente, a solução é usar mais conexões em vez de uma janela ilimitada — a maioria dos fornecedores aloca capacidade de processamento por conexão. Tenha cuidado com a ordem das mensagens: PDU em conexões separadas não têm ordem relativa garantida, portanto, uma mensagem multipart ou uma sequência que o utilizador lerá em ordem deve permanecer numa única conexão. Mantenha um enquire_link ativo em cada conexão para que uma conexão ociosa não seja descartada silenciosamente.