如何处理大型 http JSON 响应正文
How to handle large http JSON response body
有REST-API那return大JSON数据
示例结果:
{
"arrayA":[
{
"data1":"data",
"data2":"data"
},..
],
"arrayB":[
{
"data1":"data"
},..
]
}
“arrayA”可能记录 0 到 100 条记录,但“arrayB”可能有 100 万到 1000 万条记录
它使我的 java 应用程序内存不足。
我的问题是如何处理这个案例。
这里有不同的关注点,IMO 这个问题太宽泛了,因为最好的解决方案可能取决于实际用例。
你说,你有一个 REST API 并且你想“保护”服务器免受内存不足错误的影响,我明白了。
但是,假设您找到了修复服务器 OOM 错误的方法,那么什么样的客户端会想要一次查看数千万个对象?如果是浏览器,真的需要吗?客户端的 JSON 处理需要多长时间?应用程序的客户端会不会变得太慢而客户会开始抱怨?我相信你明白了。
所以第一种方法是“重新思考”为什么你需要这么大的回应。在这种情况下,最好的解决方案可能是重构和更改客户端-服务器通信的逻辑
现在,另一种可能的情况是您有一个“集成”——某种服务器到服务器的通信。
在这种情况下,一次添加整个 json 响应甚至进行流式处理都没有意义。例如,如果您在云中 运行,您可能希望将这个巨大的 json 字符串添加到某个文件并上传到 S3,然后向其提供 link(因为 S3 可以处理这样的文件)。当然在非AWS环境下还有其他选择。
作为一个“精简”的想法,您可能会收到请求,在文件系统上创建临时文件,将数据分块写入其中,然后 return 将“FileResource”写入客户端。逐块工作将确保 java 应用程序端的内存消耗较低。基本上它等同于下载动态生成的文件。当您关闭流时,您可能想要删除该文件。
如果您有某种“获取堆转储”或任何通用功能的数据转储,这将最有效。
有REST-API那return大JSON数据 示例结果:
{
"arrayA":[
{
"data1":"data",
"data2":"data"
},..
],
"arrayB":[
{
"data1":"data"
},..
]
}
“arrayA”可能记录 0 到 100 条记录,但“arrayB”可能有 100 万到 1000 万条记录 它使我的 java 应用程序内存不足。 我的问题是如何处理这个案例。
这里有不同的关注点,IMO 这个问题太宽泛了,因为最好的解决方案可能取决于实际用例。
你说,你有一个 REST API 并且你想“保护”服务器免受内存不足错误的影响,我明白了。
但是,假设您找到了修复服务器 OOM 错误的方法,那么什么样的客户端会想要一次查看数千万个对象?如果是浏览器,真的需要吗?客户端的 JSON 处理需要多长时间?应用程序的客户端会不会变得太慢而客户会开始抱怨?我相信你明白了。
所以第一种方法是“重新思考”为什么你需要这么大的回应。在这种情况下,最好的解决方案可能是重构和更改客户端-服务器通信的逻辑
现在,另一种可能的情况是您有一个“集成”——某种服务器到服务器的通信。
在这种情况下,一次添加整个 json 响应甚至进行流式处理都没有意义。例如,如果您在云中 运行,您可能希望将这个巨大的 json 字符串添加到某个文件并上传到 S3,然后向其提供 link(因为 S3 可以处理这样的文件)。当然在非AWS环境下还有其他选择。
作为一个“精简”的想法,您可能会收到请求,在文件系统上创建临时文件,将数据分块写入其中,然后 return 将“FileResource”写入客户端。逐块工作将确保 java 应用程序端的内存消耗较低。基本上它等同于下载动态生成的文件。当您关闭流时,您可能想要删除该文件。
如果您有某种“获取堆转储”或任何通用功能的数据转储,这将最有效。