作者回复: 嗯嗯,挺好的。我自己也学到了一些。另外校验不仅仅是CRC校验,还有消息级别的检查。
作者回复: 个人觉得学一个东西最重要的还是要用,如果只是参加一些培训课程很难全面的理解。您这么多的留言我一直坚持回复。我也一直是这个观点:用起来,自然问题就来了。
我学机器学习的经历和您现在学Kafka很像。没有实际使用场景怎么学都觉得深入不了。
我给您的建议是:把Kafka官网通读几遍然后再实现一个实时日志收集系统(比如把服务器日志实时放入Kafka)。事实上,能把官网全面理解的话已经比很多Kafka使用者要强了。
作者回复: 同一台broker上可能存在多个版本的消息,但每条消息只会以1个版本的形式保存。
作者回复: 目前java consumer的设计是一次取出一批,缓存在客户端内存中,然后再过滤出max.poll.records条消息返给你,也不算太浪费吧,毕竟下次可以直接从缓存中取,不用再发请求了。
作者回复: V2依然是做CRC校验的,只不过是在record batch这个层级上做,而不是一条一条消息地做了。如果CRC校验失败,重传batch。也就是说不会以消息作为传输单位进行校验,这样效率太低
作者回复: 不是固定数量。
“在 Producer 端即使消息并没有达到 batch.size 的数量,linger.ms 也可以让它发送一批数据” --- 是的
取决于linger.ms的值
作者回复: 主要是这两个参数:batch.size和linger.ms。如果是生产了一条消息且linger.ms=0,通常producer就会立即发送者一条消息了。
作者回复: 它只是解压缩读取而已,不会将解压缩之后的数据回写到磁盘。另外就像我置顶的留言那样,目前社区已经接纳了京东小伙伴的修改,貌似可以绕过这部分解压缩了,。
作者回复: 是的,就是你理解的那样。Kafka使用Zero Copy优化将页缓存中的数据直接传输到Socket——这的确是发生在broker到consumer的链路上。这种优化能成行的前提是consumer端能够识别磁盘上的消息格式。
作者回复: 没有
作者回复: 嗯嗯,版本一致肯定是能保证的,不过通常比较难做到。
作者回复: 消息批次RecordBatch里面包含若干条消息(record)。
你可以认为消息批次和消息集合是等价的,消息和日志项是等价的。
这样消息层次有两层:外层是消息批次(或消息集合);里层是消息(或日志项)。
Producer以recordbatch为单位发送消息,对于V2版本一个batch中通常包含多条消息。
在V2版本中,在batch层面计算CRC值;在V1版本中,每条消息都要计算CRC值。