Skip to main content

Trois façons d’écrire une règle qui ne peut jamais être vraie

Chacune de celles-ci se charge sans se plaindre, ne correspond à rien, et coûte un après-midi.
== est un opérateur numérique. vendor1:from:==:MyBrand n’échoue pas silencieusement à correspondre : il échoue à parser, ce qui fait échouer tout le rechargement et laisse la table précédente en service. Utilisez equals pour du texte.
matches est une expression régulière et elle est ancrée, parce que la passerelle appelle Pattern.matches plutôt que find. ^61.* correspond à toute une destination ; un simple 61 ne correspond qu’à la chaîne de deux caractères 61.startsWith compare du texte littéral. Une expression régulière qu’on lui passe demande si une destination commence littéralement par les caractères ^(?:\+61 — rien n’y correspond, donc la règle est stockée, chargée, affichée, et ne se déclenche jamais. Le panneau de contrôle avertit à ce sujet ; un fichier édité à la main non.
Un champ non défini ne correspond à aucun opérateur positif. product:equals:premium ne correspond pas à un message ne portant aucun produit, et product:startsWith:prem non plus. Seul isNull le fait.L’inverse piège dans l’autre sens : product:!equals:premium se déclenche bien pour un message sans produit, parce que la négation inverse la correspondance échouée.

La grammaire

Les règles sont évaluées de haut en bas au sein d’une table, et la première correspondance l’emporte. Target est une instance de worker (vendor1, smppserver.smpp), un groupe, ou une autre table sur laquelle enchaîner (MESSAGE).
Routing liste chaque table avec ses règles dans l’ordre. L’éditeur valide l’opérateur par rapport au champ avant l’enregistrement, refuse un opérateur numérique sur un champ texte, et avertit à propos d’une expression régulière écrite dans un opérateur littéral.
L’attrape-tout se met à la fin. Au-dessus des autres règles, il rend toutes les règles qui le suivent inaccessibles, et rien ne vous avertit dans le fichier — elles parsent bien, elles ne s’exécutent tout simplement jamais. Le panneau le signale ; la passerelle l’enregistre comme unreachable-rules sur /ops/health et continue.

Opérateurs

Tout opérateur peut être nié avec un ! en tête. Les quatre comparaisons texte sont lexicographiques, pas numériques : greaterThan sur un numéro de téléphone compare des chaînes.

Qui l’a envoyé

product est la façon dont un client sélectionne le routage par session : le même credential se bindant avec system_type=premium et system_type=bulk produit deux sessions qui routent différemment. Voir Concepts. Types de message pour les règles type : 0 texte, 10 binaire, 11 UCS-2, 14 flash, 17 push, 18 accusé de livraison.

Conditions sur la cible, pas sur le message

Préfixer un champ avec target. lit un champ du worker de destination à la place, ce qui permet à une règle de contourner un fournisseur qui prend du retard :
Il y en a exactement quatre — queueSize, sentPendingRate, sentDeliveredRate, sentFailRate — appariés sans tenir compte de la casse, et un champ non reconnu est refusé au parsing avec les quatre listés.
marginPercentage et marginStatus sont des champs de message, donc retirez le préfixe target. et ils se résolvent. Attention à ce qu’ils contiennent : les deux sont définis sur la réponse de soumission, après que le message est parti, donc une condition de routage sur l’un ou l’autre lit NOT_CALCULATED à chaque première tentative.

Copier et continuer

Un + sur la cible copie le message vers cette cible et continue à parcourir, au lieu de router et d’arrêter. Dans la base de données, c’est la colonne copied.

Groupes de fournisseurs

Une règle peut cibler un groupe au lieu d’un seul fournisseur. Le groupe choisit un membre, en sautant tout membre suspendu ou n’acceptant pas — ce saut est le failover qu’une règle à cible unique ne peut pas faire.
Les blocs de groupe doivent venir avant le premier en-tête [table]. À l’intérieur d’un bloc de table, une ligne de membre ne correspond à rien et est jetée silencieusement, si bien que le groupe se retrouve avec moins de membres qu’il ne semble avoir, ou aucun.Un poids n’est lu que par weighted. En définir un sur les deux autres ne change rien, et la passerelle le dit en WARN plutôt que de vous laisser croire qu’un partage se produit.
Un message, un débit, une destination. Un groupe sélectionne toujours exactement un membre, et +copied sur une règle de groupe copie encore vers un seul membre — un fanout serait N envois pour un seul débit.Si tous les membres sont hors service, la règle n’envoie rien, journalise cause=group-all-dead en nommant tous ceux qu’elle a essayés, et le parcours continue vers la règle suivante, ce qui maintient accessible une règle de repli écrite en dessous d’une règle de groupe.
Référence complète de la grammaire : routingTable.conf.