【问题标题】:How to handle post data of size more than 2 mb如何处理大小超过 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)也太大了。
  • 需要定义一些阈值,达到阈值后只需将数据发布到服务器。这样您可以最​​大限度地减少分页方法中的服务器调用次数。

标签: java json jakarta-ee jersey websphere


【解决方案1】:

2MB 相当小,我认为将 json 文件作为多部分上传的方法,然后通常处理 json 文件可以处理高达 50MB 大小的文件。处理文件上传的例子可以在here找到。

对于百MB以上的json文件,我们必须想办法在流中处理,或者将文件拆分成更小的文件。

【讨论】:

    【解决方案2】:

    分页是不错的选择,但需要人工干预。 取而代之的是,您可以发送多个异步请求以获取数据(即,在一个请求中获取 1-200 条记录,下一个请求将获取 200-400 条记录),但不推荐使用这种方式,因为您的服务器将基于记录数。

    【讨论】:

      【解决方案3】:

      分页无法解决您的问题,因为您将数据发送到服务器,而不是接收。

      您使用什么 servlet 容器?它看起来像默认的 tomcat POST 限制大小。

      如果你使用的是独立的tomcat,你需要设置参数 ma​​xPostSize 用于您的连接器see here 或 (here)

      【讨论】:

      【解决方案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 重新合并在一起并处理请求并发回正确的响应。如果是第二种情况,性能提升不大。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-18
          • 2017-01-23
          相关资源
          最近更新 更多