Bolt 协议服务器状态规范

对于服务器而言,每个使用 Bolt 协议的连接在其生命周期内都会处于几种状态之一。

此状态用于确定客户端可以执行的操作。每个服务器状态规范都对应一个相同版本的消息规范。

有关 Bolt 协议各版本中所有可用服务器状态转换的摘要,请参阅附录页面。

服务器状态

Bolt 服务器维护的每个连接在其生命周期内都会处于几种状态之一。此状态用于确定客户端可以执行的操作。

状态 逻辑状态 描述

DISCONNECTED(已断开)

X

无套接字连接

DEFUNCT(已失效)

X

套接字连接已永久关闭

NEGOTIATION(协商中)

协议握手已成功完成;准备接收 HELLO 消息

AUTHENTICATION(身份验证中)

已接受 HELLOLOGOFF 消息;准备接收 LOGON 消息

READY(就绪)

准备接收 RUN 消息

STREAMING(流式传输中)

自动提交事务,服务器有结果可供流式传输

TX_READY(事务就绪)

显式事务,准备接收 RUN 消息

TX_STREAMING(事务流式传输中)

显式事务,服务器有结果可供流式传输

FAILED(失败)

连接处于暂时不可用状态

INTERRUPTED(已中断)

服务器收到 <INTERRUPT> 信号

服务器状态 DISCONNECTED

尚未建立套接字连接。这是初始状态,仅在套接字打开之前的逻辑意义上存在。

DISCONNECTED 转换

  • Bolt 握手成功完成,进入 NEGOTIATION

  • Bolt 握手未成功完成,进入 DEFUNCT

服务器状态 NEGOTIATION

在建立了新的协议连接且握手成功完成后,服务器进入 NEGOTIATION 状态。连接尚未经过身份验证,且仅允许通过 HELLO 消息进行成功初始化,从而进入 AUTHENTICATION 状态。

NEGOTIATION 转换

  • <DISCONNECT> 转至 DEFUNCT

  • HELLO 转至 AUTHENTICATIONDEFUNCT

服务器状态 AUTHENTICATION

连接已建立,且已从 HELLO 消息返回元数据,或者在就绪状态下收到了 LOGOFF 消息。准备接收包含身份验证信息的 LOGON 消息。

NEGOTIATION 转换

  • LOGON 转至 READYDEFUNCT

READY 转换

  • LOGOFF 转至 AUTHENTICATION

服务器状态 DEFUNCT

这严格来说不是一种连接状态,而是一种在连接关闭后存在的逻辑状态。当处于 DEFUNCT 状态时,连接永久不可用。这可能是由于正常关闭引起的,也可能发生在不可恢复的错误或协议违规之后。客户端和服务器在进入此状态时应清理与连接相关的所有资源,包括关闭所有打开的套接字。这是一个终端状态,无法进行任何进一步的转换。<DISCONNECT> 信号会将连接置于 DEFUNCT 服务器状态。

服务器状态 READY

READY 状态可以处理请求消息 RUNBEGIN,并接收查询。

READY 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 STREAMINGFAILED

  • BEGIN 转至 TX_READYFAILED (v3+)

  • LOGOFF 转至 AUTHENTICATION (v5.1+)

  • TELEMETRY 转至 READY (v5.4+)

服务器状态 STREAMING

当处于 STREAMING 状态时,服务器有结果可供流式传输给客户端。客户端必须完全消耗或丢弃此结果,服务器才能重新进入 READY 状态并允许执行后续查询。

STREAMING 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • PULL 转至 READY, FAILED, 或 STREAMING

  • DISCARD 转至 READY, FAILED, 或 STREAMING

在 v1, v2 和 v3 版本中,可以进行以下转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • PULL_ALL 转至 READYFAILED

  • DISCARD_ALL 转至 READYFAILED

表 1. 请求消息 DISCARD 状态转换
状态 新状态 响应

STREAMING(流式传输中)

READY(就绪)

SUCCESS {"has_more": false}SUCCESS {}

STREAMING(流式传输中)

FAILED(失败)

FAILURE {}

STREAMING(流式传输中)

STREAMING(流式传输中)

SUCCESS {"has_more": true}

表 2. 请求消息 PULL 状态转换
状态 新状态 响应

STREAMING(流式传输中)

READY(就绪)

[RECORD …] SUCCESS {"has_more": false}SUCCESS {}

STREAMING(流式传输中)

FAILED(失败)

[RECORD …] FAILURE {}

STREAMING(流式传输中)

STREAMING(流式传输中)

[RECORD …] SUCCESS {"has_more": true}

表 3. 请求消息 DISCARD_ALL 状态转换(仅限 v1, v2, v3)
状态 新状态 响应

STREAMING(流式传输中)

READY(就绪)

`SUCCESS {}

STREAMING(流式传输中)

FAILED(失败)

FAILURE {}

表 4. 请求消息 PULL_ALL 状态转换(仅限 v1, v2, v3)
状态 新状态 响应

STREAMING(流式传输中)

READY(就绪)

[RECORD …] SUCCESS {}

STREAMING(流式传输中)

FAILED(失败)

[RECORD …] FAILURE {}

服务器状态 TX_READY

TX_READY 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 TX_STREAMINGFAILED

  • COMMIT 转至 READYFAILED

  • ROLLBACK 转至 READYFAILED

表 5. 请求消息 RUN 状态转换
状态 新状态 响应

TX_READY(事务就绪)

TX_STREAMING(事务流式传输中)

SUCCESS {"qid": id::Integer}

TX_READY(事务就绪)

FAILED(失败)

FAILURE{}

TX_READY 服务器状态在 v1 或 v2 中不存在。

服务器状态 TX_STREAMING

当处于 TX_STREAMING 状态时,服务器有结果可供流式传输给客户端。客户端必须完全消耗或丢弃此结果,服务器才能转换为 TX_READY 状态。

TX_STREAMING 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 TX_STREAMINGFAILED

  • PULL 转至 TX_READY, FAILEDTX_STREAMING

  • DISCARD 转至 TX_READY, FAILEDTX_STREAMING

表 6. 请求消息 RUN 状态转换
状态 新状态 响应

TX_STREAMING(事务流式传输中)

TX_STREAMING(事务流式传输中)

SUCCESS {"qid": id::Integer}

TX_STREAMING(事务流式传输中)

FAILED(失败)

FAILURE{}

表 7. 请求消息 DISCARD 状态转换
状态 新状态 响应

TX_STREAMING(事务流式传输中)

TX_READYTX_STREAMING(如果还有其他打开的流)

SUCCESS {"has_more": false}SUCCESS {}

TX_STREAMING(事务流式传输中)

FAILED(失败)

FAILURE {}

TX_STREAMING(事务流式传输中)

TX_STREAMING(事务流式传输中)

SUCCESS {"has_more": true}

表 8. 请求消息 PULL 状态转换
状态 新状态 响应

TX_STREAMING(事务流式传输中)

TX_READYTX_STREAMING(如果还有其他打开的流)

[RECORD …] SUCCESS {"has_more": false}SUCCESS {}

TX_STREAMING(事务流式传输中)

FAILED(失败)

[RECORD …] FAILURE {}

TX_STREAMING(事务流式传输中)

TX_STREAMING(事务流式传输中)

[RECORD …] SUCCESS {"has_more": true}

TX_STREAMING 服务器状态在 v1 或 v2 中不存在。

服务器状态 FAILED

当处于 FAILED 状态时,连接处于暂时不可用状态。这通常是遇到可恢复错误的结果。此模式确保一次只能存在一个故障,从而防止批处理工作导致级联问题。

FAILED 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 FAILED

  • PULL 转至 FAILED

  • DISCARD 转至 FAILED

在 v1 和 v2 中,处于 FAILED 状态时,在通过 ACK_FAILURE 确认故障或连接 RESET 之前,不会处理更多工作。

在 v1 和 v2 中,可以进行以下转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • ACK_FAILURE 转至 READYDEFUNCT

服务器状态 INTERRUPTED

此状态出现在服务器接收到跳转 <INTERRUPT> 和排队的 RESET 消息之间(RESET 消息会触发 <INTERRUPT>)。当服务器处于 INTERRUPTED 状态时,大多数传入消息都会被忽略,但允许转换回 READY 的 RESET 除外。<INTERRUPT> 信号会将连接置于 INTERRUPTED 服务器状态。

INTERRUPTED 转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 INTERRUPTED

  • DISCARD 转至 INTERRUPTED

  • PULL 转至 INTERRUPTED

  • BEGIN 转至 INTERRUPTED

  • COMMIT 转至 INTERRUPTED

  • ROLLBACK 转至 INTERRUPTED

  • RESET 转至 READYDEFUNCT

在 v1 和 v2 中,可以进行以下转换

  • <INTERRUPT> 转至 INTERRUPTED

  • <DISCONNECT> 转至 DEFUNCT

  • RUN 转至 INTERRUPTED

  • DISCARD_ALL 转至 INTERRUPTED

  • PULL_ALL 转至 INTERRUPTED

  • ACK_FAILURE 转至 INTERRUPTED

  • RESET 转至 READYDEFUNCT

各版本变更摘要

以下各节列出了与上一版本相比的变更。

版本 5.2

与版本 5.1 相比无变更。

版本 5.1

  • CONNECTED 状态已重命名为 NEGOTIATION,但仍接受 HELLO 消息。

  • HELLO 消息不再接受身份验证,并从 NEGOTIATION 转换为 AUTHENTICATION 状态。

  • 添加了 LOGON 消息。它只能在 AUTHENTICATION 状态下接收,并转换为 READY 状态。

  • 添加了 LOGOFF 消息。它只能在 READY 状态下接收,并转换为 AUTHENTICATION 状态。

版本 5.0

与版本 4.4 相比无变更。

版本 4.4

与版本 4.3 相比无变更。

版本 4.3

  • 添加了 ROUTE 消息。它只能在 READY 状态下接收,且不触发任何转换。

版本 4.2

与版本 4.1 相比无变更。

版本 4.1

与版本 4.0 相比无变更。

版本 4.0

与版本 3 相比,RUN, PULLDISCARD 现在可以重新进入 STREAMINGTX_STREAMING。服务器状态转换使用 Bolt 协议消息规范版本 4.0 中定义的更新后的消息集。

版本 3

与版本 2 相比,有新的服务器状态:

  • TX_READY(事务就绪)

  • TX_STREAMING 这些状态是为了处理显式事务的概念而引入的。服务器状态转换使用 Bolt 协议消息规范版本 3 中定义的更新后的消息集。

版本 2

与版本 1 相比无变更。