kafka基础

  

一、kafka结构

   kafka对外使用topic概念,生产者往topic写消息,消费者从topic读消息。为了作到水平扩展一个topic实际由多个partition组成,经过增长partition数量来进行横向扩容。kafka会为partition选出一个leader,以后全部该partition请求实际操做都是leader,而后再同步到其余follower,当一个broker歇菜后,全部leader在该broker上的partition都会从新选举,选出一个leader缓存

  消费偏移量保存:一个消费组消费partition,须要保存offset记录消费到哪,0.10以前offset保存在zk中,0.10以后offset保存在_consumeroffsets topic的topic中。写进消息的key由groupid、topic、partition组成,value是偏移量offset。每一个key的offset都是缓存在内存中,查询时候不用遍历partition,若是没有缓存第一次会遍历partition创建缓存,而后查询返回。肯定consumer group位移信息写入_consumers_offsets的那个partition计算公式:spa

                  __consumers_offsets partition =
                             Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount)                     //groupMetadataTopicPartitionCount由offsets.topic.num.partitions指定,默认是50个分区。

二、kafka多播消费

 

   kafka同一个topic消息只能被同一个consumer group内其中一个consumer消费,而不能被全部消费者消费,故称为多播,但多个consumer group可同时消费这一消息。线程

   对比rocketmq,同一个topic消息能够被同一个comsumer group内全部consumer消费(采用MessageModel.BROADCASTING方式)code

   对比rabbitmq,同一个queue内消息只能被一个消费实例消费;采用广播(fanout)方式exchange能够将消息广播到全部绑定的queue中。blog

  kafka若是实现广播,只要每一个consumer有一个独立的group便可;若是实现单播消费,只要全部consumer在同一个group里rabbitmq

 

三、kafka顺序消息

     针对部分消息有序(message.key相同的message要保证消费顺序),能够在producer往kafka插入数据时控制,同一个key分发到同一个partition上,由于每一个partition是固定分配给某个消费者线程进行消费的。因此对于同一个分区的消息来讲是严格有序的;内存

    消息producer在发送消息时,对于一个有着前后顺序的消息A、B,正常状况下应该是A先发送完成后再发送B,可是在异常状况下,在A发送失败的状况下,B发送成功,而A因为重试机制在B发送完成以后重试发送成功了,这时对于自己顺序为AB的消息顺序变成了BA。 为解决此问题,严格的消费须要支持参数:max.in.flight.requests.per.connection,该参数含义:在发送阻塞前对于每一个链接,正在发送可是发送状态未知的最大消息数量。若是设置大于1,那么就有可能存在有发送失败的状况下,由于重试发送致使的消息乱序问题。因此咱们应该将其设置为1,保证在后一条消息发送前,前一条的消息状态已是可知的。kafka

   

  rocketmq支持顺序消费方式:message.key相同的message发往同一个queue上同步

  rabbitmq支持顺序消费:exchange不采用广播方式,消息只发送到一条queue上requests

相关文章
相关标签/搜索