背压 (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)在处理查询执行结果时默认已启用背压。

表 1. 背压在不同语言驱动会话 API 中的实现方式
Simple API Async API Reactive API

Java 驱动程序

记录缓冲区

记录缓冲区

原始 Publisher-Subscriber API

.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 条以下时恢复。

示例 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 驱动 Reactive API

Java 驱动的 Reactive API 暴露了非常底层的 Publisher-Subscriber API。因此,它默认不执行任何形式的背压。相反,驱动使用者应使用响应式框架来利用背压。根据所使用的响应式框架,框架可能通过暂停从 Neo4j 服务器拉取数据,或在数据过多时丢弃数据来实现背压。

© . This site is unofficial and not affiliated with Neo4j, Inc.