限制 Bolt 请求
当在 Neo4j 数据库和客户端之间发送大量数据时(通常是大型查询结果,从服务器到客户端),可能会有一些隐藏的限制机制发挥作用。
TCP 限制
客户端和 Neo4j 服务器之间的 Bolt 连接建立在 TCP 之上。
客户端接收窗口
TCP 尝试调整发送的数据量,以避免压倒客户端。实际上,客户端需要处理接收到的数据,这可能需要时间,并可能导致读取缓冲区比清空缓冲区的速度更快。
它是如何工作的?每次客户端确认接收数据时,它都会发送一个 TCP ACK,其中包含其读取缓冲区的当前可用容量。这就是所谓的接收窗口。
当捕获流量(例如使用 tcpdump)并将捕获文件在 Wireshark 等工具中打开时,接收窗口会在 ACK 中显示为属性“WIN”。该值可以高达 65536。要将其转换为字节数,请将该值乘以窗口缩放因子,您可以在初始 TCP 连接的 3 次握手(SYN/SYN-ACK/ACK)中找到该因子,作为属性“WS”。 |
服务器将使用该接收窗口来调节发送的数据量。它会跟踪“在传输中”的数据量(已发送但尚未确认),并确保该数据量永远不会超过接收窗口,方法是降低其发送数据的速率。如果客户端的接收窗口变为零(Wireshark 将这些 ACK 标记为 TCP ZeroWindow),服务器将停止发送并等待其再次增加(客户端随后会发送一个 TCP 窗口更新以指示增加)。
Bolt 服务器限制
除了 TCP 自己的限制之外,Neo4j Bolt 服务器还会限制其将数据写入其写入缓冲区的速率。
这由以下配置参数控制
unsupported.dbms.bolt.outbound_buffer_throttle=true
unsupported.dbms.bolt.outbound_buffer_throttle.high_watermark=512k
unsupported.dbms.bolt.outbound_buffer_throttle.low_watermark=128k
unsupported.dbms.bolt.outbound_buffer_throttle.max_duration=15min
当写入缓冲区填满高水位时,写入将暂停。当 Bolt 服务器等待时,它会接收来自客户端的 ACK,这使它能够从写入缓冲区中删除相应的数据。服务器每秒轮询一次缓冲区,以检查是否已达到低水位。发生这种情况时,它将恢复写入。
此页面是否有用?