2012-10-16 2 views
1

Je viens de découvrir que les points de terminaison de streaming Twitter supportent la détection de connexions lentes d'une manière ou d'une autre.File d'attente de socket (diffusion en continu sur Twitter comme référence)

Référence: https://dev.twitter.com/docs/streaming-apis/parameters#stall_warnings (et en bas de la page)

idée est que send socket probablement l'une des données de processus par un. Et il sait quand un paquet est reçu par le client afin qu'il puisse maintenir la file d'attente et sache toujours de sa taille.

C'est facile quand le client envoie des paquets de confirmation pour chacun d'entre eux. Mais ce n'est pas le cas avec Twitter Streaming API - c'est un transfert à sens unique.

Ma question est la suivante: comment ont-ils atteint cet objectif? Je ne peux pas voir un moyen de le faire sans un support de socket raw très bas niveau - mais je peux oublier quelque chose ici. Avec un support de bas niveau, nous pourrions probablement obtenir des ACK pour chaque paquet. Est-ce que c'est possible? Les ACK peuvent-ils être tracés?

D'autres idées comment cela a été fait? Tout moyen de le faire, par ex. en Python? Ou n'importe quel autre exemple de langue serait apprécié.

Ou peut-être que je suis au-dessus de ma tête ici et il utilise simplement pour suivre combien d'octets ne sont pas encore traités par socket.send? Mais n'est-ce pas une mauvaise indication de la connexion du client?

Répondre

2

J'ai commencé à penser comme vous, mais je pense que la mise en œuvre est en réalité beaucoup plus simple que ce à quoi nous nous attendons tous les deux.

état docs API de Twitter: -..

« Un client lit les données trop lentement chaque connexion en flux continu est soutenu par une file d'attente de messages à envoyer au client Si cette file d'attente devient trop importante au fil du temps, la la connexion sera fermée. " - https://dev.twitter.com/docs/streaming-apis/connecting#Disconnections

Sur la base de ce qui précède, j'imagine Twitter aura un fil qui pousse tweets sur une file d'attente et une connexion http longue durée de vie à un client (maintenu ouvert avec une boucle while) qui apparaît un message de la file d'attente et écrit les données dans la réponse http au cours de chaque itération de boucle. Maintenant, si vous imaginez ce qui se passe à l'intérieur de la boucle while et que vous pensez en termes de tampons, Twitter va sortir un élément de la file d'attente, puis écrire les données du tweet dans un tampon de sortie. un tampon TCP pour le transport vers le client.

Si un client est la lecture des données lentement de son tampon TCP puis le tampon d'envoi TCP du serveur remplira ce qui signifie que quand on rince le tampon de sortie du serveur, il bloc parce que les données ne peuvent être écrites dans la mémoire tampon TCP ce qui signifie par conséquent que la boucle while n'échappe pas aux tweets de la file d'attente aussi souvent (car elle est bloquée lorsque les données sont vidées) provoquant le remplissage de la file d'attente des tweets.

Maintenant vous auriez juste besoin d'une vérification au début de chaque itération de boucle pour vérifier si la file d'attente de Tweet a atteint un seuil prédéfini.

+0

C'est aussi ce que j'ai fini par faire. Merci pour votre réponse! – arkens

Questions connexes