参考:https://www.cnblogs.com/shijiaoyun/p/4860734.html?tvd=&from=timeline&isappinstalled=1
Kafka设计方式
Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。
独特设计方式:
Topic:对一组信息的归纳,消息以topic为单位进行归纳
Producer:向Kafka发布消息的程序
Consumer:预订topics并消费消息的程序
Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker.
producers通过网络将消息发送到Kafka集群,集群向消费者提供消息
Topics
对每个消息,Kafka对其日志进行了分区:
每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。分区中的每个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息(consumer来维护:一般情况下随着consumer不断的读取消息,这offset的值不断增加,但其实consumer可以以任意的顺序读取消息,比如它可以将offset设置成为一个旧的值来重读之前的消息)。
分区目的:每个日志小,可在单个服务上保存,每个分区可以单独发布和消费
–> 并发
–> 分布式:
- 每个分区在Kafka集群的若干服务中都有副本,持有副本的服务可以共同处理数据和请求
- 每个分区都由一个服务器作为“leader”,零或若干服务器作为“followers”,leader负责处理消息的读和写,followers则去复制leader(如果leader down了,followers中的一台则会自动成为leader。集群中的每个服务都会同时扮演两个角色:所持有的一部分分区的leader,同时作为其他分区的followers,集群就会据有较好的负载均衡。)
Producers
Producer将消息发布到它指定的topic中,并负责决定发布到哪个分区。
通常简单的由负载均衡机制随机选择分区,但也可以通过特定的分区函数选择分区(通常更多)。
Consumers
发布消息通常有两种模式:队列模式(queuing)和发布-订阅模式(publish-subscribe)。
- 队列模式
consumers可以同时从服务端读取消息,每个消息只被其中一个consumer读到 - 发布-订阅模式
消息被广播到所有的consumer中;
Consumers可以加入一个consumer 组,共同竞争一个topic,topic中的消息将被分发到组中的一个成员中。
Kafka只能保证一个分区之内消息的有序性,在不同的分区之间是不可以的。如果需要topic中所有消息的有序性,那就只能让这个topic只有一个分区,当然也就只有一个consumer组消费它。