开发者社区> 问答> 正文

参数canal.mq.canal.batch.size的默认值是50,这么小是出于何种考量?若调大至

参数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

展开
收起
山海行 2023-04-27 19:41:50 146 0
1 条回答
写回答
取消 提交回答
  • 1.1.5版本对MQ的发送性能做了优化,比较重要的是引入多线程发送的模式

    原回答者GitHub用户agapple

    2023-04-28 14:28:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载