已超过最大帧长度 65536

Max frame length of 65536 has been exceeded

我有一个设置,我正在使用 gremlin-core 库查询远程 Janusgraph 服务器。目前数据量适中,以后会增加。

几天前,我在我的客户端上看到 "Max frame length of 65536 has been exceeded" 错误。我的服务器 yaml 文件中 maxContentLength 参数的值设置为默认值 (65536)。我挖掘了代码并意识到我正在发送大量顶点 ID 作为查询参数来获取顶点。我对数组应用了一个批次,每批次大小为 100 个顶点 ID,它解决了这个问题。

一段时间后,我开始在客户端日志中再次看到此错误。这一次,没有向服务器发送大量参数的查询。我在这个主题上看到了一个建议的解决方案,它说我也需要在客户端设置 maxContentLength 参数。我这样做了,问题就解决了。但是,它提出了一些关于配置参数、它们的值及其对查询 request/response 大小的影响的问题。

  1. maxContentLength 参数是否与查询的响应大小有关?如果是,我如何根据我的数据库大小计算出此参数的值?
  2. 是否有任何其他参数规定请求中查询参数的最大大小?如果是,它们是哪些以及它们与查询参数的大小有何关系?
  3. 是否有任何参数决定查询响应的大小?如果是,它们是什么以及它们与查询响应的大小有何关系?

这些问题的答案对于我制作一个不会在数据冲击下崩溃的强大服务器至关重要。

提前致谢

安雅

maxContentLength 是单个 "message" 可以作为请求或响应包含的字节数。它提供与 Web 服务器中类似设置相同的功能,以允许过滤明显无效的请求。该设置与数据库大小关系不大,而与您发出的请求类型和结果的性质关系更大。对于请求,我倾向于认为在大多数情况下请求超过 65k 是不典型的。超过该大小的人通常会尝试进行批量加载或使用代码生成的脚本(后者通常有问题,但我不会详细介绍)。对于响应,65k 可能不够,具体取决于您查询的性质。例如,查询:

g.V().valueMap(true)

将 return 数据库中的所有顶点作为 Iterator<Map> 并且 Gremlin 服务器会将这些结果流回由 resultIterationBatchSize 控制的批次(默认值为 64)。因此,如果您的数据库中有 128 个顶点,Gremlin 服务器将在幕后流回两批结果。如果这两个批次的大小均低于 maxContentLength,则没有问题。如果你的批次大于那个(因为你已经说过,每个顶点有 1000 个属性)那么你要么需要

  1. 限制您 return 的数据 - 例如return 更少的属性
  2. 增加maxContentLength
  3. 降低 resultIterationBatchSize

另请注意,之前的查询与类似的查询非常不同:

g.V().valueMap(true).fold()

因为fold()会把所有的顶点实现到内存中的一个列表中,然后这个列表必须作为一个整体序列化。只有 1 个结果(即 List<Map> 有 128 个顶点)因此没有要批处理的东西,所以你更有可能超过 maxContentLength 并且降低 resultIterationBatchSize 甚至不会帮助。您唯一的办法是增加 maxContentLength 或更改查询以允许批处理开始,以希望分解大块数据以适应 maxContentLength.

maxContentLength 设置为 2mb 或更大应该没什么大不了的。如果您需要更高的请求,那么我很好奇这是什么原因。如果您需要更高的响应,那么也许我会看看我的查询,看看是否有更好的方法来限制我 returning 的数据,或者看看是否有更好的方法来让 Gremlin 服务器流媒体为我工作。