Hyperledger Composer Rest Server闲置后无响应问题排查求助
我之前在维护Docker Swarm模式下的Fabric+Composer环境时,也碰到过几乎完全一致的问题,咱们一步步拆解原因和解决办法:
核心原因
1. 闲置连接被自动断开
不管是Composer Rest Server与Fabric节点之间的TCP连接,还是Docker Swarm Overlay网络的闲置连接,都会因为长时间无数据交互被系统或Swarm网络层自动关闭。首次请求时,Rest Server尝试复用已断开的连接就会触发TCP read failed,第二次请求时连接重建过程还没完成导致no response from server,第三次连接重建完成才能正常响应。
2. 链码容器休眠+Peer超时阈值过短
Docker Swarm默认会对闲置的容器进行资源回收(比如暂停低负载容器),当你的业务网络闲置一段时间后,链码容器可能被Swarm休眠。此时发起POST交易,Peer需要唤醒链码容器来模拟提案,但Peer默认的chaincode.executetimeout阈值通常比较短(默认5秒左右),链码唤醒的时间超过了这个阈值,就会触发timeout expired while executing transaction错误——虽然最终交易还是会被提交并生成区块,但Rest Server因为没收到提案模拟的响应,导致前端UI一直卡在加载状态。
针对性解决方案
1. 调整Composer Rest Server的连接存活配置
启动Rest Server时,通过参数强制保持连接活跃,避免闲置断开:
composer-rest-server -c admin@supply-chain-network -p 3000 --pingTimeout 300 --maxIdleTime 600
--pingTimeout:设置定期向Fabric节点发送ping的间隔(单位:秒),确保连接不被标记为闲置--maxIdleTime:设置连接的最大闲置时间(单位:秒),超过后才会回收连接
2. 延长Fabric Peer的链码执行超时
修改Peer节点的启动参数,增加链码执行的超时时间,给链码唤醒留足时间:
如果是通过Swarm service部署Peer,更新service时添加参数:
docker service update --args="-peer.chaincode.executetimeout=30s" <your-peer-service-name>
如果是docker-compose部署,在Peer的command字段里追加:
command: peer node start -peer.chaincode.executetimeout=30s
3. 配置Swarm Overlay网络保持TCP连接活跃
创建或修改Swarm的overlay网络,设置TCP保活参数,避免闲置连接被关闭:
docker network create --driver overlay --opt com.docker.network.driver.overlay.default_ulimit=tcp_keepalive_time=300 --opt com.docker.network.driver.overlay.default_ulimit=tcp_keepalive_intvl=60 --opt com.docker.network.driver.overlay.default_ulimit=tcp_keepalive_probes=10 fabric-overlay
tcp_keepalive_time:TCP连接闲置多久后开始发送保活包(秒)tcp_keepalive_intvl:保活包的发送间隔(秒)tcp_keepalive_probes:发送多少个保活包没响应才断开连接
4. 禁止Swarm休眠链码容器
给链码容器配置资源预留,让Swarm不会因为闲置回收其资源:
在链码的Swarm service部署配置里添加:
deploy: resources: reservations: cpus: '0.1' memory: 128M
这样Swarm会认为该容器需要持续占用资源,不会轻易休眠它。
内容的提问来源于stack exchange,提问作者Apoorv Chandurkar

