一、消息队列的流派
- 有broker的MQ
- 重Topic(必须有topic) :kafka
- 轻Topic
- 无broker的MQ
二、kafka基本概念
三、demo——生产者和消费者——单机
官方demo;:Apache Kafka
消费者有两种消费的方式,如下:
就像我们进群一样,有的刚进来以后只能看见进群之后的消息;有的可以看到全部历史群聊。
既然“历史群聊”也可以被看见,那就说明消息不是和socket通信一样发完以后关掉server和client就没有了的,而是被保存了下来。对的,以日志的形式保存在kafka服务器上。具体位置可以自己指定。
有个问题,“历史聊天记录”太多,多达几个T,一个磁盘放不下怎么办?这就引出了Topic分区。
3.1 Topic分区
除了能让磁盘放下之外,分区还有一个好处。之前只放在一个文件的时候,一次只能有一个producer去写这个文件,但是分区以后, 读写可以并行了!
如何指定创建几个分区:把一个topic分成几个区在创建topic的时候用命令参数--partitions 去指定
3.2 单播和多播(其实是一个东西)
单播:对于同一个consumerGroup里订阅了同一个topic的消费者们,只有一个consumer能收到producer发送的消息,而且是最新加入的那个consumer。
PS:consumer1和consumer2在一个组里(运行时指定的,截图的时候可能被挡住了)
多播:不同的consumerGroup组订阅同一个topic,那么每个组里只有一个consumer能收到消息。
四、搭建kafka集群
以3个broker(kafka)节点的集群为例,这里我们用3个端口代表3个节点,就不开3个服务器了
要新建3个server.properties文件
然后启动3个节点
有了集群以后,创建topic的时候可以指定生成副本(也就是备份),一共有3个节点,也就可以有3个备份。
而且kafka会自动指定哪个节点作为leader,leader可以理解为MySQL主从复制的master,以leader节点存储的信息为主,producer也只往leader节点上发消息,不是3个节点都发,同样consumer也只去读leader节点上的消息,其他两个节点去同步/拷贝leader的信息!其他两个节点只是在leader挂了的时候才能用到,这又涉及到了选举的问题,以后再说选举策略!
如上图所示,名为my-replicated-topic的topic有两个分区,partition0和partition1,这两个分区各自都有3个副本,其中partition0的leader是2号节点,partition1的leader是0号节点,示意如下: