使用cURL调用Pulsar REST接口遇TooLongFrameException异常排查
Pulsar使用curl访问6650端口Admin API触发TooLongFrameException的原因
问题场景
- 通过
bin/pulsar-admin schemas get transactions命令可正常获取Schema,使用的client.conf配置如下:
authParams= authPlugin= brokerServiceUrl=pulsar://localhost:6650/ tlsAllowInsecureConnection=false tlsCertificateFilePath= tlsEnableHostnameVerification=false tlsKeyFilePath= tlsKeyStorePassword= tlsKeyStorePath= tlsKeyStoreType=JKS tlsTrustCertsFilePath= tlsTrustStorePassword= tlsTrustStorePath= tlsTrustStoreType=JKS useKeyStoreTls=false webServiceUrl=http://localhost:8080/ webserviceTlsProvider=
- 但直接使用curl向
localhost:6650/admin/v2/schemas/public/default/transactions/schema发送请求时,Broker日志抛出TooLongFrameException,错误日志如下:
2023-03-10T15:45:06,468-0700 [pulsar-io-19-8] WARN org.apache.pulsar.broker.service.ServerCnx - [/127.0.0.1:64346] Got exception io.netty.handler.codec.TooLongFrameException: Adjusted frame length exceeds 5253120: 1195725860 - discarded at io.netty.handler.codec.LengthFieldBasedFrameDecoder.fail(LengthFieldBasedFrameDecoder.java:507) [long stacktrace]
原因解析
核心问题是端口使用错误:
- 6650是Pulsar的二进制协议端口,专门处理基于Pulsar自定义二进制协议的请求(比如生产者/消费者的消息传输、
pulsar-admin工具内部的协议交互),它不支持HTTP协议解析。 - 8080是Pulsar的Admin API HTTP端口,对应配置文件中的
webServiceUrl=http://localhost:8080/,所有Admin API的HTTP请求必须发送到这个端口。
当你用curl向6650端口发送HTTP请求时,Broker的Netty解码器会把HTTP请求的字节流错误识别为Pulsar协议帧。HTTP请求的起始内容(例如GET /admin/...)会被当作帧长度字段解析,计算出的长度值远超过Broker默认的帧长度上限(5253120字节),最终触发TooLongFrameException。
正确操作
使用curl访问Admin API时,应该指向8080端口,正确命令如下:
curl http://localhost:8080/admin/v2/schemas/public/default/transactions/schema
内容的提问来源于stack exchange,提问作者devinbost
相关产品推荐
相关产品推荐

