Потоковая передача данных с помощью aschannel (v2)

обновленный

aschannel является конечной точкой потоковой передачи, которая позволяет клиентам получать результаты каждой переданной задачи - в режиме реального времени - по мере их создания. API потоковой передачи отличаются от обычных API тем, что соединение остается открытым в течение неопределенного времени и сообщения отправляются клиенту сразу же после его появления.

Клиенты подписываются на одну или несколько учетных записей, используя asmaster , или запрашивают данные напрямую через asapi , и результаты будут переданы клиенту в режиме реального времени, как только станут доступны.

Подключение к каналу

Соединение с aschannel может быть выполнено с помощью следующей команды:

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

Где <TOKEN> - токен клиента, а <STREAM> - идентификатор потока клиента. Этот идентификатор предоставляется конечной точкой asapi при отправке задачи, и это постоянное значение, привязанное к токену клиента.

Устранение неполадок с кодами ответов HTTP

При подключении к aschannel в ответном заголовке будет отправлен HTTP-код ответа. Таблица ниже описывает их значения.

Статус Текст Описание
200 Хорошо Все отлично.
400 Неверный запрос Запрос искажен.
401 неразрешенный Клиентский токен недействителен.
503 Сервис недоступен aschannel в настоящее время недоступен: проверьте status.reincubate.com

Интерпретация потока

Каждое сообщение от aschannel состоит из двух частей: заголовка и полезной нагрузки. Заголовок содержит метаданные о сообщении, а полезные данные содержат само сообщение. Это может быть системное сообщение или данные, запрошенные клиентом. И заголовок, и полезная нагрузка заканчиваются возвратом каретки и новой строкой, и каждому из них предшествует число, указывающее длину следующего фрагмента данных.

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

И <HEADER_LENGTH> и <PAYLOAD_LENGTH> являются целыми числами, и оба представляют длину следующего поля, включая \r\n . Заголовок всегда кодируется в формате JSON, но формат полезных данных зависит от его типа. Следовательно, можно получать сообщения из aschannel с Python следующим образом:

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)

При первом подключении ответ будет выглядеть примерно так, и соединение останется открытым:

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

Здесь 66 и 45 - длина заголовка и длина полезной нагрузки соответственно. Повторное соединение с тем же ключом от другого терминала даст это:

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

Интерпретация фрагментированных полезных нагрузок

Любая полезная нагрузка, размер которой превышает несколько килобайт, будет разбита на более мелкие куски, которые клиент должен повторно собрать для формирования исходной полезной нагрузки. Заголовки будут содержать поля с именами chunk , total_chunks и chunk_size . Эти заголовки могут присутствовать, даже если есть только один фрагмент.

В качестве примера, чанкированный результат для задачи login в login приведет к выводу, как показано ниже:

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
}

Получение результатов задания

Ниже приведен пример ответа сообщения от fetch_data задачи на 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
  }]
}

Здесь <TASK_ID> - это тот же <TASK_ID> задан asapi при отправке задачи. <PAYLOAD_TYPE> описывает природу полезной нагрузки, и будет описано с использованием slug действия , представленного с помощью asapi.

Получение системных сообщений

Время от времени ricloud может потребоваться передать системные сообщения клиенту. Они всегда определяются полем type заголовка, установленным в system . Например:

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

Возможны следующие значения code системного сообщения:

отклик Резюме
reconnect Требуется переподключение
CULLING_OLD_CONNECTIONS Одновременное соединение
WARNING_SLOW_CONNECTION Предупреждение о буфере
CLOSING_SLOW_CONNECTION Клиент слишком медленный

Требуется переподключение

Канал может дать команду клиенту переподключиться, если это так, клиент должен как можно скорее открыть новое соединение с предоставленной конечной точкой.

Одновременное соединение

Канал разрешает только одно открытое соединение для каждого клиента, если клиент открывает новое соединение, старое соединение будет уничтожено этим сообщением.

Предупреждение о буфере

Клиенты могут быть отключены за то, что они не принимают сообщения со скоростью, которую они предоставляют. Они будут предупреждены, если они отстают, начиная с того момента, когда внутренний буфер достигнет предопределенного порога в 40% их сообщений, хранящихся для них.

Клиент слишком медленный

Это сообщение отправляется, когда соединение прерывается, когда потребление сообщений происходит слишком медленно.

Если клиент имеет невыполненное задание и с готовностью потребляет сообщения, он рискует быть неоднократно отключенным, что приведет к потере многих или всех результатов задачи. После повторного подключения клиента в него будут переданы результаты только тех задач, которые были выполнены после отключения.

Как мы можем помочь?

Наша служба поддержки здесь, чтобы помочь!

Наш офис работает с понедельника по пятницу с 9:00 до 17:00 по Гринвичу. Время в настоящее время 2:34 ПП с GMT.

Мы стремимся отвечать на все сообщения в течение одного рабочего дня.

Перейти в раздел поддержки › Связаться с командой предприятия ›
Наша отличная команда поддержки

© 2008 - 2019 Reincubate Ltd. Все права защищены. Зарегистрировано в Англии и Уэльсе #5189175, VAT GB151788978. Reincubate® является зарегистрированным товарным знаком. Защита & Условия. Мы рекомендуем 2FA. Построен с в Лондоне.