消息队列中间件kafka入门
目录
什么是kafka
Kafka是一个分布式消息传递系统,通过发布-订阅模型提供快速、高可伸缩性和冗余的消息传递。
为什么要使用消息中间件kafka
解耦,异步,削峰,这是消息队列的三大优势。
Kafka与其它中间件的区别
中小型软件公司,建议选RabbitMQ,万级别,us,主从架构。
大型软件公司,根据具体使用在rocketMq和kafka之间二选一。十万级别,ms,分布式架构。
Kafka的简单演变
kafka一代
简单的先入先出队列,生产者放入消息,消费者拿出消息处理。消费者端会记录一个offset,表明该消费者当前消费到哪条数据,所以下次消费者想继续消费,只需从offset+1的位置继续消费就好了。消费者甚至可以通过调整offset的值,重新消费以前的数据。
出现的问题:
所有消息都放到一个队列当中,一方面消息的类型鱼龙混杂,另一方面,消息增多,速度一定会很慢。
Kafka二代
采用多条队列, 每条队列里面的消息都是相同的topic。一个队列只有一种topic,消费者再也不用担心会碰到不是自己想要的topic的消息了。提高吞吐量。不同topic的消息交给不同队列去存储,再也不用以一敌十了。消息可以根据topic和key选择合适的Partition队列。
什么是topic?
所有Kafka消息都被组织成主题topic。如果你想发送一条消息,你就把它发送到一个特定的topic,如果你想读一条消息,你就从一个特定的topic读它。
出现的问题:
高可用性,单点是不可靠的。
Kafka三代
解决单点不可靠的问题,引入了集群。Kafka对集群的支持也是非常友好的。在Kafka中,集群里的每个实例叫做Broker。每个partition不再只有一个,而是有一个leader(红色)和多个replica(蓝色),生产者根据消息的topic和key值,确定了消息要发往哪个partition之后(假设是p1),会找到partition对应的leader(也就是broker2里的p1),然后将消息发给leader,leader负责消息的写入,并与其余的replica进行同步。一旦某一个partition的leader挂掉了,那么只需提拔一个replica出来,让它成为leader就ok了,系统依旧可以正常运行。
Zookeeper在kafka中的作用
- 使用Zookeeper来进行所有Broker的管理。
- 生产者通过监听zookeeper上Broker节点感知Broker,Topic的状态,变更,来实现动态负载均衡机制,当然这个机制Kafka已经结合zookeeper实现了。
- 记录消息消费进度Offset记录。
- 记录消息分区于消费者的关系。
另外,新版本在主键弱化zookeeper的作用,减少了对zookeeper的依赖。
如何选择partitions的数目
越多的partitions会有更高的吞吐量,但是它会增加时延,不可靠性,以及更多的存储空间。所以,需要一些权衡。
什么是kafka的消费者组
消费者组保证了以下内容:
- 一个分区只可以被消费组中的一个消费者所消费。
- 一个消费组中的一个消费者可以消费多个分区。
- 一个消费组中的不同消费者消费的分区一定不会重复。
- 一个消费组所有消费者一起消费所有的分区
作用:
- 高性能,同一个消费者组的消费者分担了压力,比一个消费者强。
- 消费模式灵活,可以有不同的组合方式。
- 故障容灾,如果一个消费者组中的一个消费者故障了,其它消费者仍然可以消费所有的分区。
剩余的内容
下载并安装kafka,搭建环境。
Kafka的简单生产者消费者代码实现。
参考文章
- https://zhuanlan.zhihu.com/p/37405836
- https://sookocheff.com/post/kafka/kafka-in-a-nutshell/
- https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying
- https://blog.****.net/u011311291/article/details/85264046?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
- https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/
- https://blog.****.net/john1337/article/details/103060820
关注微信公众号,你还有头发吗,获取更多java软件开发学习资源,覆盖java基础,android,网络编程,并发编程,mysql,linux,算法,以及C++和python书籍资源。