背压
本节描述了 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,在处理查询执行结果时默认启用背压。
简单 API | 异步 API | 响应式 API | |
---|---|---|---|
Java 驱动 |
记录缓冲区 |
记录缓冲区 |
|
.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 条以下时会恢复。
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 ) ) {...}