Saltar al contenido principal
SendService tiene dos métodos. Send recibe un mensaje y da una respuesta, y refleja POST /secure/send campo por campo. SendStream lleva muchos mensajes en un solo stream bidireccional, para un volumen sostenido. Ambos necesitan el token de sesión de Login en el metadato authorization.

Send: un mensaje

Aceptado significa encolado para entrega, no entregado, exactamente como un 200 en REST. El resultado solo le llega como un acuse de entrega.

Campos

Todos los campos salvo to son optional: un campo que no establece se comporta exactamente como una clave JSON que omite en una petición REST, y toma el mismo valor por defecto. Se aplican las mismas aprobaciones, productos, gramática de TLV y límites, porque ambos llegan a las mismas comprobaciones. Los campos dlr_method y tags de REST no se transportan; sus números de campo están reservados para que nunca puedan reutilizarse para otra cosa.

Valores de custom_tlvs

Cada valor es un TlvValue que contiene exactamente uno de: La clave decide la codificación en el cable, exactamente como en REST. "0x1401:Int8" con int_value: 42 es el entero de 8 bytes 42, como lo es "0x1401:Int8": 42 en REST.
En el JSON de proto3 (lo que lee grpcurl) un entero de 64 bits se escribe como cadena. Los clientes generados reciben un entero nativo.

Acuses: dlr y dlr_url

El webhook siempre gana: un mensaje con dlr_url nunca aparece en el feed.
Si su proveedor ha desactivado el feed de acuses, dlr: true sin dlr_url se rechaza con INVALID_ARGUMENT indicando dlr_url (el mismo rechazo que da REST), porque los acuses no tendrían adónde ir.

La respuesta

price es una cadena a propósito: así un importe decimal sobrevive sin cambios en cualquier lenguaje, cosa que un número de coma flotante no haría.

Reintentar con seguridad con client_ref

Establezca client_ref en cada envío que pueda reintentar. Una repetición dentro de 24 horas desde la misma cuenta (por gRPC o por REST, sea cual sea el login que lo envió) se responde con el message_id del primer envío y duplicate: true, y no se vuelve a enviar ni a cobrar nada. Un envío que fue rechazado libera su referencia, así que la petición corregida puede reutilizarla. Las reglas son las de REST, descritas por completo en Reintentar con seguridad con client_ref, incluido el único hueco estrecho en un clúster de pasarelas. Esto importa sobre todo para una respuesta en particular: UNKNOWN con OUTCOME_UNKNOWN, donde el mensaje puede estar en camino. Reinténtela solo con el mismo client_ref. Consulte Errores y códigos de estado.

SendStream: muchos mensajes en un solo stream

Para un volumen alto y sostenido. Usted escribe SendStreamRequest y lee SendStreamResult en un solo stream bidireccional. Cada petición es un correlation_id elegido por usted y un SendRequest: exactamente el mensaje que pasaría a Send. Cada resultado es: correlation_id debe tener de 1 a 64 caracteres. Uno vacío o más largo se responde (solo para esa petición) con INVALID_ARGUMENT y field: correlation_id. Use algo único por petición en el stream; su client_ref suele ser la opción natural.

Un resultado por petición, en cualquier orden

Las peticiones se procesan concurrentemente, así que una rápida adelanta a una lenta. Empareje por correlation_id, nunca por posición.

Un rechazo es un resultado, no un error del stream

Un saldo vacío, el límite de tasa o un campo incorrecto responden a esa única petición, y el stream continúa. El stream en sí solo termina cuando usted cierra su lado (entonces con OK, después del último resultado) o cuando la pasarela se detiene.

Lea de forma continua, o el stream se atasca

La pasarela retiene como mucho 256 de sus peticiones a la vez en un stream, ya sea procesándose o respondidas y esperando a que usted lea el resultado. Por encima de eso deja de leer del stream hasta que se haya leído un resultado, y el control de flujo normal de HTTP/2 frena sus escrituras. Por tanto: escriba tan rápido como su biblioteca le permita y lea los resultados de forma continua en otro hilo o tarea. Un cliente que primero lo escribe todo y lee después se detiene tras 256. Para más concurrencia, abra más streams: cada uno tiene sus propios 256. Todos comparten el límite de mensajes por segundo de su cuenta, así que más streams dan concurrencia, no velocidad.

Cuando la pasarela se detiene

Una pasarela que se reinicia termina sus streams de forma ordenada:
  1. Las peticiones que ya se estaban procesando terminan, y se envían sus resultados.
  2. Las peticiones recibidas pero aún no iniciadas se responden con UNAVAILABLE / SHUTTING_DOWN sin procesarse.
  3. El stream termina con UNAVAILABLE (SHUTTING_DOWN).
Reconéctese (a otro nodo, o a este cuando vuelva), inicie sesión de nuevo y reenvíe solo lo que no tiene resultado, con el mismo client_ref, para que nada se envíe dos veces. Una conexión que se corta sin ese final ordenado le deja con peticiones sin resultado. Reenvíelas también, con el mismo client_ref: las que se aceptaron vuelven con duplicate: true.

Relacionado

Ejemplos

Send y SendStream en Python, Java y Go.

POST /secure/send

El gemelo REST de cada campo anterior.