1. 什么是kafka,kafka是一个分布式消息系统
kafka 是一个消息订阅发布系统,跟其他的消息应用相比,kafa有比较独特的地方,
-
通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
-
支持通过Kafka服务器和消费机集群来分区消息。
2. kafka 的工作方式
(1) topic,一个topic就是一类消息,每个topic又分为多个partition,partition是具体存储消息的地方,任何发布到partition的消息都会被追加到partition文件的尾部,值得关注的是,partition跟JMS或者queue不同,及时消息被消费了,这条消息依然不会被马上删除,kafka会根据broker中的配置,来决定保留多长时间后删除,比如配置的是2天,那么这些消息2天后,不关该消息是否被消费都会被删除。这种方式的好处是可以及时释放磁盘空间,以及减少消息消费之后,对文件内容改动的磁盘IO开支。
(2) Distribution
一个topic的多个partitions,被分布在kafka集群中的多个server上,每个server(kafka实例)负责partitions中消息的读写操作,另外kafka还可以配置partitions需要备份的额个数,replicas,每个partion将会被备份到多台机器上,来提高可用性。
(3)Producer
Producer将消息发布到topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于“”round-robin“方式或者通过其他的一些算法等。
(4) Consumers
Consumer端向broker发送fetch请求,并告知其获取消息的offset;此后consumer将会获得一定条数的消息,consumer端也可以重置offset来重新消费消息,
在JMS的实现中,Topic模型基于push方式,即broker将消息推送给consumer端,不过在kafka中,采用了pull方式,即consumer在和broker建立连接后主动去pull消息,这种方式的好处是consumer端可以根据自己的消费能力适时的去fetch消息并处理,并且可以控制消息的消费进度,此外消费者可以良好的控制消息的消费数量。
每个Consumer属于一个Consumer group,发送到Topic的消息,只会被订阅此Topic的每个group中的一个Consumer消费
如果所有的consumer都具有相同的group,这种情况跟queue,模式很向,消息将会在consumer之间负载均衡,
如果所有的consumer都具有不同的group,就是“”“发布-订阅”,消息将广播给所有的消费者,
一个partition中的消息只会被group中的一个consumer消费,每个group中的consumer消息消费相互独立;
针对consumer而言,它需要保存消息的offset,即消息在partition中的位置,每次consumer消费消息时,根据offset来获取新的消息
kafka 的模型结构如下图,一个topic 分为多个partition,Producer将消息发布到指定的topic中,同时Producer也能决定将此消息归属于那个partition,比如基于round-robin或者其他的一些算法,Consumer
3.消息传送机制
对于JMS实现,消息传输担保非常直接:有且只有一次(excatly once)。在kafka中稍有一些不同。
(1)at most once:最多一次,这个和JMS中的非持久化 消息类似,发送一次,无论成败,将不会重发
(2)at least once:消息至少发送一次,如果消息未能成功接收,可能重发,直到接收成功。
(3)exactly once:消息只会发送一次。
at most once:消费者fetch消息,然后保存offset,然后处理消息,当client保存offset之后,但是在消费处理过程中出现了异常,导致部分消息未能继续处理,那么此后,为处理的消息将不能被fetch到。
at least once:消费者fetch消息,然后处理消息,然后保存offset,如果消息处理成功之后,但是保存offset阶段,zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时,可能获得上次已经处理过的消息,这就是at least once,原因offset没有及时的提交给zookeeper,zookeeper回复正常之前还是offset状态,
4, zookeeper
5,大家kafka的步骤