背压 (Back-pressure)
本节描述了 4.x 驱动程序中的背压。
Neo4j 4.0 引入了客户端背压。客户端背压的概念是,客户端向远程服务器通报它能够处理的数据量,并且只有在准备好消费更多数据时才请求额外的数据。
背压概念天然兼容响应式编程。因此,在 4.0 驱动发布中,所有语言驱动都添加了对 Reactive API 的支持。
Java 驱动的 Reactive API 暴露了原始的 Publisher-Subscriber API,该 API 由reactive streams 定义。Java 驱动的 Reactive API 与响应式库一起使用,例如 Project Reactor 和/或 RxJava。
.NET 使用内置的System.Reactive。JavaScript 驱动使用RxJs库。
这些库属于同一个响应式框架 ReactiveX。
要使用驱动的 Reactive API,需要具备响应式编程的基础知识。有关如何使用 Neo4j Reactive Driver API 的详细信息,请参阅Neo4j Drivers Manual 4.0。
然而,背压并不仅限于驱动的 Reactive API。所有其他 API(如 simple 和 async)在处理查询执行结果时默认已启用背压。
| Simple API | Async API | Reactive API | |
|---|---|---|---|
Java 驱动程序 |
记录缓冲区 |
记录缓冲区 |
|
.NET 驱动程序 |
记录缓冲区 |
记录缓冲区 |
记录缓冲区 |
Javascript 驱动程序 |
不适用 |
记录缓冲区 |
记录缓冲区 |
Bolt 4.0 与记录缓冲区的背压
Neo4j 4.0 服务器和驱动实现了 Bolt 4.0。此 Bolt 版本引入的主要功能之一是以批次拉取查询结果(记录)。在之前的 Bolt 版本中,完整的结果集始终一次性从服务器拉取到驱动。Bolt 4.0 允许你以多个批次拉取这些结果,每个批次的大小可以由 fetchSize 定义。默认情况下,驱动使用 fetchSize 为 1000 条记录。
随着记录批处理的引入,驱动可以实现客户端背压。对于每个结果,驱动保留一个未消费记录的缓冲区。缓冲区大小等于每批的 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 ) ) {...}