如何处理大小超过 2 mb 的帖子数据
Posted
技术标签:
【中文标题】如何处理大小超过 2 mb 的帖子数据【英文标题】:How to handle post data of size more than 2 mb 【发布时间】:2016-12-19 16:45:24 【问题描述】:我有以下模板的 json 发布数据
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [
"tableName" : JSONString,
"records" : [
"recordVersion" : JSONString,
"tableItems" : []
]
]
在 Java 方面,我有这样的 REST API:
@POST
@Path("/themeId")
@Consumes(MediaType.APPLICATION_JSON)
public Response postTheme( @PathParam("themeId") String themeId, ThemeDictionary dictionary) throws InterruptedException
//code to handle
post 数据小于 2 MB 时效果很好,但是如何处理大于 2 MB 的数据。
问题
1) 我应该使用分页吗?
2) 如果我将 json 分成两半,那么每一半都不是有效的 json。那么,我应该在服务器端接受字符串并连接吗?
3) 有没有很好的例子来处理这种情况
4) 寻找一种可以处理大小小于或大于 2 MB 的 json 数据的方法
【问题讨论】:
你试过bson吗? 我没试过,但是总的帖子数据大小会是 50 MB.. Bson 没有限制吗? 老实说,这只是一个建议,可能会稍微优化一下大小。总有效负载为 50MB,您可能仍然需要某种形式的分页。 进行不那么单一的数据交换,发布较小的项目,每条记录左右。即使使用压缩(标头Accept-Encoding: gzip
),50 MB(压缩后可能约为 1 MB)也太大了。
需要定义一些阈值,达到阈值后只需将数据发布到服务器。这样您可以最大限度地减少分页方法中的服务器调用次数。
【参考方案1】:
2MB 相当小,我认为将 json 文件作为多部分上传的方法,然后通常处理 json 文件可以处理高达 50MB 大小的文件。处理文件上传的例子可以在here找到。
对于百MB以上的json文件,我们必须想办法在流中处理,或者将文件拆分成更小的文件。
【讨论】:
【参考方案2】:分页是不错的选择,但需要人工干预。 取而代之的是,您可以发送多个异步请求以获取数据(即,在一个请求中获取 1-200 条记录,下一个请求将获取 200-400 条记录),但不推荐使用这种方式,因为您的服务器将基于记录数。
【讨论】:
【参考方案3】:分页无法解决您的问题,因为您将数据发送到服务器,而不是接收。
您使用什么 servlet 容器?它看起来像默认的 tomcat POST 限制大小。
如果你使用的是独立的tomcat,你需要设置参数 maxPostSize 用于您的连接器:see here 或 (here)
【讨论】:
我正在使用 websphere。 您使用哪个版本?您可以尝试像这里描述的那样配置它:serverfault.com/q/311610 吗? wlp-javaee7-8.5.5.9 分页不仅适用于从服务器发送数据,也适用于接收数据。分页意味着分页数据从一侧发送到另一侧。 javaMan,如果有这里描述的设置:ibm.com/support/knowledgecenter/SS7JFU_7.0.0/…这里原帖:***.com/a/16593022/2003797【参考方案4】:Json 文件非常适合压缩。你应该考虑一下。
是的,您应该使用分页。但它会有一些缺点。比如一致性。
您应该通过不分成字符串来发送它们。我建议你发送有意义的数据。所以分页将是有意义的。如果消息的其中一个部分(块)丢失,您应该只重新发送该部分。不是所有部分。
“你怎么能吃一条真正的大鱼?-切薄”。
尝试发布较小且有意义的部分。否则你的服务器将需要更多的计算时间来处理数据,你的客户端需要更多的内存来处理。
【讨论】:
【参考方案5】:您是否有任何理由不在一个请求中发送数据?将 50MB 作为一个请求发送。 JSON 或 HTTP 发布规范中的数据大小没有限制,如下面的 SO 问题中所述
Is there a limit on how much JSON can hold?
Is Http POST limitless?
如果您担心服务器的性能。一种可能的选择是在逻辑上拆分您的 json,以便可以在更小的块中执行操作。
例如,考虑到您的表格数组中有 200 个项目,您可以考虑将表格数组分成更小的块,例如每个请求 50 /20 个。
"totalPages":2,
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [
//first 50 tables
"tableName" : JSONString,
"records" : [
"recordVersion" : JSONString,
"tableItems" : []
]
]
下一个请求
"totalPages":2,
"themeId" : JSONString,
"themeName" : JSONString,
"tables" : [
//next 50 tables
"tableName" : JSONString,
"records" : [
"recordVersion" : JSONString,
"tableItems" : []
]
]
如果您不需要完整的数据来处理请求,您可以在数据到达时对其执行操作。如果没有,请将表数组添加到某个 db/file/memory 直到收到最后一页,并且对于最后一个请求,将 json 重新合并在一起并处理请求并发回正确的响应。如果是第二种情况,性能提升不大。
【讨论】:
以上是关于如何处理大小超过 2 mb 的帖子数据的主要内容,如果未能解决你的问题,请参考以下文章
Mule 4:Dataweave 2.0:如何处理大小超过10k的数据库记录?