参数canal.mq.canal.batch.size,简称batchSize,是用来指定CanalMQProducer一个批次中可处理的消息个数。该参数值越小,意味着可用于做并行处理的数据越少,性能也就越低。该参数默认值是50,这在较大数据量的场景下,尤其对于多topic多partition的场景,性能将会受到很大限制。
从实际测试结果来看,在其他参数不变的前提下,batchSize=50时的tps值还不到=500时的一半。经排查及代码分析得知,造成该现象的根源在于对kafka客户端的性能利用上。当batchSize=50时,kafka客户端被小批量请求频繁调用,且每发送一批必须等待全部完成后才能继续下一批,这使得kafka客户端性能得不到充分利用,成为了整体性能的瓶颈。而当batchSize调大到500时,kafka客户端可以充分利用其优化算法提升效率,于是整体性能大大提升。测试还发现,batchSize=500时的网络总流量,还不到=50时的一半,这说明kafka在大批量处理数据时会充分利用压缩等网络优化手段对性能进行提升。因此,batchSize参数的设置对于canal整体性能至关重要。
那么,该参数既然对性能如此重要,默认设置为50就显得太过保守了。请问,之所以设置为50,是出于对哪些问题的考量呢?如果调大为500或1000,甚至更高,又会对系统带来哪些问题和风险呢?我能想到的唯一问题就是内存占用。假定一个消息最大不超过4k字节(通常是不到1k),那么batchSize=1000也就是占用内存4M左右,这对于一个生产系统来说是完全没有问题的。不知我这么分析是否合理,还请赐教。谢谢!
原提问者GitHub用户roamerway
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。