因为好久没有使用kafka了 所以被问kafka的时候印象就有点模糊了,但是要问kafka整体的架构,属实不知怎么回答。
kafka结构kafka是一个典型的发布订阅模式。主题是kafkaserver,需要有producer生产消息投递,consumer消费消息。
kafka设计目标-
以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
-
高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
-
支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
-
同时支持离线数据处理和实时数据处理。
-
支持在线水平扩展
broker:准确来说一个kafka的进程就是一个broker,虽然生产上面都是一台机器部署一个,但是测试环境下搭建很有可能一台启动多个kafka进程。
topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
partition:topic中的数据分割为一个或多个partition。
producer:将消息发布到Kafka的topic中。
consumer:消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
consumergroup:每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制-给consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
关系
broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
生产一条消息后的具体走向1、有producer生产一条消息,指定好了topic后,根据分区选择算法把消息发送到kafka
2、kafka收到消息后,一般是consumer主动去获取消息(pull)。
生产者与分区之间的关系生产者通过一定的路由算法去决定把消息投递到哪个分区下的,这个算法可以是默认提供的,也可以是自定义的。所以在同一个partition下是可以保证顺序性的,但是不同的partition下是不能保证顺序性的。
分区与消费者之间的关系分区与消费者(这里的消费者属于同一个组中)有一点联系的。
分区数 > 消费者。一个消费者对应一个或者多个分区数。
分区数 = 消费者。一个消费者对应一个分区数。
分区数 < 消费者。一个消费者对应一个分区数。多的消费者处于空闲状态。
剩下的就是producer、server、consumer参数设置了。
参数个人觉得有一定的了解就行了,不一定强记
生产者参数配置:
Kafka生产者——重要参数配置 - 6。 - 博客园 (cnblogs.com)
server参数配置:
kafka 配置文件参数详解 - 小小小小小小鱼 - 博客园 (cnblogs.com)
消费者参数配置:
Kafka消费者-重要参数 - 马晟 - 博客园 (cnblogs.com)
核心技术:
顺序读写、零拷贝(sendfile、mmap)、分区存储、批量读写、批量压缩



