Kafka概述
为什么需要消息队列
客户端A要向客户端B交互,A要向B发送数据,这时候可能有两种问题
- B不在线,B挂了
- A传输速度是10M/S,B接收速度是5M/S这样就会造成数据丢失
因此我们需要在AB中间加一层消息队列
一对一的情况下,客户端需要实时监控消息队列中内容
点对点和发布订阅模式共同的优点:
- 解耦(没有直接相连,通过消息队列中间件相连)
- 冗余
- 扩展性(kafka是有集群概念的 )
- 灵活、峰值处理能力
- 可恢复性
- 顺序保证(队列是先进先出)
- 缓冲(均衡客户端A发送消息速度和客户端B接收消息速度)
kafka介绍
kafka是一个分布式(有集群概念)消息队列,底层是Scala
下载的压缩包前面的版本是Scala的版本,后面的版本是kafka的版本
kafka对消息保存的时候根据Topic进行归类,发送消息者称为Producer,接收消息者称为Consumer
kafka集群有多个kafka实例(节点)组成,每个实例(节点)称为一个broker [ˈbrəʊkə](经纪人)
kafka集群,Consumer都依赖于zookeeper集群保存meta(简称)信息,保证系统可用性
kafka架构
broker里面用于存数据的地方是Topic主题,Topic又有分区的概念
分区是做负载均衡用的
每个分区有自己的leader和自己的follower
无论是读还是写都只找leader,follower只做备份用的,或者说之前的leader挂掉,则这个follower称为新的leader代替挂掉的那个继续工作
同一个组的消费者不能同时消费同一个分区的数据,比如A和C可以同时消费0分区的A数据,但是B不可以同时和A消费
另付一张理解图
kafka集群搭建启动
普通消息队列支持点对点和发布订阅模式,kafka只支持点对点模式,需要new一个consumer来消费消息
kafka安装以后比如3节点的server.xml配置
- broker.id 唯一的数字序号
delete.topic.enabled=true
是否允许删除topic(默认false,需要修改为true,因为消息是我们自己发的)log.dirs
修改日志文件位置,***同时也存储了kafka真正的消息数据- zookeeper.connect zookeeper集群的地址
注:配置一个即可,其他的将配置完的分发到其他节点服务器,然后只需修改broker.id
kafka集群依赖于zk集群,因此启动kafka集群前需要先启动zk集群
启动kafka集群命令,每台都执行以下命令
./bin/kafka-server-start.sh config/server.properties