背压

本节描述了 4.x 驱动中的背压。

Neo4j 4.0 引入了客户端背压。客户端背压的概念是,客户端与远程服务器通信,告知其能够处理多少数据,并且仅在准备好消费更多数据时才请求额外数据。

背压概念自然与 响应式编程 兼容。因此,在 4.0 驱动版本中,所有语言驱动都增加了对响应式 API 的支持。

Java 驱动的响应式 API 暴露了一个原始的发布者-订阅者 API,该 API 由 响应式流 定义。Java 驱动的响应式 API 与响应式库(例如 Project Reactor 和/或 RxJava)一起使用。

.NET 使用内置的 System.Reactive。JavaScript 驱动使用 RxJs 库。

这些库属于同一个响应式框架 ReactiveX

要使用驱动的响应式 API,需要具备响应式编程的初步知识。关于如何使用 Neo4j 响应式驱动 API 的详细信息,请参见 Neo4j 驱动手册 4.0

然而,背压不仅限于驱动的响应式 API。所有其他 API,例如简单和异步 API,在处理查询执行结果时默认启用背压。

表 1. 不同语言驱动会话 API 中背压的实现方式
简单 API 异步 API 响应式 API

Java 驱动

记录缓冲区

记录缓冲区

原始发布者-订阅者 API

.NET 驱动

记录缓冲区

记录缓冲区

记录缓冲区

Javascript 驱动

不适用

记录缓冲区

记录缓冲区

使用 Bolt 4.0 和记录缓冲区实现背压

Neo4j 4.0 服务器和驱动实现了 Bolt 4.0。此 Bolt 版本引入的主要功能之一是分批拉取查询结果(记录)。在以前的 Bolt 版本中,完整的查询结果集总是从服务器一次性拉取到驱动。Bolt 4.0 允许您将这些结果分批拉取,每批的大小可以通过 fetchSize 定义。默认情况下,驱动使用 1000 条记录的 fetchSize

随着记录分批处理的引入,驱动可以实现客户端背压。对于每个结果,驱动会维护一个未消费记录的记录缓冲区。缓冲区的容量与每批的 fetchSize 相同。当缓冲区超过 70% 满时,从服务器拉取记录的操作会暂停;当缓冲区低于 30% 满时,记录拉取操作会重新启用。对于默认的 fetchSize 1000 条记录,当缓冲区中有超过 700 条记录时,记录拉取会暂停,当缓冲区降至 300 条以下时会恢复。

示例 1. 在驱动上设置默认 fetchSize 并在会话上更改默认值。
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Config;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.neo4j.driver.SessionConfig;
...

Config config = Config.builder().withFetchSize( 2000 ).build();
Driver driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ), config );

SessionConfig sessionConfig = SessionConfig.builder()
                                          .withDatabase( "neo4j" )
                                          .withFetchSize( 100 )
                                          .build();
try ( Session session = driver.session( sessionConfig ) ) {...}

Java 驱动响应式 API

Java 驱动的响应式 API 暴露了一个非常底层的发布者-订阅者 API。因此,它默认不执行任何形式的背压。相反,驱动用户应该利用响应式框架来实现背压。根据不同的响应式框架,该框架可能会通过暂停从 Neo4j 服务器拉取数据,或在数据过多无法处理时丢弃数据来应用背压。

© . All rights reserved.