[apache/dubbo]dubbo3.0应用级服务发现, 服务端配置payload后, 消费端无法取到

2024-05-24 744 views
1

使用dubbo3.0应用级服务发现的场景下, 消费者调用服务端时报错"Data length too large:xxxxxx, max payload: 8388608"。 断点在ExchangeCodec.finishRespWhenOverPayload.getPayload方法中,无论服务端如何修改配置,channel.getUrl始终没有payload属性。 channel.getUrl:dubbo://10.20.4.17:21868/org.apache.dubbo.metadata.MetadataService?codec=dubbo&connect.lazy.initial.state=true&dubbo=2.0.2&group=xxx-service&heartbeat=60000&port=21868&protocol=dubbo&release=3.0.4&send.reconnect=true&side=consumer&timeout=5000&version=1.0.0

回答

7
protected static int getPayload(Channel channel) {
    int payload = Constants.DEFAULT_PAYLOAD;
    if (channel != null && channel.getUrl() != null) {
        payload = channel.getUrl().getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD);
    }
    return payload;
}
1

你们是 org.apache.dubbo.metadata.MetadataService 返回的应用级元数据过大导致的吗

2

是发布的服务过多?

8

不是,我们确实有一个接口返回了超过8M的数据量,消费端提示“Data length too large:xxxxxx, max payload: 8388608”, 但在服务端和消费端都已经配置了dubbo.protocol.payload: 16777216。于是断点到产生这条日志的地方看,发现payload是从以下代码中获取的: protected static int getPayload(Channel channel) { int payload = Constants.DEFAULT_PAYLOAD; if (channel != null && channel.getUrl() != null) { payload = channel.getUrl().getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD); } return payload; } 并且,channel.getUrl()为dubbo://10.20.4.17:21868/org.apache.dubbo.metadata.MetadataService?codec=dubbo&connect.lazy.initial.state=true&dubbo=2.0.2&group=xxx-service&heartbeat=60000&port=21868&protocol=dubbo&release=3.0.4&send.reconnect=true&side=consumer&timeout=5000&version=1.0.0 从url中并没有看到payload的相关信息,于是取了MAX_PAYLOAD的默认值8388608,想请教下怎么配置payload才能够生效。

0

补充下,当接口返回业务数据小于8M的时候是正常的,应该和发布的服务数量没关系

7

当消费端和生产端使用的注册模式为应用粒度的时候会出现这个问题。 即:register-mode: instance 同样的payload配置如果没有配“register-mode: instance”是能生效的,不配的话默认应该是接口粒度的。

2

不是,我们确实有一个接口返回了超过8M的数据量,消费端提示“Data length too large:xxxxxx, max payload: 8388608”, 但在服务端和消费端都已经配置了dubbo.protocol.payload: 16777216。于是断点到产生这条日志的地方看,发现payload是从以下代码中获取的: protected static int getPayload(Channel channel) { int payload = Constants.DEFAULT_PAYLOAD; if (channel != null && channel.getUrl() != null) { payload = channel.getUrl().getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD); } return payload; } 并且,channel.getUrl()为dubbo://10.20.4.17:21868/org.apache.dubbo.metadata.MetadataService?codec=dubbo&connect.lazy.initial.state=true&dubbo=2.0.2&group=xxx-service&heartbeat=60000&port=21868&protocol=dubbo&release=3.0.4&send.reconnect=true&side=consumer&timeout=5000&version=1.0.0 从url中并没有看到payload的相关信息,于是取了MAX_PAYLOAD的默认值8388608,想请教下怎么配置payload才能够生效。

你升级下3.1.6版本,之前的版本 MetadataService 的连接没有释放

5

不是,我们确实有一个接口返回了超过8M的数据量,消费端提示“Data length too large:xxxxxx, max payload: 8388608”, 但在服务端和消费端都已经配置了dubbo.protocol.payload: 16777216。于是断点到产生这条日志的地方看,发现payload是从以下代码中获取的: protected static int getPayload(Channel channel) { int payload = Constants.DEFAULT_PAYLOAD; if (channel != null && channel.getUrl() != null) { payload = channel.getUrl().getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD); } return payload; } 并且,channel.getUrl()为dubbo://10.20.4.17:21868/org.apache.dubbo.metadata.MetadataService?codec=dubbo&connect.lazy.initial.state=true&dubbo=2.0.2&group=xxx-service&heartbeat=60000&port=21868&protocol=dubbo&release=3.0.4&send.reconnect=true&side=consumer&timeout=5000&version=1.0.0 从url中并没有看到payload的相关信息,于是取了MAX_PAYLOAD的默认值8388608,想请教下怎么配置payload才能够生效。

你升级下3.1.6版本,之前的版本 MetadataService 的连接没有释放

这个和metaservice有啥关系??

8

不是,我们确实有一个接口返回了超过8M的数据量,消费端提示“Data length too large:xxxxxx, max payload: 8388608”, 但在服务端和消费端都已经配置了dubbo.protocol.payload: 16777216。于是断点到产生这条日志的地方看,发现payload是从以下代码中获取的: protected static int getPayload(Channel channel) { int payload = Constants.DEFAULT_PAYLOAD; if (channel != null && channel.getUrl() != null) { payload = channel.getUrl().getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD); } return payload; } 并且,channel.getUrl()为dubbo://10.20.4.17:21868/org.apache.dubbo.metadata.MetadataService?codec=dubbo&connect.lazy.initial.state=true&dubbo=2.0.2&group=xxx-service&heartbeat=60000&port=21868&protocol=dubbo&release=3.0.4&send.reconnect=true&side=consumer&timeout=5000&version=1.0.0 从url中并没有看到payload的相关信息,于是取了MAX_PAYLOAD的默认值8388608,想请教下怎么配置payload才能够生效。

你升级下3.1.6版本,之前的版本 MetadataService 的连接没有释放

这个和metaservice有啥关系??

MetadataService 会发起第一次的请求,没有携带 payload 参数,如果请求后连接没释放会导致 MetadataService 的 URL 被其他请求所复用,拿到的参数都没有 payload

9

@JiangHaonan 配置数据传输大小限制:

dubbo.protocol.payload=83886080 dubbo.provider.payload=83886080

这个比较关键

dubbo.consumer.parameters.payload=83886080