每分钟调用相同的 API 超过 2000 次(JSON/PYTHON),使用(HTTP 同步、HTTP 异步、Websocket 或其他)?
Posted
技术标签:
【中文标题】每分钟调用相同的 API 超过 2000 次(JSON/PYTHON),使用(HTTP 同步、HTTP 异步、Websocket 或其他)?【英文标题】:Calling the same API over 2000 times every minute (JSON/PYTHON), use (HTTP sync, HTTP async, Websocket, or Other)? 【发布时间】:2018-12-29 10:15:55 【问题描述】:我正在尝试从金融机构 API 收集 2000 多只股票的 1 分钟数据,一旦数据可用,就会每分钟都收集一次。我想在交易时间内收集数据。我想使用 python 收集这些数据。
示例 API URL [不是有效的 URL]:https://api.finance.com/v1/marketdata/[STOCK]/1minute
条件:
-
我们知道,所有 2000 多只股票的 1 分钟数据一旦到达,就可以检索。 例如,如果当前时间是上午 10:02:00,我想从 GOOG 获取上午 10:01:00 的数据,我会调用 URL:https://api.finance.com/v1/marketdata/GOOG/1minute,我会看到上午 10:01:00数据。
我们知道数据以 JSON 格式存储。
存在限制。假设请求之间有 500 毫秒的等待时间。
我需要一分钟的数据滴答数据(即开盘价、最低价、最高价、收盘价)。
问题:如何在 30 秒内收集所有 2000 多只股票数据?
我想出的解决方案,虽然我不知道在这种情况下它是否是最佳的,或者我对 HTTP 请求、HTTP 异步、WebSocket 的理解是否在某些方面有所欠缺。
可能的解决方案?:
-
带有 For 循环的 HTTP 请求:目前我正在使用一个简单的 for 循环和一个 time.sleep() 函数。它是最简单的实现。但问题是由于节流限制,最多需要 16 分钟。
HTTP 异步:据我了解,我可以为每只股票创建一个单独的线程并以这种方式收集一分钟的数据。但根据我所阅读的内容,我最多可以同时运行大约 100 个线程。这是一个正确的假设吗?另外,大多数服务器不是不允许从一台客户端计算机同时发出这么多请求吗?
Websocket:据我了解,我可以简单地与服务器创建一个连接并获取数据,而不必担心油门限制。理想情况下,我会使用 websocket 构建应用程序。这是解决此类问题的最佳方法的正确假设吗?但是,我目前使用此方法的问题是它们的 1 滴答分钟数据只能通过此 API URL 调用方法获得。据我所知,我无法通过 websocket 连接检索该数据(即,如果我连接到他们的 websocket url:wss://stream-finance.com/ws,则 1 分钟数据不是可用数据之一另一端)我在这里的问题是:是否可以使用 https url 创建 websocket 连接?此外,如果该 1 分钟数据不是获取的可用选项之一,是否可以通过他们的 websocket url wss://stream-finance.com/ws 检索该 1 分钟数据?
其他:他们的另一种方法是否更适合这种情况?
最佳解决方案?:我看到的最佳解决方案是简单地创建一个与其服务器的连接,然后调用每只股票以“实时”每 1 分钟更新一次。但我不知道如何通过他们提供的 HTTPS URL 来实现。
【问题讨论】:
显而易见的问题:API 是否允许批量查询(即在一个请求中查询多个股票)? 1. api.finance.com 甚至不是一个适合我的网站。你在哪里找到这个的? 2. 如果您每分钟达到 2,000 个 API(即每秒 33 个以上的请求)并且它们以每秒 2 个速度限制,那么您很可能会因偏见而被防火墙阻止。 @JasonBaumgartner 这是一个任意的 url,不是一个有效的站点。只是为了说明问题。 如果这是一个假设性的问题,真的很难给出一个好的答案。解决方案将取决于 API 的功能。这是一个过于宽泛的问题。 @Tomalak 据我所知,这是不可能的——不是通过文档。我也没有尝试在 URL 中添加股票名称之间的 %2C 逗号。 【参考方案1】:你的问题有点混乱。让我们在这里分离一些关注点。
服务器
通信协议的选择完全取决于服务器端实现什么,你只需相应地开发你的客户端。
下面是我见过的一组选项和技术:
HTTP Pooling(我喜欢称之为命中并运行技术)只需按时间间隔向感兴趣的端点发出 HTTP 请求;每分钟似乎都是您的用例。几乎所有的 HTTP API 都将支持这一点。 HTTP 长池化 类似池化,支持长池化的服务器将挂起 HTTP 连接,直到它提供适当的数据或达到超时。从客户端的角度来看,您仍然在间隔不断地请求数据,只是服务器延迟回复,直到数据可用。 Web 套接字(这非常适合您的情况)这实质上是结合了这两种技术(这里过于简单化了),服务器将在保持连接的同时做出响应,并通过它不断地发送新数据。客户
无论您决定使用哪种协议,您的客户端软件都必须以某种方式处理网络延迟。
为简单起见,我假设您有一个名为 get_data()
的函数,它使用上述技术从服务器获取数据。
同步您的客户端将调用get_data()
,处理响应,然后重复。你已经习惯了,这就是python通常的工作方式。
异步您的客户端将对 get_data()
的调用分派给某个工作人员,当数据进入时将执行其他一些函数。本质上允许您的程序执行多个 API 调用,并且按响应顺序而不是请求顺序处理它们。
线程 与同步行为类似,您将处理每个请求/响应一个单独的 CPU 线程,处理传入的数据。(包含 Python's GIL 的所有警告)
注意
尽管看起来很明显,2000 多个线程并不是一个好的解决方案。
【讨论】:
以上是关于每分钟调用相同的 API 超过 2000 次(JSON/PYTHON),使用(HTTP 同步、HTTP 异步、Websocket 或其他)?的主要内容,如果未能解决你的问题,请参考以下文章