快捷搜索: 王者荣耀 脱发

MQ-消息队列的两种模式

什么是MQ

MQ即消息队列。消息队列的含义是生产者与消费者通信时,把要传输的数据放到队列中。它被广泛应用在异步通信的领域中。 举个栗子:

老师希望学生多读书,经常给学生看一些好书,原来的方式是这样:老师需要等待学生课间的时候,把书给学生送去,并亲眼监督学生读完书才走。久而久之,老师和学生都觉得麻烦。 后来演进成:老师对学生说「我放到书架上的书你都要看」,然后老师每次发现不错的书都放到书架上,学生看到书架上有书就拿下来看。 此时的书架就是一个消息队列,老师是生产者,学生是消费者。

好处:

  1. 老师想给学生书的时候,不必看学生是否有空,老师只需要把书放到书架上就行了。这样双方时间都更自由。
  2. 不必亲眼观察学生的读书过程,节省时间。
  3. 如果有一天另一个学生也想一起看书,老师只需要把书放到书架上,不同的学生从书架上取书即可
  4. 书架上的书放在那里,学生阅读速度快就早点看完,阅读速度慢就晚点看完,没关系,所以学生(消费者)压力会小一些。

推理出:MQ主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。

MQ的好处

1.解耦

每个成员不必受其他成员影响,可以更独立自主,只通过一个简单的中间件来联系。 栗子: 老师可以不知道从书架上取书的是谁,学生也可以不知道往书架上放书的人是谁,在他们眼里,都只有书架,没有对方。

2.提高效率

老师「把书放到书架上,别的我不问」,为自己节省了大量时间。不需要花费额外时间监督

3.异步

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,把一个消息放入队列,但并不立即处理它。

4.削峰

假设学生读书很慢,如果采用监督读完的方式,两人都会有困扰 如果老师1天连给了五本,之后隔三个月才又给一本,那学生只要在三个月内从书架上陆续取走五本书读完就行了,而不是连续给5本,就要一口气看完。 使用MQ能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5.可恢复性

系统的一部分组件失效时,不会影响到整个系统。MQ降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

6.顺序保证

在大多使用场景下,数据处理的顺序都很重要。大部分MQ本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。

7.缓冲

消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。

消息队列的两种模式

点对点模式

(一对一,消费者主动从消息队列中拉取数据,消息收到后清除消息队列中对应内容) 对一个消息而言,只会被一个消费者消费

发布/订阅模式

(一对多,消费者消费数据之后不会清除消息队列中的数据) 一个消息可能会被多个消费者消费

异步和同步

同步消息: 老师给学生书, 只有当成功给到他手上并监督他看完,老师才能得到响应,去做别的事。 如果此时有100个学生都要去看书, 此时,只有等前100个学生都看完,才会监督第101个

异步消息: 老师将书放到消息队列后,即会返回一个成功响应,此时,老师就可以立刻去做别的事情,不需要监督学生看完。

经验分享 程序员 微信小程序 职场和发展