1。在我通过TCP连接(Kafka Producer)发送数据的应用程序中,当消息大小从1MB增加到100MB时,我观察到性能急剧下降。 (140 MB /秒 - > 25 MB /秒)(批量大小= 1)
我描述了生产者进程,发现了一个可疑点:Bits.java中的方法'copyFromArray'大部分时间都在消耗。 (代码如下。)
static final long UNSAFE_COPY_THRESHOLD = 1024L * 1024L;
static void copyFromArray(Object src, long srcBaseOffset, long srcPos,
long dstAddr, long length)
{
long offset = srcBaseOffset + srcPos;
while (length > 0) {
long size = (length > UNSAFE_COPY_THRESHOLD) ? UNSAFE_COPY_THRESHOLD : length;
unsafe.copyMemory(src, offset, null, dstAddr, size);
length -= size;
offset += size;
dstAddr += size;
}
}
参考:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/nio/Bits.java
2。有趣的是,只有当我使用生产者客户端(java实现)时才会出现此问题,但是当我使用一个(scala实现)时却不会发生这种情况,这是我无法理解的。
我应该从哪里开始找到问题所在?
答案 0 :(得分:1)
Kafka的最佳消息大小约为1k。如果您的邮件大小超过10M,您将开始遇到性能问题。在您的情况下,邮件大小约为100MB。这绝对不是不。
你必须问自己是否有必要发送这样大的信息。 Kafka是一个事件pub-sub系统,而不是FTP服务器。如果您需要发送大文件,可以将文件放在共享位置,然后通过Kafka将URL作为消息发送。如果这不起作用,另一种解决方法是对生产者进行编码,以使用相同的密钥将大型消息分成多个部分。这样您就可以保证具有相同密钥的消息最终会出现在同一个分区上。您可以在消费者端汇回消息。使用压缩还可以减小邮件的大小,从而提高性能。
简而言之,您应该避免通过Kafka发送大邮件(> 10M)。