消息队列介绍下

简介: 《基础》

一、消息模型

点对点

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


发布/订阅

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


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

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


二、使用场景

异步处理

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

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

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

流量削锋

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

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

应用解耦

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

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

三、可靠性

发送端的可靠性

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

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

接收端的可靠性

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

两种实现方法:

  • 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
  • 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号
相关文章
|
网络协议 关系型数据库 MySQL
网络编程01 常见名词的一些解释
网络编程01 常见名词的一些解释
|
11月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
270 10
请拥有edu邮箱的同学来领取专(免)属(费)GPU!
300小时免费GPU等你来领!魔搭GPU资源福利社,为你注入动力!
|
SQL 关系型数据库 MySQL
MYSQL数据库3
MYSQL数据库3
219 0
|
关系型数据库 MySQL 开发工具
【Azure 应用服务】备份网站时由于文件太大了,导致应用服务备份失败。如何解决?
【Azure 应用服务】备份网站时由于文件太大了,导致应用服务备份失败。如何解决?
118 0
|
安全 Linux 网络安全
CentOS7下搭建vsftpd服务器(本地用户模式)
CentOS7下搭建vsftpd服务器(本地用户模式)
714 0
CentOS7下搭建vsftpd服务器(本地用户模式)
|
SQL Oracle 关系型数据库
数据泵避免个别表数据的导出
对于数据泵EXPDP/IMPDP而言,功能比普通EXP/IMP功能要强的多,因此也可以实现一些普通导出导入工具很难完成的工作。     比如今天碰到的这个问题,要导出一些表,但是其中个别表只导出结构而不导出数据。
1025 0
|
Java
java图形用户界面(登录界面)
java图形用户界面(登录界面)
187 0
|
JSON Java 测试技术
《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(14)
《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(14)
194 0
|
消息中间件 缓存 NoSQL
Redis还可以做哪些事?
Redis还可以做哪些事?
151 0