最近项目遇到一个特殊场景,需要kafka传递100万条数据过去,1个G左右,由于其他环节限制,不能进行拆包。
一开始生产者一直报网络问题,经过需要修改如下参数,为了探寻之前说的不能超过1G的说法,把所有参数上限都设置成了接近2G
config/server.properties
socket.request.max.bytes=2048576000
log.segment.bytes=2073741824
message.max.bytes=2048576000
replica.fetch.max.bytes=2048576000
fetch.message.max.bytes=2048576000 ---这个好像不应该设置在server.propeties里面,这个是consumer的参数,后续验证吧。
replica.socket.timeout.ms=300000 --这个参数好像也不需要设置,但是需要在生产者里设置request.timeout.ms。否则,发送时间过长导致发送失败。
参数说明:
socket.request.max.bytes =100*1024*1024 |
socket请求的最大数值,防止serverOOM,message.max.bytes必然要小于socket.request.max.bytes,会被topic创建时的指定参数覆盖 |
log.segment.bytes =1024*1024*1024 |
topic的分区是以一堆segment文件存储的,这个控制每个segment的大小,会被topic创建时的指定参数覆盖 |
message.max.bytes =6525000 |
表示消息体的最大大小,单位是字节 |
replica.fetch.max.bytes =1024*1024 |
replicas每次获取数据的最大大小 |
fetch.message.max.bytes=1024*1024 |
每个拉取请求的每个topic分区尝试获取的消息的字节大小。这些字节将被读入每个分区的内存,因此这有助于控制消费者使用的内存。 拉取请求的大小至少与服务器允许的最大消息的大小一样大,否则生产者可能发送大于消费者可以拉取的消息。 |
replica.socket.timeout.ms |
网络请求的socket超时,该值最少是replica.fetch.wait.max.ms |
生产者设定
props.put("max.request.size", 2073741824);
props.put("buffer.memory", 2073741824);
props.put("timeout.ms", 30000000);
props.put("request.timeout.ms", 30000000);