已超过最大帧长 65536

Any*_*nya 5 gremlin-server janusgraph

我有一个设置,我使用 gremlin-core 库来查询远程 Janusgraph 服务器。数据大小目前适中,但将来会增加。

几天前,我在我的客户端上看到“已超出最大帧长度 65536”错误。我的服务器 yaml 文件中 maxContentLength 参数的值设置为默认值 (65536)。我挖掘了代码并意识到我正在发送大量顶点 id 作为查询参数来获取顶点。我将一个批次应用于每个批次 100 个顶点 id 的数组,它解决了这个问题。

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

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

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

提前致谢

安雅

ste*_*tte 8

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

g.V().valueMap(true)
Run Code Online (Sandbox Code Playgroud)

将返回数据库中的所有顶点作为一个,Iterator<Map>并且 Gremlin 服务器将这些结果以由 控制的批次流回resultIterationBatchSize(默认为 64)。因此,如果您的数据库中有 128 个顶点,那么 Gremlin 服务器将在后台回传两批结果。如果这两个批次的maxContentLength尺寸均低于此尺寸,则没有问题。如果您的批次比这更大(因为您说每个顶点有 1000 个属性),那么您要么需要

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

另请注意,先前的查询与以下内容非常不同:

g.V().valueMap(true).fold()
Run Code Online (Sandbox Code Playgroud)

因为fold()它将在内存中将所有顶点实现为一个列表,然后该列表必须作为一个整体进行序列化。只有 1 个结果(即List<Map>有 128 个顶点),因此没有要批处理的结果,因此您更有可能超过maxContentLength此处并降低其resultIterationBatchSize甚至无济于事。您唯一的办法是增加maxContentLength或更改查询以允许批处理启动以希望分解大块数据以适合maxContentLength.

将您maxContentLength的内存设置为 2mb 或更大应该没什么大不了的。如果您需要更高的请求,那么我很好奇这是什么原因。如果您需要更高的响应,那么也许我会看看我的查询,看看是否有更好的方法来限制我返回的数据,或者看看是否有更好的方法让 Gremlin Server 流式传输到为我工作。