一、消息队列
1.1 消息队列理解
消息队列,英文全称:Messsage Queue,简称MQ,是将数据从队列的一端进入,从另一端流出的过程。
1.2 消息队列使用场景
- 引用耦合
多应用通过消息队列对同一消息进行处理,避免调用接口失败,导致整个过程失败。
- 异步处理
多应用对消息队列中同一消息进行处理,并发处理,比串行效率更高。
主要针对串行处理,比如一个业务:对于注册信息,需要有两个处理过程,发送注册邮件和发送注册短信通知,串行业务如下: 并发处理,发送注册邮件和发送注册短信可以理解为两个消费者,同时订阅注册信息的写入队列,可以并发处理两个发送通知业务,流程如下:
- 限流削峰
广泛应用于秒杀或者抢购活动,避免流量过大导致应用挂掉的情况。
对于秒杀和抢购业务,瞬间请求数量会很大,可以将请求先存储到消息队列,后端应用程序从消息队列中取消息处理。
- 消息驱动的系统
消息生产者生产消息,发送到消息队列,消费者订阅消息队列,有消息通知到,开始工作,处理队列中的消息。
应用程序等待订阅的消息队列有消息进入队列,开始处理业务。
1.3 消息队列的两种方式
点对点模式
点对点模式下包括三个角色:
- 消息队列
- 发送者(生产者)
- 接收者(消费者)
消息发送者生产消息发送到queue中,消息接受者从queue中取出并且消费消息。消息被消费后,queue中不在存储消息。所以这种点对点模式有如下特点:
- 每个消息只有一个接收者(Consumer),即一旦队列中的消息被消费,消息将不存在队列中。
- 发送者和接收者之间没有依赖性
- 接收者成功接收消息后,需要向队列应答成功,以便队列删除当前接收的消息。
发布/订阅模式
发布/订阅模式包括三个角色:
- 角色主题(Topic)
- 发布者(Publisher)
- 订阅者(Subscriber)
发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。发布/订阅模式特点:
- 每个消息可以有多个订阅者
- 发布者和订阅者之间有时间上的依赖。
- 为了消费消息,订阅者需要提前订阅该角色主题,并保持在线。
二、Kafka简介
kafka的官方介绍,不多少,可以去看下官网。
2.1 kafka的特点
- 可靠性:分布式、分区、复制和容错等
- 可扩展性:kafka消息传递系统轻松缩放,无需停机
- 耐用性:kafka使用分布式提交日志,意味着消息会尽可能快速的保存到磁盘,因此它是持久的。
- 性能:高吞吐量
2.2 kafka适用场景
kafka是一个分布式发布-订阅消息系统、一个强大的队列,可以处理大量的数据,适合离线和在线信息消费。kafka消息保存在磁盘上,并在集群内复制以防止数据丢失。kafka与flink和spark非常好的集成,应用于实时流数据分析
- 指标分析
kafka通常用作操作监控数据,设计聚合来自分布式应用程序的统计信息,产生操作的数据集中反馈。
- 日志聚合解决方法
kafka可以跨组织从多个服务器搜集日志
- 流式处理
流式的处理框架(spark、storm、flink)
2.3 kafka基本结构
- Producer:消息生产者,向kafka发布消息的角色
- Consumer:消息消费者,从kafka中拉取消息消费的客户端
- Consumer Group:消费者组,组中可以存在多个消费者,消费者消费Broker中当前topic的不同分区中的消息,消费者组之间护不影响。所有消费者都属于某个消费者组,消费者组其实是一个订阅者,某个分区中的消息只能被消费组中的一个消费者消费。
- Broker:经纪人,一台kafka服务器就是一个broker,一个kafka集群有多个broker,一个broker可以有多个topic。
- Topic:主题,可以理解为一个队列,生产者和消费者都是面向一个topic。
- Partition:分区,为了实现可扩展性,一个非常大的topic可以分布到多个broker上,一个topic可以分为多个Partition,每个Partition是有序队列,但不能保证全局有序。
- Replica:副本,副本机制,保证在一个broker发生故障时,节点上Partition数据不丢失,一个Topic的每个分区有若干个副本,一个Leader和多个Follower.
- Leader:每个分区多个副本的主角色,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。
- Follower:每个分区多个副本的从角色,实时从Leader中同步数据,保持和Leader数据的同步,Leader发生故障时,某个Follower会成为新的Leader。