消息队列| 青训营笔记

31 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

本节课程主要分为五个方面:

  1. 消息队列的前世今生
  2. 消息队列-Kafka
  3. 消息队列-BMQ
  4. 消息队列-RocketMQ
  5. 最佳实践

消息队列是什么

  • 解耦: 比如说某一个系统A要与其他系统打交道(即调用其中的方法),如果其它系统改变或者新增系统,那么A系统都会改变,这样的话耦合度比较高,比较麻烦。使用消息队列来解决这个问题。我们A系统将产生的数据发入消息队列中,其它的系统再去消息队列来进行消费,那么其他系统的减少或者新增系统即与A系统关系不大了,这样来实现解耦的功能。

  • 削峰: 比如平常用户的请求我们会直接访问数据库,在大量用户过来的时候,这样的话我们会对数据库照常比较大的压力,在这里我们增加一个消息队列,这样的话不管你请求来多少,我先存入消息队列,然后我再让系统慢慢的处理你的请求(如右图),这样很好的减缓了数据库的访问压力。

  • 异步: 某一个用户使用系统A,但是A要调用系统B,C,D,但是每一个系统返回的时间是不一样的,你必须要等待全部返回后才可以响应用户。如果我们这里采用消息队列,当用户发送请求后,我们把数据传给消息队列,然后再直接响应给用户我已经发送了信息。

  • 日志处理:日志采集客户端,负责日志数据采集,定时写受写入Kafka队列; Kafka消息队列,负责日志数据的接收,存储和转发; 日志处理应用:订阅并消费kafka队列中的日志数据

消息队列可以简单理解为:把要传输的数据放在队列中

消息队列-Kafka

kafka是一个分布式、高吞吐量、高扩展性的消息队列系统,主要应用在日志收集系统和消息系统。

使用方式:

image.png

image.png topic可以认为是一个业务场景,逻辑队列,存储对应业务的所有数据

image.png 生产者发送的消息数据Topic会被存储在分区中,这个分区的概念和ElasticSearch中分片的概念是一致的,都是想把数据分成多个块,好达到我们的负载均衡,合理的把消息分布在不同的分区上,分区是被分在不同的Broker上也就是服务器上,这样我们大量的消息就实现了负载均衡。每个Topic可以指定多个分区,但是至少指定一个分区。每个分区存储的数据都是有序的,不同分区间的数据不保证有序性。因为如果有了多个分区,消费数据的时候肯定是各个分区独立开始的,有的消费得慢,有的消费得快肯定就不能保证顺序了。那么当需要保证消息的顺序消费时,我们可以设置为一个分区,只要一个分区的时候就只能消费这个一个分区,那自然就保证有序了。

image.png

Replica,副本就是分区中数据的备份,是Kafka为了防止数据丢失或者服务器宕机采取的保护数据完整性的措施

Broker(实例或节点)是Kafka的实例,启动一个Kafka就是一个Broker,多个Brokder构成一个Kafka集群,这就是分布式的体现

Consumer Group(消费者组)和 Consumer(消费者):Consume消费者来读取Kafka中的消息,可以消费任何Topic的数据,多个Consume组成一个消费者组,一般的一个消费者必须有一个组(Group)名,如果没有的话会被分一个默认的组名。