网络空闲 15-20 分钟后调用 sendTransaction 失败
sendTransaction Fails when it's invoked after the network is idle for 15-20 minutes
我在 GCP 中部署了一个 hyperledger fabric 网络。
我使用结构节点 sdk 与网络通信。
当 sdk 和网络之间没有 activity 时,如果我尝试调用链代码,
API 调用在向订购者发送交易时失败,日志如下。
错误:[Orderer.js]:sendBroadcast - 错误:"Error: 14 UNAVAILABLE: TCP Read failed\n at createStatusError (/usr/src/app/node_modules/grpc/src/client.js:64:15)\n at ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:270:19)\n at ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8)\n at /usr/src/app/node_modules/grpc/src/client.js:804:12"
请求失败:POST /channels/stanfinandcredth/chaincodes/sc1547746253:SERVICE_UNAVAILABLE
错误:SERVICE_UNAVAILABLE
在 ClientDuplexStream。 (/usr/src/app/node_modules/fabric-client/lib/Orderer.js:136:21)
在 emitOne (events.js:116:13)
在 ClientDuplexStream.emit (events.js:211:7)
在 ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:271:12)
在 ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8)
在 /usr/src/app/node_modules/grpc/src/client.js:804:12
错误:SERVICE_UNAVAILABLE
在 ClientDuplexStream。 (/usr/src/app/node_modules/fabric-client/lib/Orderer.js:136:21)
在 emitOne (events.js:116:13)
在 ClientDuplexStream.emit (events.js:211:7)
在 ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:271:12)
在 ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8)
在 /usr/src/app/node_modules/grpc/src/client.js:804:12
SDK 似乎无法访问 Orderer。立即下一个调用请求成功。
这发生在空闲时间 15 分钟后的每个时间。
我尝试为连接设置 grpc 超时,但它似乎没有帮助。
GCP 很可能正在拆除空闲连接。您需要为您的客户端设置 gRPC keepalive 选项。类似于:
"connection-options": {
"grpc.max_receive_message_length": -1,
"grpc.max_send_message_length": -1,
"grpc.keepalive_time_ms": 120000,
"grpc.http2.min_time_between_pings_ms": 120000,
"grpc.keepalive_timeout_ms": 20000,
"grpc.http2.max_pings_without_data": 0,
"grpc.keepalive_permit_without_calls": 1
}
有关使用 Node SDK 进行设置的详细信息,请参阅 https://fabric-sdk-node.github.io/release-1.4/tutorial-grpc-settings.html
我在 GCP 中部署了一个 hyperledger fabric 网络。 我使用结构节点 sdk 与网络通信。
当 sdk 和网络之间没有 activity 时,如果我尝试调用链代码, API 调用在向订购者发送交易时失败,日志如下。
错误:[Orderer.js]:sendBroadcast - 错误:"Error: 14 UNAVAILABLE: TCP Read failed\n at createStatusError (/usr/src/app/node_modules/grpc/src/client.js:64:15)\n at ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:270:19)\n at ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8)\n at /usr/src/app/node_modules/grpc/src/client.js:804:12" 请求失败:POST /channels/stanfinandcredth/chaincodes/sc1547746253:SERVICE_UNAVAILABLE 错误:SERVICE_UNAVAILABLE 在 ClientDuplexStream。 (/usr/src/app/node_modules/fabric-client/lib/Orderer.js:136:21) 在 emitOne (events.js:116:13) 在 ClientDuplexStream.emit (events.js:211:7) 在 ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:271:12) 在 ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8) 在 /usr/src/app/node_modules/grpc/src/client.js:804:12 错误:SERVICE_UNAVAILABLE 在 ClientDuplexStream。 (/usr/src/app/node_modules/fabric-client/lib/Orderer.js:136:21) 在 emitOne (events.js:116:13) 在 ClientDuplexStream.emit (events.js:211:7) 在 ClientDuplexStream._emitStatusIfDone (/usr/src/app/node_modules/grpc/src/client.js:271:12) 在 ClientDuplexStream._receiveStatus (/usr/src/app/node_modules/grpc/src/client.js:248:8) 在 /usr/src/app/node_modules/grpc/src/client.js:804:12
SDK 似乎无法访问 Orderer。立即下一个调用请求成功。 这发生在空闲时间 15 分钟后的每个时间。
我尝试为连接设置 grpc 超时,但它似乎没有帮助。
GCP 很可能正在拆除空闲连接。您需要为您的客户端设置 gRPC keepalive 选项。类似于:
"connection-options": {
"grpc.max_receive_message_length": -1,
"grpc.max_send_message_length": -1,
"grpc.keepalive_time_ms": 120000,
"grpc.http2.min_time_between_pings_ms": 120000,
"grpc.keepalive_timeout_ms": 20000,
"grpc.http2.max_pings_without_data": 0,
"grpc.keepalive_permit_without_calls": 1
}
有关使用 Node SDK 进行设置的详细信息,请参阅 https://fabric-sdk-node.github.io/release-1.4/tutorial-grpc-settings.html