一、Kafka
1.背景
发布与订阅系统
例子:发布者和阅读者并没有直接关联,而是通过中间站公众号,收到新的消息通知
当只有一个应用程序向另一个程序发送消息时
当程序较多时
当程序更多时,会出现一些问题
1.程序之间存在着较多重复工作,造成资源浪费
2.信息过多,会出现信息丢失
3.信息之间耦合度较高,导致牵一发动全身
当很多应用程序向更多程序发消息时,优化处理,追加中间件【Kafka】
发送者将消息发送给Kafka,消费者在需要时读取消息
2.什么是kafka
Kafka是接收不同的生产者的消息,由不同消费者订阅不同的消息供自己使用
Kafka是一个分布式的基于发布/订阅模式的消息队列
3.消息、生产者、消费者
消息:想象是数据库里的一行数据
生产者:发布消息的程序
消费者:订阅消息的程序
4.主题、分区
问题:不同的消费者想要的消息不一样怎么办?【主题、分区】
主题(Topic):
生产者在进入Kafka时,需要给消息分不同的主题,消费者则订阅不同主题【避免消息干扰】
分区(Partition)
一个主题会包含不同分区,分区可以分布在不同服务器上,这样一个主题可以在不同服务上
生产者将消息发送给相应的主题的相应分区下
问题:生产者如何知道把消息放在那个分区
1.生产者指定分区
2.生产者没指定分区
分区器会根据键起作用
键:一个标记
分区器:一个算法【输入值是键,输出值对应分区】
一条消息包含内容
消费者消费消息
偏移量(offset):第几个
一个分区里,每个消息的偏移量是唯一的
消费者只能顺序读取
5.Broker、集群
服务代理(Broker):
已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群
一个Kafka服务器会有多个主题,每个主题会有多个分区,并接收生产者消息,消息会有对应偏移量,并保存到磁盘里,并为消费者提供服务,响应消费者的请求
Kafka集群
二、kafka的应用
1.缓冲/消峰:
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况
双十一秒杀系统,避免服务器挂掉,将用户发起的消息按照顺序写入消息队列中,按照顺序
2.解耦:
允许你独立的扩展或修改两边的处理过程,只要确保他们遵守同样的接口约束
3.异步通信:
允许用户把一个消息放入队列,但并不立即处理它,然后在需要的时候再去处理它们
三、消息队列的两种形式
1.点对点模式
-
消费者主动拉取数据,消息收到后清除数据
2.发布/订阅模式【Kafka】
-
可以有多个主题
-
消费者消费数据后,不删除数据
-
每个消费者相互独立,都可以消费到数据
四、Kafka的基础架构
1.为方便扩展,并提高吞吐量,一个topic分为多个partition
2.配合分区的设计,提处消费组的概念,组内每个消费者并行消费
【ps:消费者组,由多个consumer【消费者】组成,消费者组内每个消费者消费不同分区的数据,一个分区只能由一个组内消费者消费,消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者】
3.为提高可用性,为每个partition增加若干个副本,容错效果【leader,follower】【放在不同服务器节点上】
4.zookeeper中记录谁是leader,Kafka2.8.0以后也可以配置不采用zk
五、kafka的安装部署
https://www.cnblogs.com/big-keyboard/p/16920816.html
https://www.cnblogs.com/big-keyboard/p/16920854.html
六、kafka的主题命令脚本介绍
1.创建topic
bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --create --topic first --partitions 3 --replication-factor 1
2.查看主题
bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --list
3.查看主题详细的描述信息
bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --describe --topic first
4.修改主题【修改只能增加分区,不能减少分区】
bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --alter --topic first --partitions 2
5.删除主题
bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --delete --topic first
七、生产者&消费者命令
1.生产者发送消息
bin\windows\kafka-console-producer.bat --bootstrap-server localhost:9092 --topic first
2.消费者消费消息
此命令从启动消费者开始,接收到的消息进行消费
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic first
从头开始消费追加参数 --from-beginning【ps:kafka分区内有序,分区间无序】
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic first --from-beginning
分组消费
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic first --group kafka1
同一个组能够实现断点续传,记录偏移量,避免出错时,可以从上个失败节点继续消费
八、DEMO:kafka-python实现生产者消费者
参考:
https://kafka-python.readthedocs.io/en/master/
https://zhuanlan.zhihu.com/p/31731892
product.py
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='localhost:9092') #连接kafka
msg = "Hello, kafka".encode('utf-8')
while True:
producer.send('test', msg)
time.sleep(5)
# producer.close()
consumer.py
from kafka import KafkaConsumer
consumer = KafkaConsumer('test', bootstrap_servers=['localhost:9092'])
for msg in consumer:
recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
print(recv)