Streaming data met aschannel (v2)

bijgewerkt

aschannel is een streaming-eindpunt waarmee klanten de resultaten van elke ingediende taak - in realtime - kunnen ophalen wanneer ze worden gegenereerd. Streaming-API's verschillen van reguliere API's doordat een verbinding voor onbepaalde tijd wordt geblokkeerd en berichten direct na beschikbaar worden naar de client worden verzonden.

Cliënten abonneren op een of meer accounts met asmaster , of vragen gegevens rechtstreeks aan via asapi , en de resultaten worden in realtime naar de client gestreamd zodra ze beschikbaar zijn.

Verbinding maken met het kanaal

Een verbinding met aschannel kan gemaakt worden met behulp van de volgende opdracht:

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

Waar <TOKEN> het token van de client is en <STREAM> de stream-ID van de client. Deze ID wordt geleverd door het asapi- eindpunt wanneer een taak wordt ingediend en het is een constante waarde die is gekoppeld aan het token van een klant.

Problemen met HTTP-antwoordcodes oplossen

Bij verbinding met aschannel wordt een HTTP-antwoordcode verzonden in de antwoordheader. De onderstaande tabel beschrijft hun betekenissen.

staat Tekst Omschrijving
200 OK Alles is in orde.
400 Foutief verzoek Het verzoek is misvormd.
401 onbevoegd Clienttoken is ongeldig.
503 Service onbeschikbaar aschannel is momenteel niet beschikbaar: controleer status.reincubate.com

De stroom interpreteren

Elk bericht van aschannel bestaat uit twee delen: een header en een payload. De kop bevat metagegevens over het bericht, terwijl de payload het bericht zelf bevat. Dit kan een systeembericht zijn of de gegevens die de klant heeft opgevraagd. Zowel de header als de payload eindigen in een carriage return en een nieuwe regel, en elk wordt voorafgegaan door een nummer dat de lengte van het volgende stuk data aangeeft.

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

Zowel <HEADER_LENGTH> als <PAYLOAD_LENGTH> zijn gehele getallen en geven beide de lengte van het volgende veld weer, inclusief de \r\n . De header is altijd JSON-gecodeerd, maar het payload-formaat varieert afhankelijk van het type. Bijgevolg zou men berichten van het aschannel met Python kunnen gebruiken als volgt:

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)

Bij de eerste verbinding ziet het antwoord er ongeveer zo uit en blijft de verbinding open:

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

Hier zijn 66 en 45 respectievelijk de headerlengte en de nuttige lastlengte. Opnieuw verbinden met dezelfde sleutel van een andere terminal geeft dit:

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

Tolerante ladingen interpreteren

Elke payload die groter is dan enkele kilobytes, wordt opgesplitst in kleinere chunks, die een client opnieuw moet assembleren om de oorspronkelijke payload te vormen. Headers bevatten velden met de total_chunks chunk , total_chunks en chunk_size . Deze headers kunnen aanwezig zijn, zelfs als er slechts een enkele brok is.

Als een voorbeeld een gehavend resultaat voor een login zou resulteren in een uitvoer zoals hieronder:

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
}

Taakresultaten ontvangen

Het volgende is een voorbeeld van een berichtreactie van een taak fetch_data op de icloud service:

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

Hier is de <TASK_ID> dezelfde <TASK_ID> gegeven door asapi toen de taak werd ingediend. De <PAYLOAD_TYPE> beschrijft de aard van de payload en wordt beschreven aan de hand van de slug van de actie die via asapi wordt ingediend.

Systeemmeldingen ontvangen

Van tijd tot tijd moet ricloud mogelijk systeemberichten naar de client verzenden. Deze worden altijd geïdentificeerd door de kop van type veld dat wordt ingesteld op system . Bijvoorbeeld:

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

De volgende systeemboodschap code waarden mogelijk:

antwoord Samenvatting
reconnect Opnieuw verbinden vereist
CULLING_OLD_CONNECTIONS Gelijktijdige verbinding
WARNING_SLOW_CONNECTION Buffer waarschuwing
CLOSING_SLOW_CONNECTION Client te langzaam

Opnieuw verbinden vereist

Het kanaal kan de client opdracht geven om opnieuw verbinding te maken. Als dit het geval is, moet de client zo snel mogelijk een nieuwe verbinding met het geleverde eindpunt openen.

Gelijktijdige verbinding

Het kanaal staat slechts één open verbinding per client toe, als een client een nieuwe verbinding opent, wordt de oude met dit bericht gedood.

Buffer waarschuwing

Cliënten kunnen worden losgekoppeld omdat ze berichten niet kunnen gebruiken tegen het tarief dat ze krijgen. Ze worden gewaarschuwd als ze achterlopen, te beginnen wanneer de interne buffer een vooraf gedefinieerde drempel bereikt van 40% van hun berichten die voor hen worden bewaard.

Client te langzaam

Dit bericht wordt verzonden als de verbinding wordt verbroken wanneer het berichtenverbruik te traag is.

Als de client een taakachterstand heeft en berichten goed doorneemt, loopt deze het risico dat deze herhaaldelijk worden verbroken en daardoor veel of alle taakresultaten verliezen. Zodra een client opnieuw verbinding maakt, worden deze alleen gestreamd met resultaten van taken die zijn voltooid na het verbreken van de verbinding.

Hoe kunnen we helpen?

Ons ondersteuningsteam is er om u te helpen!

Onze kantooruren zijn van maandag tot vrijdag van 09.00 tot 17.00 uur GMT. De tijd is momenteel 2:33 PM GMT.

We streven ernaar om alle berichten binnen één werkdag te beantwoorden.

Ga naar het ondersteuningsgedeelte › Neem contact op met het Enterprise-team ›
Ons geweldige ondersteuningsteam

© 2008 - 2019 Reincubate Ltd. Alle rechten voorbehouden. Geregistreerd in Engeland en Wales #5189175, VAT GB151788978. Reincubate® is een geregistreerd handelsmerk. Privacy en voorwaarden. Wij bevelen 2FA aan. Gebouwd met in Londen.