首页 > 其他分享 >消息队列 基础概念

消息队列 基础概念

时间:2022-10-06 16:55:32浏览次数:53  
标签:异步 订单 队列 系统 概念 MQ 消息

消息队列基本概念

什么是消息队列

异步通讯中间件 : 存放消息的容器。当我们需要使用消息时,取出消息供我们使用。

消息是一种数据结构(当然,对象也可以看做是一种特殊的消息),它包含消费者与生产者双方都能识别的数据,这些数据需要在不同的进程(机器)之间进行传递,并可能会被多个完全不同的客户端消费。

生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者,仅此而已。本质:一发一存一消费,可以视为一种转发器。

在这里插入图片描述

消息队列的功能

分布式场景下,通过消息传递和消息排队模型,提供系统解耦、异步通信和流量削峰的功能。

场景举例:电商业务中最常见的「订单支付」场景:在订单支付成功后,需要更新订单状态、更新用户积分、通知商家有新订单、更新推荐系统中的用户画像等等。

缺点:系统彼此依赖,耦合性比较高,消息只能同步逐层传递,如果订单比较多,系统的吞吐量就可能不足。

此时引入消息队列:

在这里插入图片描述

引入 MQ 后,订单支付只需要关注它最重要的流程:更新订单状态即可。其他不重要的事情全部交给 MQ 来通知。这便是 MQ 解决的最核心的问题:系统解耦

改造前订单系统依赖 3 个外部系统,改造后仅仅依赖 MQ,而且后续业务再扩展(比如:营销系统打算针对支付用户奖励优惠券),也不涉及订单系统的修改,从而保证了核心流程的稳定性,降低了维护成本

这个改造还带来了另外一个好处:因为 MQ 的引入,更新用户积分、通知商家、更新用户画像这些步骤全部变成了异步执行,能减少订单支付的整体耗时,提升订单系统的吞吐量。这便是 MQ 的另一个典型应用场景:异步通信

除此以外,由于队列能转储消息,对于超出系统承载能力的场景,可以用 MQ 作为 “漏斗” 进行限流保护,即所谓的流量削峰

消息队列与RPC

从MQ 的通信模型来看,可以理解成:两次 RPC + 消息转储。

1、引入 MQ 后,由之前的一次 RPC 变成了现在的两次 RPC,而且生产者只跟队列耦合,它根本无需知道消费者的存在。
2、多了一个中间节点「队列」进行消息转储,相当于将同步变成了异步。

在这里插入图片描述

常见类型

点对点模型

也叫消息队列模型。如果拿上面那个“民间版”的定义来说,那么系统A发送的消息只能被系统B接收,其他任何系统都不能读取A发送的消息。日常生活的例子比如电话客服就属于这种模型:同一个客户呼入电话只能被一位客服人员处理,第二个客服人员不能为该客户服务。

发布/订阅模型

主题(Topic) 发布者(Publisher)订阅者(Subscriber)。

和点对点模型不同的是,这个模型可能存在多个发布者向相同的主题发送消息,而订阅者也可能存在多个,它们都能接收到相同主题的消息。生活中的报纸订阅就是一种典型的发布/订阅模型。

消息队列设计

(待定,积累更多实际经验补充)

功能性需求:发消息、存消息、消费消息

非功能性需求:高性能、高可用、高扩展

标签:异步,订单,队列,系统,概念,MQ,消息
From: https://www.cnblogs.com/CassieLeeH/p/16757966.html

相关文章

  • STL优先队列
    STL大法好STL优先队列就是一个封装的堆,学会熟练运用,免去手写堆的麻烦其实是不会自己写格式:priority_queue<类型,vector<类型>,比较类>q;优先队列的源码比较奇特......
  • python基础--基本概念
    1.脚本的文件格式  脚本名.py  eg:hello.py2.脚本结构  大概三部分,脚本头+导入部分+业务模块  每一块都是非必须的,按需填写即可;    为了书写规范,一般......
  • 新概念第一册51~60单元学习笔记
    Chapterfifty-one:ApleasantclimateDialogueWheredoucomefrom?#相似句whereareyoufromIcomefromGreece#what'ssb/sthlike句式What'stheclimatelikein......
  • 项目管理、项目质量概念的理解
     项目管理与软件开发的质量、效率、最终成果息息相关。   软件管理就是一位具有俯瞰全局意识的优秀软件管理人员领导和协调整个项目。软件项目的管理工作分位四个......
  • 代码随想录day11 | 232.用栈实现队列 225.队列实现栈 20.有效的括号 1047. 删除字符
    232.用栈实现队列题目|文章1.使用两个栈(修改输出)思路1.使用两个栈,用一个栈输入数据,用另一个栈输出数据2.当输出栈为空时,将输入栈的数据转移到输出栈中实现点击查看......
  • kafka 通过代码对队列进行操作
    StringbootstrapServers="192.163.0.1:9092";KafkaAdminkafkaAdmin;AdminClientadminClient;/***项目启动调用或者通过@Bean注入*/......
  • 新概念第一册41~50单元学习笔记
    Chapterforty-one:Penny'sbagDialogueIsthatbagheavy,Penny?Notvery#口语回答常把主谓宾省略,只剩下一个副词、一个副词词组或一个动词不定式短语等,这里省略主语Itis......
  • 19-RabbitMQ消息一致性问题
    消息一致性问题在使用rabbitmq中,消息的一致性是非常重要的一个话题。在数据一致性方面,发送者发送消息出来,在数据一致性的要求下,我们通常认为必须达到以下条件broke......
  • 21-RabbitMQ延迟队列插件
    RabbitMQ延迟队列插件下载官网https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases我用的是3.10.7的RabbitMQ,但是官网没有这么新版本的,只......
  • 16-RabbitMQ高级特性-消费端的消息ACK与重回队列
    消费端的消息ACK与重回队列消费端的手工ACK和NACKACK分为自动和手动消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕......