kafka随机写

六月ゝ 毕业季﹏ 提交于 2020-08-11 23:13:51
  1. 设计目标

时间复杂度O(1)的方式提供消息持久化能力的。即使TB级别以上数据也能保证常数时间的访问性能,单机支持每秒100K条消息的传输。

  1. 特点:
  • 高吞吐量。
  • 消息持久化。
  • 分布式。
  • 消费消息采用Pull模式。
  • 支持Online和Offine场景,同时支持离线数据处理和实时数据处理。

Kafka的基本存储单元是分区(Partition),在一个Topic中会有一个或 多个Partition,不同的Partition可位于不同的服务器节点上,物理上一个Partition对应于一个文件夹。需要注意的是,Partition不能在多个服务器节点之间再进行细分,也不能在一台服务器的多个磁盘上再细分,所以其大小会受挂载点可用空间的限制。

Partition内包含一个或多个Segment,每个Segment又包含一个数据文件和一个与之对应的索引文件。虽然物理上最小单位是Segment,但是Kafka并不提供同一个Partition内不同Segment的并行处理能力。对于写操作,每次只会写Partition内的一个Segment;对于读操作,也只会顺序读取同一个。

  1. 消息重复解决方案

3.1 消费偏移量:

kafka在设计上不同于其他JMS队列的地方是生产者的消息不需要消费者确认,而消息在分区中又都是顺序排列的,那么必然就可以通过一个偏移量(offset)来确定每一条消息的位置。

kafka中有一个叫作_consumer_offset的特殊主题用来保存消息在每个分区的偏移量,消费者每次消费时都会往这个主题中发送消息,消息包含每个分区的偏移量。

如果所提交的偏移量小于客户端处理的最后一条消息的偏移量,那么两个偏移量之间的消息就会被重复处理;如果所提交的偏移量大于客户端处理的最后一条消息的偏移量,那么两个偏移量之间的消息就会被丢掉。所以想要用好kafka,维护消息偏移量对于避免消息被重复消费和遗漏消费,确保消息的ExactlyOnce是至关重要的,在org.apache.kafka.clients.consumer.KafkaConsumer类中提供了很多方式来提交偏移量:

  • 自动提交(默认的时间间隔是5秒)

    这种自动提交的方式看起来很简便,但会产生重复处理消息的问题。
    
  • 手动提交

    在进行手动提交之前需要先关闭消费者的自动提交配置,然后使用commitSync提交偏移量。每接收到一批消息(或单个消息)并处理完之后提交一次偏移量,这样相对来说可以减少重复消息的数量,但会降低消费端的吞吐量。
    
  • 异步提交

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!