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
Champs
Tous les champs saufto 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.
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 surcorrelation_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 avecOK, 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 :- Les requêtes déjà en cours de soumission se terminent, et leurs résultats sont envoyés.
- Les requêtes reçues mais pas encore commencées reçoivent
UNAVAILABLE/SHUTTING_DOWNsans être soumises. - Le flux se termine avec
UNAVAILABLE(SHUTTING_DOWN).
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.