一、消息系统分类:
1、同步消息机制 与异步消息机制
2、消息传递方式:queue队列与topic主题
二者区别:
1)队列,可多个生产者,1个消费者,消费者请求队列,才可获取消费。若多个消费者监听,则 先来者优先。
2)topic,多个生产者,多个消费者。生产者发布消息到消费服务器的特定topic中,消费服务器自动广播,传递给凡是订阅此topic的消费者。无需消费者请求。
二、kafka体系结构
分布式系统,组成包含:Producer、Consumer、Broker及分布式协调服务 ZooKeeper.
1、基本概念:
1)Broker:Kafka集群包含1个或多个服务器,这种服务器简称Broker。
2)Topic:发不到kafka集群的消息类别【可理解为目录】
3)Partition:物理概念,文件夹,每个topic可以有1个或多个partition,即同一个分区可存在多个副本。
4)Producer:负责发布消息到kafka broker。
5)Consumer:向kafka broker 读取消息的客户端。
6)Consumer Group:每个condumer属于特定的consumer group,若不指定,则为默认的group。
2、Broker:
代理保存消息的中转站。
没有副本机制,一旦宕机,该Broker消息都将不可用。consumer可以追溯到任意位置 重新从Broker中进行消息的消费。
当Consumer故障时,可用从最小的offset重新读去消费消息。
3、topic、partition、副本:
1个partition只属于单个的topic。topic与partition关系:
1)同一个topic下的不同partition包含的消息不同。
2)offset:消息被追加到partition日志文件时,分配一个特定的偏移量(offset)。offset是消息在分区中的唯一标识,Kafka通过它来保证消息再Partition的顺序性。
3)offset不垮分区。即kafka保证partition有序,而不是topic有序。
topic是一个逻辑单位,可横跨在多个Broker上。
4、kafka容错功能
每个topic可以有多个partition,每个partition可以有多个的副本。每个副本中都只有1个leader,其他都是follower.且仅有leader副本可对外提供服务。一般leader和follower在不同broker上,这样某台宕机后,follower可迅速转正,这就是kafka的容错功能。
5、Producer:
Producer客户端由2个线程协调运行,主线程和发送(sender)线程。有3种方式发送消息:
1)fire-and-forget:把消息发送给服务器后,不关心结果。大多数情况下,消息会正常到达,不过一旦失败,produer会自动重试,但若出错了,服务器是无感知的。适用于可丢失消息,对吞吐量要求较大的业务。
2) 同步发送:使用send发送一条消息,会返回一个future,调用get方法会阻塞当前线程,等待返回。适用于可靠性较高的场景,如支付,如果消息丢失,则阻断业务(或回滚)。
3)异步发送:使用send发送一条消息后指定回调函数,在broker返回结果时调用。回调函数可进行错误日志记录或重试。此方法牺牲一部分可靠性,但吞吐量比同步发送高很多。
KafkaProducer对象创建一个ProducerRecord对象。代表producer发送到kafka服务器的一个消息对象:key-value对。ProducerRecord对象包含如下消息:
1)Kafka服务端的主题名称
2)Topic中可选的分区号【非必填】
3)时间戳【取决于topic的配置,配置有两种:Createtime 或logAppendTime】
4) 其他key-value对。
ProducerRecord经过主线程后,最终由发送线程发送给kafka服务器端。KafkaBroker在收到消息时会返回一个响应,如果写入成功,会返回一个RecordMetaData对象。
RecordMetaData对象记录topic、 partition、分区里的偏移量offset及上面的两种时间戳类型。如果写入失败,会返回一个错误。Producer收到错误信息会重新发送。几次失败仍然错误,就返回错误信息。
6、consumer与consumer group:
1个consumerx消费容易堆积,so group。
规则:
1)1个partition仅能被1个consumer group中的1个consumer消费,同时可被不同consumer group中的consumer消费.
2)1个consumer group中的consumer 可同时消费1个topic中的不同partition。
消费方式:pull
每个consumer自己维护自己的消费状态。并且每个人consumer互相独立顺序地pull每个分区的消息。consumer通过偏移量的信息控制kafka中的消费消息。
特殊说明:当consumer最新写入的消息未达到备份要求时,即写入的消息未达到冗余度要求时,consumer是不可见的,只可消费到水平线的位置。
概念理解:
1)leo :log end ofset,表示topic的partition的每个副本日志中最后一条消息的位置。
2)高水位线指topic的 partition的每个副本对应的最小LEO的值。
由于每个partition的副本都是自己的LEO,因此consumer在消费消息时,最多消费到高水位线所在的位置。即producer写入新消息后 不会立即消费,leader会等待该消息被所有副本都同步后,再更新高水位线位置,这样consumer才能消费producer新鞋入的消息。避免leader所在的broker宕机后,该消息仍可以被新的leader中获取。
。。。。....
三、kafka核心原理解析
四、kafka与flume
五、Kafka与SparkStreaming
六、Kafka与Flink DataStrea m