La conception en un paragraphe
Le solde dépensable d’un compte est détenu en mémoire et décrémenté par message, donc le chemin du message ne fait aucun travail en base. La durabilité vient de la réservation par blocs : une seule instruction atomique déplace un montant debalance vers reserved, et le gateway
dépense ce bloc depuis la mémoire.
À quelques milliers de messages par seconde, cela fait quelques écritures en base par seconde
plutôt que quelques milliers. Et aucun message n’est jamais envoyé contre du crédit qui n’a pas
été validé d’abord.
L’identité qui doit tenir
kill -9 bloque du
crédit dans reserved ; il ne le perd pas — POST /ops/credit/release le restitue, et un arrêt
propre le restitue automatiquement.
Si les deux côtés ne s’accordent pas, c’est un vrai écart et pas un artefact d’arrondi.
Rechargement
Le crédit est ajouté en écrivant une ligneRECHARGE. Le gateway l’applique lors de son prochain
sondage et la marque appliquée, donc un rejeu est un no-op.
500000 vaut 50.0000 unités.
L’Ajouter du crédit du panneau de contrôle écrit exactement cette ligne et rien d’autre. Le
gateway lui-même ne peut pas créer de crédit — il n’applique que les lignes écrites par quelqu’un
d’autre, et la colonne balance a exactement un écrivain, qui est ce sondage.
Taille de bloc, et le refus qu’elle explique
Un bloc est dimensionné à partir du débit auquel le compte a été observé envoyer. À froid — ou après une période inactive — il n’y a pas de débit pour le dimensionner, donc un plancher s’applique :smsg.balance.block.min.messages vaut par défaut 20, et le prix vient du message qui demande
la réservation.
Une réservation est du tout ou rien, donc une seule instruction ne peut réussir que si le solde
couvre le montant demandé. La réservation essaie donc trois échelons descendants — le bloc
complet, le plancher libellé en messages, puis juste le seul message qui a demandé :
Ce que cela coûte : un compte envoyant activement détient jusqu’à vingt messages en reserved
que rien d’autre ne peut dépenser — restitués par un arrêt propre, et par credit release après
un arrêt non propre.
Ce que vous verrez encore vers la fin : les rechargements sont asynchrones par conception,
donc un message arrivant pendant que la prochaine réservation est en vol peut être refusé même si
du crédit reste. Ce refus est transitoire et la nouvelle tentative réussit. Ce n’est pas du crédit
bloqué.
Refus
Un compte sans crédit obtient le statutsubmit_sm_resp 0x402, HTTP 402, raison
insufficientCredit.
ESME_RTHROTTLED n’est délibérément pas utilisé : cela signifie autre chose, et ferait qu’un
client recule et retente une condition que seul un rechargement peut lever.
Remboursements
Un message débité puis abandonné pendant le routage voit son crédit restitué exactement une fois. Un message non tarifé n’est jamais débité du tout. Le rechargement se déclenche sur un seuil pendant qu’il reste du crédit, sur un thread de fond. Si le trafic le devance, le message est refusé immédiatement plutôt que de faire attendre le thread SMPP sur une base de données — un thread d’ingress bloqué est pire qu’un message refusé.Propriétés
En lien
Postpayé
Limites de crédit, et factures exactes à partir d’une mise en application approximative.
Refus
Lire
insufficientCredit face à un solde positif.