Passer au contenu principal
SendService a deux méthodes. Send prend un message et donne une réponse, et reflète POST /secure/send champ pour champ. SendStream transporte de nombreux messages sur un seul flux bidirectionnel, pour un volume soutenu. Les deux nécessitent le jeton de session obtenu par Login dans la métadonnée authorization.

Send, un message

Accepté signifie mis en file pour livraison, pas livré — exactement comme un 200 en REST. L’issue ne vous parvient que sous forme d’un accusé de livraison.

Champs

Tous les champs sauf to sont optional : un champ que vous ne définissez pas se comporte exactement comme une clé JSON que vous omettez d’une requête REST, et prend la même valeur par défaut. Les mêmes approbations, produits, grammaire de TLV et limites s’appliquent, parce que les deux passent par les mêmes vérifications. dlr_method et tags de REST ne sont pas transportés ; leurs numéros de champs sont réservés pour ne jamais pouvoir être réutilisés pour autre chose.

Valeurs de custom_tlvs

Chaque valeur est un TlvValue contenant exactement l’un de : La clé décide de l’encodage sur le fil, exactement comme en REST. "0x1401:Int8" avec int_value: 42 est l’entier de 8 octets 42, comme l’est "0x1401:Int8": 42 en REST.
En JSON proto3 — ce que lit grpcurl — un entier 64 bits s’écrit sous forme de chaîne. Les clients générés prennent un entier natif.

Accusés : dlr et dlr_url

Le webhook l’emporte toujours : un message avec un dlr_url n’apparaît jamais dans le flux.
Si votre fournisseur a désactivé le flux d’accusés, dlr: true sans dlr_url est refusé INVALID_ARGUMENT en nommant dlr_url — le même refus que donne REST — parce que les accusés n’auraient nulle part où aller.

La réponse

price est une chaîne à dessein : un montant décimal traverse ainsi tous les langages sans changement, là où un nombre à virgule flottante ne le ferait pas.

Réessayer sans risque avec client_ref

Définissez client_ref sur chaque envoi que vous pourriez réessayer. Une répétition dans les 24 heures depuis le même compte — sur gRPC ou REST, quel que soit le login qui l’a envoyée — reçoit le message_id du premier envoi et duplicate: true, et rien n’est envoyé ni débité à nouveau. Un envoi qui a été refusé libère sa référence, donc la requête corrigée peut la réutiliser. Les règles sont celles de REST, décrites en détail sous Réessayer sans risque avec client_ref — y compris l’unique faille étroite sur un cluster de passerelles. Cela compte surtout pour une réponse en particulier : UNKNOWN avec OUTCOME_UNKNOWN, où le message est peut-être en route. Ne réessayez celle-ci qu’avec le même client_ref. Voir Erreurs et codes de statut.

SendStream, plusieurs messages sur un flux

Pour un volume élevé et soutenu. Vous écrivez des SendStreamRequest et lisez des SendStreamResult sur un seul flux bidirectionnel. Chaque requête est un correlation_id de votre choix et un SendRequest — exactement le message que vous passeriez à Send. Chaque résultat est : correlation_id doit faire 1 à 64 caractères. Un identifiant vide ou plus long reçoit — pour cette requête seulement — INVALID_ARGUMENT avec field: correlation_id. Utilisez quelque chose d’unique par requête sur le flux ; votre client_ref est souvent le choix naturel.

Un résultat par requête, dans n’importe quel ordre

Les requêtes sont soumises en parallèle, donc une requête rapide en dépasse une lente. Associez sur correlation_id, jamais sur la position.

Un refus est un résultat, pas une erreur de flux

Un solde vide, la limite de débit ou un champ invalide répond à cette seule requête, et le flux continue. Le flux lui-même ne se termine que lorsque vous fermez votre côté — alors avec OK, après le dernier résultat — ou lorsque la passerelle s’arrête.

Lisez en continu, sinon le flux se bloque

La passerelle détient au plus 256 de vos requêtes à la fois sur un flux — en cours de soumission, ou répondues et attendant que vous lisiez le résultat. Au-delà, elle cesse de lire le flux jusqu’à ce qu’un résultat ait été lu, et le contrôle de flux HTTP/2 ordinaire retient vos écritures. Donc : écrivez aussi vite que votre bibliothèque le permet, et lisez les résultats en continu sur un autre thread ou une autre tâche. Un client qui écrit tout d’abord et lit ensuite s’arrête après 256. Pour plus de concurrence, ouvrez plus de flux — chacun a ses propres 256. Ils partagent tous la limite de messages par seconde de votre compte, donc plus de flux apportent de la concurrence, pas du débit.

Quand la passerelle s’arrête

Une passerelle en cours de redémarrage termine ses flux proprement :
  1. Les requêtes déjà en cours de soumission se terminent, et leurs résultats sont envoyés.
  2. Les requêtes reçues mais pas encore commencées reçoivent UNAVAILABLE / SHUTTING_DOWN sans être soumises.
  3. Le flux se termine avec UNAVAILABLE (SHUTTING_DOWN).
Rétablissez la connexion — vers un autre nœud, ou vers celui-ci quand il est revenu — refaites Login, et ne renvoyez que ce qui n’a pas de résultat, avec le même client_ref, pour que rien ne soit envoyé deux fois. Une connexion qui tombe sans cette fin ordonnée vous laisse des requêtes sans résultat. Renvoyez-les aussi, avec le même client_ref : celles qui avaient été acceptées reviennent avec duplicate: true.

Voir aussi

Exemples

Send et SendStream en Python, Java et Go.

POST /secure/send

Le jumeau REST de chacun des champs ci-dessus.