0

我正在对分布式 API 请求进行实验。我正在用 PHP 构建一个网站,允许我的用户代表服务器发出请求。通过这样做,我应该能够将请求分发给所有用户,并让我的应用程序即使在大量流量的情况下也能保持可扩展性。

我的最终目标是让浏览器发出 API 请求,解析响应并将解析后的数据提交到我的服务器。这应该消除我的应用程序当前遭受的性能瓶颈。但是,我遇到了如何构建这个系统的问题。

以下是我设想的系统工作方式:

  1. 用户访问网站
  2. API 请求队列是从工作列表中加载的
  3. 浏览器从工作队列发出多个 API 请求并解析响应
  4. 浏览器通过 AJAX 将解析后的数据发送到服务器
  5. 服务器更新旧数据,添加时间戳,并从工作队列中删除请求
  6. 在预定的 TTL 工作再次添加到队列并重复处理之后

以下是我的担忧:

  • API 请求不是在与我的服务器相同的域上发出的。我知道这会在从用户的浏览器请求数据时出现问题(因为同源策略)。我已经研究过使用代理 PHP 文件,但这也引起了一些担忧——请参阅我的下一个项目符号。
  • 分发解析只是问题的一部分,另一个问题是限制我的请求。我每秒可以发出的请求数量有限,这导致了可伸缩性问题。恐怕通过创建代理文件来发出请求,我仍然受到请求限制的限制,因为从技术上讲,请求仍然通过代理文件来自我的服务器。
  • 由于浏览器正在解析响应并将其发送到我的服务器,因此可以想象有人可以通过 AJAX 调用将恶意数据注入服务器。

最后是我的问题:

  • 根据我的要求,使用代理 PHP 文件是发出这些请求的最佳方法吗?
  • 如果使用代理文件最好的方法,我是否仍会受到请求限制的限制,或者是否将请求(以及因此的限制限制)传递给客户端?
  • 除了标准的安全措施(转义字符串、剥离斜线和使用 SSL)之外,您还能想到在 AJAX 到服务器的通信中采取的任何其他预防措施吗?
  • 有没有人这样做过,如果是这样,有没有我可以效仿的例子?我四处搜索,我的搜索措辞一定是错误的,因为我的所有结果都与我的要求无关。
  • 最后是一些可选的意见问题……您对这种方法有什么看法?这种结构是否存在致命缺陷?有没有更好的方法来实现我想要做的事情?

预先感谢您的帮助!

4

1 回答 1

0

我最终解决这个问题的方法是使用 JSONP 并通过客户端浏览器加载内容。这是流程:

  • 客户端访问站点并收到 API 请求 URL 列表。这些 URL 嵌入了脚本标签(以绕过​​同源策略)。使用 JSONP 方法,数据作为包含数据对象的回调函数返回。
  • JSONP 数据然后在私有函数中被解析客户端以避免被客户端操作并发送到 AJAX 处理程序。我还在处理程序中添加了转义和验证以提高安全性。
  • Handler 将解析后的数据连同时间戳一起提交给 MySQL。如果进行了插入,则为指定条目更新工作队列。CRON 作业定期运行清理例程以更新队列并将其设置为缓存数组。从该数组中提取新的 URL 并重复该过程。

在做了一些测试后,我发现了以下关于我的问题:

  • 代理文件只是代表客户端发出请求。因为服务器正在发出请求,所以这仍然会受到限制。
  • 我发现可以从客户端浏览器窗口发出请求的唯一方法是 JSONP、CORS 和 WebSockets。CORS 和 Websocket 并非在每个浏览器中都可用,所以我没有走那条路。JSONP 有内容长度限制,但我不会为每个客户端解析大量数据,而是解析大量数据作为一个整体——这就是我选择 JSONP 的原因。解析 iframe 也可以,但我无法找到适用于大多数浏览器的解决方案。最终,我想添加多种获取数据的形式,以确保尽可能多的用户在分发中共享。
  • 支持 JSONP 和 CORS 的 API 有很多!实际上,我很惊讶有多少。当 API 不支持它时,它会变得有点棘手,但当我遇到它时,我会跨越那座桥。
  • 我仍然想知道是否有人认为这种方法在某些方面存在致命缺陷,但我觉得使用像 JSONP 这样已建立的东西而不是一些自定义脚本解决方案更舒服。
于 2013-08-30T14:10:40.883 回答