消息队列

消息队列

消息队列

一、消息模型

点对点

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

在这里插入图片描述

发布/订阅

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

消息队列

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

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

在这里插入图片描述

二、使用场景

异步处理

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

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

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

流量削锋

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

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

应用解耦

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

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

三、可靠性

发送端的可靠性

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

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

接收端的可靠性

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

两种实现方法:

  • 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
  • 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。

参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2789.html原文链接:https://javaforall.net

(0)
上一篇 2021年3月12日 下午10:44
下一篇 2021年3月12日 下午10:44


相关推荐

  • python 100例之例三

    python 100例之例三题目 一个整数 它加上 100 后是一个完全平方数 再加上 168 又是一个完全平方数 请问该数是多少 解题思路 此题表面信息量少之又少 看上去很不好解 并且只是说一个整数 并没有给边界 所以自定义边界值为 1000 设该数字为 x 继续阅题 貌似突破口只有完全平方数 回忆数学中完全平方数的特性 看起来也没有什么明显的突破口 再思考 既然是完全平方数 那么是否可以判断 sqrt 后的结果为 int 类型呢 查阅

    2026年3月16日
    2
  • Django组件_tuxedo中间件

    Django组件_tuxedo中间件什么是Django中间件中间件(Middleware)是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改

    2022年8月7日
    9
  • 无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪

    无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪前言:随着深度学习近几年来的突破性进展,无人驾驶汽车也在这些年开始不断向商用化推进。很显然,无人驾驶汽车已经不是遥不可及的“未来技术”了,未来10年必将成为一个巨大的市场。本系列博客将围绕当前使用的最先进的无人驾驶汽车相关技术,一步一步地带领大家学习并且掌握无人驾驶系统的每一个模块的理论基础和实现细节。由于无人驾驶汽车系统构成及其复杂,本系列博客仅讨论软件部分的内容,关于汽车,传感器和底层的硬件,不

    2022年6月18日
    29
  • 还用不好即梦AI参考图,请看过来,教你稳稳拿捏!

    还用不好即梦AI参考图,请看过来,教你稳稳拿捏!

    2026年3月12日
    1
  • win7开机显示未能连接服务器,Win7开机提示“未能连接一个windows服务”的解决方法…

    win7开机显示未能连接服务器,Win7开机提示“未能连接一个windows服务”的解决方法…最近有一位Win7系统用户,开机之后系统出现提示“未能连接一个windows服务”,上面显示Windows无法连接到SystemEventNotificationService服务,肯定是服务项出现了问题。那么我们该如何解决这个问题?下面IT百科分享一下Win7开机提示“未能连接一个windows服务”的解决方法。未能连接一个windows服务解决方法:1、在Win7系统上,使用Win+R键…

    2022年5月15日
    109
  • C语言实现Socket简单通信

    C语言实现Socket简单通信环境是 linux 不过应该没什么影响 因为只用到了 socket 的基本用法 没有涉及 pthread 等 分为服务器端和客户端 服务器端监听端口发来的请求 收到后向客户端发送一个 HelloWorld 客户机负责发送消息并打印收到的 HelloWorld 服务器步骤 建立 socket 绑定 socket 和地址信息 开启监听 收到请求后发送数据 客户端步骤 建立 socket 连接服务器端 接收并

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号