Streaming de datos con aschannel (v2)

Actualizado

aschannel es un punto final de transmisión que permite a los clientes recuperar los resultados de cada tarea enviada, en tiempo real, a medida que se generan. Las API de transmisión difieren de las API normales en que una conexión se mantiene abierta indefinidamente y los mensajes se envían al cliente inmediatamente después de que estén disponibles.

Los clientes se suscriben a una o más cuentas utilizando asmaster , o solicitan datos directamente a través de asapi , y los resultados se transmitirán al cliente en tiempo real una vez que estén disponibles.

Conectando al canal

Se puede hacer una conexión a un canal utilizando el siguiente comando:

$ curl \
    -X GET \
    -H "Authorization: Token <TOKEN>" \
    -d "stream=<STREAM>" \
    https://aschannel.reincubate.com/stream/

Donde <TOKEN> es el token del cliente y <STREAM> el ID de flujo del cliente. Este ID es proporcionado por el punto final asapi cuando se envía una tarea, y es un valor constante vinculado al token de un cliente.

Resolución de problemas de códigos de respuesta HTTP

Cuando se conecte a un canal, se enviará un código de respuesta HTTP en el encabezado de respuesta. La siguiente tabla describe sus significados.

Estado Texto Descripción
200 DE ACUERDO Todo esta bien.
400 Solicitud incorrecta La solicitud está mal formada.
401 No autorizado El token del cliente no es válido.
503 Servicio no disponible aschannel no está disponible actualmente: verifique status.reincubate.com

Interpretando la corriente

Cada mensaje de aschannel consta de dos partes: un encabezado y una carga útil. El encabezado contiene metadatos sobre el mensaje, mientras que la carga útil contiene el mensaje en sí. Esto podría ser un mensaje del sistema o los datos que el cliente ha solicitado. Tanto el encabezado como la carga útil terminan en un retorno de carro y una nueva línea, y cada uno tiene un prefijo con un número que indica la longitud de la siguiente pieza de datos.

<HEADER_LENGTH>\r\n
<HEADER>\r\n
<PAYLOAD_LENGTH>\r\n
<PAYLOAD>\r\n

Tanto <HEADER_LENGTH> como <PAYLOAD_LENGTH> son enteros y ambos representan la longitud del siguiente campo, incluido el \r\n . El encabezado siempre está codificado en JSON, pero el formato de la carga útil varía según el tipo. En consecuencia, uno podría consumir mensajes desde un canal con Python así:

buf = response.raw
while not buf.closed:
    header_length = buf.readline()
    header = buf.read(header_length)
    payload_length = buf.readline()
    payload = buf.read(payload_length)

    handle_payload(header, payload)

En la primera conexión, la respuesta será similar a esta, y la conexión permanecerá abierta:

66
{ "type": "system",
  "id": "cff35e74-c709-4374-348e-03ea9a2cee61"}
45
{ "message": "Message streaming has begun."}

Aquí, 66 y 45 son la longitud del encabezado y la longitud de la carga útil, respectivamente. La reconexión con la misma clave de otro terminal dará esto:

66
{ "type": "system",
  "id": "ad17c5a5-c658-4736-876e-cf7901be7292"}
155
{ "message": "A new HTTP connection has been opened using your your authentication details, culling old connections.",
  "error": "CULLING_OLD_CONNECTIONS"
}

Interpretación de la carga útil fragmentada

Cualquier carga útil que sea más grande que unos pocos kilobytes se dividirá en partes más pequeñas, que el cliente debe volver a ensamblar para formar la carga útil original. Los encabezados contendrán campos denominados chunk , total_chunks y chunk_size . Estos encabezados pueden estar presentes incluso cuando solo hay un solo fragmento.

Como ejemplo, un resultado fragmentado para una tarea de login resultaría en un resultado como el siguiente:

123
{ "chunk": 1,
  "total_chunks": 1,
  "type": "log-in",
  "task_id": "2a24db6c-6870-4a27-a45a-a5c172d8ec98",
  "chunk_size": 16384
}
51
{ "message": "Log-in successful",
  "success": true
}

Recibiendo resultados de tareas

El siguiente es un ejemplo de una respuesta de mensaje de una tarea fetch_data en el servicio de icloud :

137
{ "stream": "<STREAM>",
  "task_id": "<TASK_ID>",
  "chunk": 1,
  "total_chunks": 1,
  "chunk_size": 16384,
  "type": "<PAYLOAD_TYPE>"
}
288
{ "sms": [{
    "conversation_id": "+447910000000",
    "from_me": false,
    "handle": "vodafone",
    "attachments": [],
    "deleted": false,
    "type": "SMS",
    "date": "2016-09-16 11:52:53.000000",
    "text": "Welcome to Vodafone!",
    "group_handles": null,
    "id": 1
  }]
}

Aquí, <TASK_ID> es el mismo <TASK_ID> dado por asapi cuando se envió la tarea. El <PAYLOAD_TYPE> describe la naturaleza de la carga útil, y se describirá utilizando el slug de la acción enviada a través de asapi .

Recepción de mensajes del sistema.

De vez en cuando, es posible que ricloud deba transmitir mensajes del sistema al cliente. Estos siempre se identifican por el campo de type de encabezado que se establece en system . Por ejemplo:

16
{ "type": "system"
}
97
{ "code": "client-too-slow",
  "message": "The client is reading data too slowly. Disconnecting."
}

Los siguientes valores de code mensaje del sistema son posibles:

Respuesta Resumen
reconnect Se requiere reconexión
CULLING_OLD_CONNECTIONS Conexión simultanea
WARNING_SLOW_CONNECTION Advertencia de búfer
CLOSING_SLOW_CONNECTION Cliente demasiado lento

Se requiere reconexión

El canal puede indicar al cliente que se vuelva a conectar, si es así, el cliente debe abrir una nueva conexión al punto final proporcionado lo antes posible.

Conexión simultanea

El canal solo permite una única conexión abierta por cliente, si un cliente abre una nueva conexión, la anterior se eliminará con este mensaje.

Advertencia de búfer

Los clientes pueden ser desconectados por no consumir mensajes a la velocidad que se les proporciona. Se les advertirá si se están quedando atrás, comenzando cuando el búfer interno alcance un umbral predefinido del 40% de los mensajes que se guardan para ellos.

Cliente demasiado lento

Este mensaje se envía cuando la conexión finaliza cuando el consumo de mensajes es demasiado lento.

Si el cliente tiene un atraso en las tareas y consume mensajes fácilmente, corre el riesgo de ser desconectado repetidamente y, por lo tanto, perder muchos o todos los resultados de las tareas. Una vez que el cliente se vuelva a conectar, solo se transmitirán los resultados de las tareas que se hayan completado luego de la desconexión.

¿Cómo podemos ayudar?

¡Nuestro equipo de soporte está aquí para ayudar!

Nuestro horario de atención es de lunes a viernes de 9 a.m. a 5 p.m. GMT. El tiempo es actualmente 11:44 AM GMT.

Intentamos responder todos los mensajes en un plazo de un día laboral.

Ir a la sección de soporte › Póngase en contacto con el equipo de la empresa. ›
Nuestro increíble equipo de soporte.

© 2008 - 2019 Reincubate Ltd. Todos los derechos reservados. Registrado en Inglaterra y Gales #5189175, VAT GB151788978. Reincubate® es una marca registrada. Términos y privacidad. Recomendamos la autenticación de múltiples factores. Construido con en Londres.