消息队列介绍下

简介: 《基础》

一、消息模型

点对点

消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。


发布/订阅

消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。


发布与订阅模式和观察者模式有以下不同:

  • 观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,生产者与消费者不知道对方的存在,它们之间通过频道进行通信。
  • 观察者模式是同步的,当事件触发时,主题会调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,生产者向频道发送一个消息之后,就不需要关心消费者何时去订阅这个消息,可以立即返回。


二、使用场景

异步处理

发送者将消息发送给消息队列之后,不需要同步等待消息接收者处理完毕,而是立即返回进行其它操作。消息接收者从消息队列中订阅消息之后异步处理。

例如在注册流程中通常需要发送验证邮件来确保注册用户身份的合法性,可以使用消息队列使发送验证邮件的操作异步处理,用户在填写完注册信息之后就可以完成注册,而将发送验证邮件这一消息发送到消息队列中。

只有在业务流程允许异步处理的情况下才能这么做,例如上面的注册流程中,如果要求用户对验证邮件进行点击之后才能完成注册的话,就不能再使用消息队列。

流量削锋

在高并发的场景下,如果短时间有大量的请求到达会压垮服务器。

可以将请求发送到消息队列中,服务器按照其处理能力从消息队列中订阅消息进行处理。

应用解耦

如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其它模块的影响会很小,从而实现可扩展性。

通过使用消息队列,一个模块只需要向消息队列中发送消息,其它模块可以选择性地从消息队列中订阅消息从而完成调用。

三、可靠性

发送端的可靠性

发送端完成操作后一定能将消息成功发送到消息队列中。

实现方法:在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息队列中,若转移消息成功则删除消息表中的数据,否则继续重传。

接收端的可靠性

接收端能够从消息队列成功消费一次消息。

两种实现方法:

  • 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
  • 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号
相关文章
|
7月前
|
消息中间件 大数据 Java
什么是消息队列
什么是消息队列
79 0
|
消息中间件 存储 数据可视化
消息队列使用的四种场景介绍(一)
消息队列使用的四种场景介绍
150 0
|
7月前
|
消息中间件 微服务
消息队列的适用场景
消息队列的适用场景
79 0
|
7月前
|
消息中间件 负载均衡 数据挖掘
以12306讲解为什么要使用消息队列
以12306讲解为什么要使用消息队列
82 0
|
消息中间件 Kafka Apache
浅谈消息队列
消息队列的应用场景十分广泛,目前不少公司都在使用,主流的消息中间件有ActiveMQ,RabbitMQ,RocketMQ,ZeroMQ,Kafka等,ActiveMQ是最老牌的MQ,它是Apache的开源项目。
87 0
|
消息中间件 分布式计算 Hadoop
在实际应用中使用消息队列
在实际应用中使用消息队列
118 2
|
消息中间件 负载均衡 Java
什么是优秀的消息队列
简述消息队列,优秀的消息队列的特质及RoketMQ
|
消息中间件 存储 弹性计算
消息队列详解与应用
消息队列详解与应用
180 0
|
消息中间件 存储 缓存
消息队列(三)
消息队列(三)
128 0
消息队列(三)
|
消息中间件 Java 数据库
消息队列(五)
消息队列(五)
169 0
消息队列(五)