Streaming de dados com aschannel (v2)

Atualizada

aschannel é um endpoint de streaming que permite aos clientes recuperar os resultados de cada tarefa submetida - em tempo real - à medida que são gerados. As APIs de streaming diferem das APIs regulares, pois uma conexão é mantida aberta indefinidamente e as mensagens são enviadas ao cliente imediatamente após a disponibilização.

Os clientes assinam uma ou mais contas usando asmaster ou solicitam dados diretamente via asapi , e os resultados serão transmitidos para o cliente em tempo real, uma vez disponíveis.

Conectando-se ao canal

Uma conexão para aschannel pode ser feita usando o seguinte comando:

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

Onde <TOKEN> é o token do cliente e <STREAM> o ID do fluxo do cliente. Esse ID é fornecido pelo terminal asapi quando uma tarefa é enviada e é um valor constante vinculado ao token de um cliente.

Solução de problemas de códigos de resposta HTTP

Ao se conectar a um canal, um código de resposta HTTP será enviado no cabeçalho de resposta. A tabela abaixo descreve seus significados.

Status Texto Descrição
200 Está bem Tudo está bem.
400 Pedido ruim A solicitação está malformada.
401 Não autorizado O token do cliente é inválido.
503 Serviço indisponível aschannel está indisponível no momento: verifique status.reincubate.com

Interpretando o fluxo

Cada mensagem de aschannel é em duas partes: um cabeçalho e uma carga útil. O cabeçalho contém metadados sobre a mensagem, enquanto a carga contém a própria mensagem. Pode ser uma mensagem do sistema ou os dados solicitados pelo cliente. O cabeçalho e a carga final terminam em um retorno de carro e uma nova linha, e cada um é prefixado por um número que indica o comprimento da parte de dados a seguir.

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

Tanto <HEADER_LENGTH> como <PAYLOAD_LENGTH> são inteiros e ambos representam o comprimento do próximo campo, incluindo o \r\n . O cabeçalho é sempre codificado em JSON, mas o formato de carga depende do tipo. Conseqüentemente, pode-se consumir mensagens do aschannel com o Python da seguinte forma:

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)

Na primeira conexão, a resposta será semelhante a essa, e a conexão permanecerá aberta:

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

Aqui, 66 e 45 são o comprimento do cabeçalho e o comprimento da carga, respectivamente. Reconectar com a mesma chave de outro terminal dará isto:

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"
}

Interpretação de cargas em bloco

Qualquer carga útil maior que alguns kilobytes será dividida em partes menores, que um cliente deve remontar para formar a carga original. Os cabeçalhos conterão os campos named chunk , total_chunks e chunk_size . Esses cabeçalhos podem estar presentes mesmo quando há apenas um único pedaço.

Por exemplo, um resultado em partes para uma tarefa de login resultaria em uma saída como abaixo:

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
}

Resultados da tarefa de recebimento

A seguir, um exemplo de uma resposta de mensagem de uma tarefa fetch_data no serviço 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
  }]
}

Aqui, o <TASK_ID> é o mesmo <TASK_ID> dado pelo asapi quando a tarefa foi submetida. O <PAYLOAD_TYPE> descreve a natureza da carga útil e será descrito usando o slug da ação enviada via asapi .

Recebendo mensagens do sistema

De tempos em tempos, o ricloud pode precisar transmitir mensagens do sistema para o cliente. Estes são sempre identificados pelo campo de type do cabeçalho sendo definido como system . Por exemplo:

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

Os seguintes valores de code mensagem do sistema são possíveis:

Resposta Resumo
reconnect Reconexão exigida
CULLING_OLD_CONNECTIONS Conexão simultânea
WARNING_SLOW_CONNECTION Aviso de buffer
CLOSING_SLOW_CONNECTION Cliente muito lento

Reconexão exigida

O canal pode instruir o cliente a reconectar, em caso afirmativo, o cliente deve abrir uma nova conexão com o terminal fornecido o mais rápido possível.

Conexão simultânea

O canal só permite uma única conexão aberta por cliente, se um cliente abrir uma nova conexão, o antigo será cancelado com essa mensagem.

Aviso de buffer

Os clientes podem ser desconectados por não consumirem mensagens na taxa em que estão sendo fornecidos. Eles serão avisados se ficarem para trás, iniciando quando o buffer interno atingir um limite predefinido de 40% de suas mensagens sendo retidas por eles.

Cliente muito lento

Esta mensagem é enviada quando a conexão é finalizada quando o consumo de mensagens é muito lento.

Se o cliente tiver um backlog de tarefas e consumir mensagens prontamente, corre o risco de ser desconectado repetidamente e, assim, perder muitos ou todos os resultados da tarefa. Depois que um cliente se reconectar, ele só será transmitido em resultados de tarefas concluídas após a desconexão.

Como podemos ajudar?

Nossa equipe de suporte está aqui para ajudar!

Nosso horário de atendimento é de segunda a sexta, das 9h às 17h GMT. A hora é atualmente 12:17 AM GMT.

Nosso objetivo é responder a todas as mensagens dentro de um dia útil.

Vá para a seção de apoio › Entre em contato com a equipe da empresa ›
Nossa equipe de suporte incrível

© 2008 - 2019 Reincubate Ltd. Todos os direitos reservados. Registrado na Inglaterra e no País de Gales #5189175, VAT GB151788978. Reincubate® é uma marca registrada. Privacidade e Termos. Recomendamos 2FA. Construído com em Londres.