python - 套接字队列(Twitter 流作为引用)

标签 python sockets twitter streaming low-level

我刚刚发现 Twitter 流端点以某种方式支持慢速连接检测。

引用:https://dev.twitter.com/docs/streaming-apis/parameters#stall_warnings (以及页面底部)

想法是套接字发送可能会一一处理数据。它知道客户端何时收到一个数据包,因此它可以维护队列并始终知道其大小。

当客户端为每个人发送一些确认数据包时,这很容易。但 Twitter Streaming API 的情况并非如此 - 它是一种单向传输。

我的问题是:他们是如何实现这一目标的?如果没有一些非常低级别的原始套接字支持,我看不到一种方法来做到这一点 - 但我可能在这里忘记了一些东西。通过一些低级别的支持,我们可能可以获得每个数据包的 ACK。这可能吗?可以以某种方式追踪 ACK 吗?

还有其他想法是如何完成的吗? 有什么方法可以做到这一点,例如在Python中?或者任何其他语言示例将不胜感激。

或者也许我在这里有点难以理解,它只是用来跟踪有多少字节尚未通过 socket.send 处理?但这是否不能很好地表明客户端的连接情况?

最佳答案

我一开始的想法与您相同,但我认为实现实际上比我们预期的要容易得多。

Twitter 的 API 文档指出:-

“客户端读取数据的速度太慢。每个流连接都由要发送到客户端的消息队列支持。如果该队列随着时间的推移变得太大,连接将被关闭。” - https://dev.twitter.com/docs/streaming-apis/connecting#Disconnections

基于上述内容,我想象 Twitter 将有一个线程将推文推送到队列中,以及一个与客户端的长期 HTTP 连接(通过 while 循环保持打开状态),该连接从队列中弹出一条消息并将数据写入每次循环迭代期间的 http 响应。

现在,如果您想象一下 while 循环内发生的情况,并考虑缓冲区,Twitter 将从队列中弹出一个项目,然后将推文数据写入某种输出缓冲区,该缓冲区将被刷新,然后填满用于传输到客户端的 TCP 缓冲区。

如果客户端从其 TCP 缓冲区中缓慢读取数据,则服务器的 TCP 发送缓冲区将填满,这意味着当服务器的输出缓冲区被刷新时,它将阻塞,因为数据无法写入 TCP 缓冲区,这意味着 while 循环不会经常从队列中弹出推文(因为在刷新数据时它被阻塞),从而导致推文队列被填满。

现在您只需要在每次循环迭代开始时进行检查,以检查推文队列是否已达到某个预定义的阈值。

关于python - 套接字队列(Twitter 流作为引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911008/

相关文章:

python - 如何可靠地打开与当前正在运行的脚本位于同一目录中的文件

python - 模糊 C 均值算法是否可用于 Python?

php - 当服务器未指定文件末尾时,读取到XML响应的末尾?

node.js - 无法通过安全 (https) 连接连接到我的 AWS Node 服务器

java - Twitter 基本授权不起作用?

php - 通过 PHP 访问 Twitter API

python - tf.contrib.framework 函数的预期用途是什么?

python - 在文本 block 中查找并替换 URLS,返回文本 + URLS 列表

linux - 什么情况下是在前台或后台进行关闭/关闭?

python - Heroku推送失败: Distribution version mismatch with Anaconda-Client