消息中间件kafka

一、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)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值