导图社区 消息队列kafka
这是一篇关于消息队列kafka的思维导图,主要内容包括:参考视频,代码注意事项,消息顺序和消费的顺序,概念间的联系,背景,kafka集群部署,kafka架构,基本概念。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
本人主业是做信息化项目管理,目前工龄是3年零6个月,银行存款100w 。这是我自己制作的个人规划,给有需要的人一点一点参考,不喜勿喷~
这是一篇关于证券投资分析的思维导图,主要内容有概述、价值分析与投资方法、宏观经济分析、行业分析、公司分析、技术分析等。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
消息队列kafka
背景
Kafka最早是由LinkedIn公司开发的,作为其自身业务消息处理的基础,后LinkedIn公司将Kafka捐赠给Apache,现在已经成为Apache的一个顶级项目了,Kafka作为一个高吞吐的分布式的消息系统,目前已经被很多公司应用在实际的业务中了,并且与许多数据处理框架相结合,比如Hadoop,Spark等。
目前市面上主流的消息队列有rabbitmq、rocketmq和kafka.
kafka的吞吐量是最高的每秒能处理17w条消息,没天能处理千亿条消息。所以这个性能放哪都是够了。
在计算机软件中没有什么是加一层解决不了的,如果有那就再加一层。出自剑桥大学计算机教授
https://en.wikipedia.org/wiki/David_Wheeler_(computer_scientist)
场景:日志处理和分析、高吞吐量的场景、大数据的加载
基本概念
topic主题:是消息归类的基本单元
partitions分区:消息分区,通过偏移量offset来指定消息的位置,是实现消息的分布式管理的核心机制
replicas:分区副本,每个分区可以有多个副本,这些副本中包含1个leader(读写),多个follower(拷贝)
broker集群:broker集群也叫kafka集群,其中每个broker就是一个kafka进程实例。将kafka实例简为broker
zookeeper:协调多个broker 存储元数据
概念间的联系
topic与partitions分区:通常情况下,生产者通过指定topic来将消息发送到消息队列,然后消费者再根据topic来消费消息。但问题是会存在单点失败的风险,所以生产中,会启动多个kafka实例,每个topic会分成多个分区,每个分区保存在不同的实例中。所以,当生产者向某个topic发送消息时,实际上是发送给topic的某个分区,并且添加到分区的最后,通过一个偏移量offset来指定消息的位置。
比如:msql的分区或者redis集群也是这么做的
每个分区都和1个文件夹对应,log是消息,index是offset,timeindex是时间
partitions分区和replicas分区副本:副本是分区的另一种表现形式,因为分区也有单点失败的风险,所以我们需要对每个分区生成多个副本并保存在不同的kafka实例上。这样及时某个分区挂了,那也不影响。
注意:分区副本放在不同的实例中
kafka集群部署
kraft模式
引入krfat模式是为了去掉zookeeper,将元数据的管理功能集成到kafka broker的内部,这样的好处是简化了运维和部署,减少服务器资源占用,不需要再部署zookeeper集群了,同时可扩展性更好,单个集群中的分区数量可与扩展到百万个,集群重启和恢复的时间更短。kafka 4.0后只支持karaft模式(25年3月份发布)。
zookeeper模式
kafka架构
上图中我们启动了两个broker,每个topic有两个分区,有两个分区副本。生产者通过topic向broker发送消息。如果某个broker挂掉,zookeeper会把同一分区的follower副本选为leader。如果所有的broker都挂了,那会导致消息丢失,所以broker会将消息持久化到磁盘里防止数据丢失。
kafka引入消费者分组概念,在同一个group中,一个消费者可以消费多个分区,但是一个分区只能被同一组中的某个消费者消费,这样是为了提升效率,如果不这么设计,就需要加锁来限制。
根据消费者组的特性,可以实现不同的消息模式,例如发布订阅模式和点对点模式。发布订阅模式:一个消费被发送到主题后,所有订阅这个主题的消费者组都能收到这个消息。那么每个消费者都能消费这个消息,只要我们把消费者放到不同的消费者组中就能实现,因为消费者组只限定了同组的消费者只能有一个消费者来消费主题。点对点模式:一个消息只能有一个消费。 总结:只要控制消费者在不在一个组里就能实现这两种模式。
消息顺序和消费的顺序
先到队列的offset小,后到的offset大。因为消息会被分散到不同的分区中,所以对于m3和m4,不知道谁会先消费。但可以肯定的是,同一分区的消息是顺序消费的。
那如何保证M3和M4会发送到同一个分区呢?那就是给这两个消息设置同一个key,则有就能保证在同一分区。
代码注意事项
1、acks设置为all,这样发过来的消息只有leader和follower同时写入好了消息才算是消费发送成功,才能保证消息不丢失。
2、给消费者设置消费组
3、kafka上的所有消费者都是主动拉消息,先poll然后消费完成后进行commitsync,这样就在队列中修改offset了。
参考视频
https://www.bilibili.com/video/BV12oLaztEkS?spm_id_from=333.788.player.switch&vd_source=e997d3821c84d07d27f63407579f2f97