我正在尝试编写一段代码:
- 通过一些请求访问 2 个网络服务
- 响应将是对象序列,每个对象由 id 标识,响应按 ID 升序排序
- 响应将很大并且流式传输(或 gzip 分块)
- 结果将是根据 ID 合并来自两个输入的数据
我试图实现的是,一旦响应的相应部分可用,就应该写出输出。我也不想等待整个响应到位,因为这会耗尽内存。我想尽快开始流式输出并尽可能少地保留在内存中。
什么是开始的好方法?
我看过 aleph 和 lamina,还有 async.http.client。这些工具似乎可以帮助我,但我很难弄清楚如何让一段代码对来自两个 Web 服务的响应的相同部分使用react。
最佳答案
你可以做这样的事情(使用 aleph - 在引擎盖下使用层 channel 抽象)。
- 使用
sync-http-request
创建 2 个 http 请求 - 从上面创建的 2 个请求对象中获取
:body
。例如:在 https://github.com/ztellman/aleph/wiki/Consuming-and-Broadcasting-a-Twitter-Stream :body
是一个lamina channel ,使用laminajoin
方法将2个 channel 合并为一个 channel- 订阅上述 channel (这是
join
调用的结果)。
现在,订阅回调将在到达任一 channel 时立即接收每个 JSON 对象,然后您可以拥有一个本地 atom
,它是一个映射,键是您在其上的值想要将来自 2 个 channel 的结果和值组合为一个向量,它将存储相同键的值。所以这将是这样的:
- 在回调中收到一个项目时,检查本地
atom
映射是否已经有键 - 如果 key 已经存在,则存储 key 的 2 个项目(一个已经在 map 中,另一个是您刚刚收到的项目)或对其进行一些其他处理,然后从 map 中删除 key 。
- 如果键不存在,则将键和值创建为
[item]
,即现在正在接收的一项的向量。
关于clojure 中 Web 响应的异步合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11067217/