kafka消息发送时间随内容增加而剧增?

√锋²º¹8ヾ/❤ 发表于: 2018-08-29   最后更新时间: 2018-08-29 11:26:57   2,465 游览

测试了发送100000 条信息。

Properties properties = new Properties();
InputStream in = KafkaProducerOps.class.getClassLoader().getResourceAsStream("producer.properties");
properties.load(in);

Producer<String, String> producer = new KafkaProducer<String, String>(properties);
for (int i = start; i <= start + 100000; i++) {
    String topic ="test";
    ProducerRecord<String, String> producerRecord =
    new ProducerRecord<String, String>(topic, key, i+"");
    producer.send(producerRecord);
}

大概是2-4秒。

但是,当发送的消息有四五十个字符串长度的时候,要13--15秒;
测试了一下3kb的字符串,3分钟才发送到30000。

我这样测试有没有违背消息机制的初衷?不应该发送很大的数据量,而是用来作为一个简单的消息中间件,再配合其他接口?

目前准备使用的场景是 canal 监听mysql的binlog日志,以消息的形式通过kafka发出去。提供给子终端。

发表于 2018-08-29
添加评论

如果服务器与客户端之间的带宽,机器性能都还充足的话,建议调整buffer.memory相关的参数,具体参见:https://www.orchome.com/511

batch.size=16384

# the total bytes of memory the producer can use to buffer records waiting to be sent to the server
buffer.memory=67108864

send.buffer.bytes=131072

循环10000次:
每次发送2kb数据,大概8秒;
每次发送4kb数据,大概16秒;

注释掉上面的参数,耗时也一样。

另外,跟发送的内容也有很大的关系,包含中文越多,发送越慢。例如2.48kb的大写A,10000条大概7--8秒;然后增加调整一些为中文信息,时间就相继的上去了

你得先把瓶颈点找出来,到底是cpu不行,还是内存不行,还是带宽不行。
1、增加生产者,增加分区(长连接,提高CPU利用率)
2、带宽打满的话,就增加消息压缩,如果没打满就放大同时发送的缓存队列大小。

你的答案

查看kafka相关的其他问题或提一个您自己的问题