kafka系列2:工作模型

1. kafka的整体模型

1.1 相关概念

1.Broker
Broker:kafka服务器,与RabbitMQ里的Broker基本一样,默认端口是9092。生产者和消费者都需要根据这个Broker建立连接。
2.消息
客户端之间传输的数据叫做消息,或者记录。客户端代码中,Record可以是一个键值对。
消息在传输过程中需要序列化,所以代码里要指定序列化工具。
3.生产者和消费者
这是个相对的概念,发送方叫生产者,接收方叫消费者。
为了提高效率,生产者不一定一条条发送,可以批量发送,这个由参数batch_size决定。
与RabbitMQ不同,kafka的消费者只支持pull模式。消费者可以指定自己一次可以获取多少消息,配置为max.poll.records
4.Topic
生产者与消费者如何在mq里管理呢?这个是通过队列来关联的。也就说生产者发送消息,需要指定发送给哪个队列。消费者要指定从哪里接收。

在kafka里,这个队列叫Topic,是一个逻辑概念,可以理解为一组消息的集合。
生产者和Topic以及Topic和消费者的关系是多对多,一个生产者可以发送多个消息到多个Topic,一个消费者也可以从多个Topic获取(为了安全,最好一对一)。

5.Partition和Cluster
如果Topic中的消息太多,会带来两个问题:
1.不方便横向扩展,也就是集群扩容时不易操作。
2.并发或者负载过高时,都在一个Topic性能容易扛不住
为此将Topic进行拆分,将一个Topic分成多个分区。
分区在创建topic的时候指定,每个topic至少有一个分区。如果不指定,默认是一个。

sh bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic lqctest

partitions 是分区数,replication-factor是主题的副本数
例如Topic 有3个分区,生产者以此发送9条消息,对消息进行编号。第一个分区存1,4,7,第二个分区存2,5,8,第三个分区是3,6,9,这就实现了负载。
每个partition都有一个物理目录,就是日志目录,不过消息被读取之后不会删除,而是顺序追加写入。

6.Partition副本Replica机制
每个partition可以有若干个副本,副本必须在不同的Broker上,一般我们说的副本,包括其中的主节点。
多副本结构:
在这里插入图片描述
7.segement
kafka数据是放在后缀.log的,内容不断追加时,文件越来越大,这时候检索效率就很低了,所以将文件再切分成段segement。实际上kafka的存储文件就是以段为单位存储的。例如我本机的文件为:
在这里插入图片描述
而每个segement都有至少一个数据文件和两个检索文件组成:
在这里插入图片描述
一个segement文件默认是1G。
8.Consumer Group
如果生产者生产消息过快,会造成消息在Broker堆积,此时需要扩容,增加消费者数量,那怎么知道消费者是不是消费同一个Topic呢?
这就引入课一个Consumer Group消费组的概念,在代码中通过group id来配置。
消费同一个topic的消费者不一定是同一个组,只有group id相同的消费者才是同一个消费者组。
但是同一个group中的消费者,不能消费相同的partition,partition要在消费者之间分配。

如果消费者比partition少,一个消费者可以消费多个partition。
如果消费者比partition多,会有消费者没有partition可以消费的,不能出现一个group里面的消费者消费同一个partition的情况。
9.Consumer Offset
partition里面的消息是顺序写入的,被读取之后不会被删除,如果消费者挂了或者下次读取,想要接着上次的位置继续,该怎么做,会不会出现重复消费的情况。
因为消息是有序的,我们可以对消息进行编号,用来标识一条唯一的消息,这个编号就是offset,偏移量
在这里插入图片描述
offset记录着下一条将要发送给consumer的消息的序号。这个消费者跟partition之间的偏移量没有保存在zk,而是直接保存在服务端。

1.2 完整的结构

Kafka的整体结果如下,虽然图难看了点,但是结构不算复杂
在这里插入图片描述
分析:
这里有三台mq机器,也就是三个broker。
有两个Topic:Topic0和Topic1
Topic0有2个分区:partition0和partition1,每个分区一共3个副本。
Topic1只有1个分区:parition0,每个分区有3个副本。
红色字体的副本代表leader。
有两个消费者组:第一个只有一个消费者,它消费了topic0的两个分区。第二个消费者组,消费了两个topic,其中有一个消费者,消费topic0的partition0,还消费topic1的partition0。有一个消费者,没有partition可以消费。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵横千里,捭阖四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值