如何处理大小超过 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,你需要设置参数 ma​​xPostSize 用于您的连接器: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的数据库记录?

我如何处理有关输入的字符串大小超过字符数组的设定大小的错误?

Hdfs的DN节点数据磁盘大小不均衡如何处理

如何处理不同的图像尺寸

Nginx 如何处理上游响应的数据

如何处理 R 中的大 JSON 文件?