首页 > 其他分享 >消息队列-知识点

消息队列-知识点

时间:2024-11-22 10:44:35浏览次数:3  
标签:知识点 异步 订阅 队列 处理 RPC 消息

消息队列概念:一个存放消息的容器,当系统需要使用消息的时候,直接从容器中按照先进先出的顺序,取出消息供系统使用。

参与消息传递的双方称为 生产者消费者 ,生产者负责发送消息,消费者负责处理消息。

作用

  1. 异步处理
  2. 削峰 / 限流
  3. 降低系统耦合性

异步处理

将用户请求中包含的耗时操作,通过消息队列实现异步处理,将对应的消息发送到消息队列后,就立即返回结果,随后,系统再对消息进行消费。

用户请求数据写入消息队列之后就立即返回给用户,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此,使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。

削峰 / 限流

先将短时间高并发产生的事务消息存储在消息队列中,后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。

举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。

降低系统耦合性

生产者(客户端)发送消息到消息队列中去,消费者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费。

消息队列使用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 从上图可以看到消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计

例如,商城系统分为用户、订单、财务、仓储、消息通知、物流、风控等多个服务。用户在完成下单后,需要调用财务(扣款)、仓储(库存管理)、物流(发货)、消息通知(通知用户发货)、风控(风险评估)等服务。使用消息队列后,下单操作和后续的扣款、发货、通知等操作就解耦了,下单完成发送一个消息到消息队列,需要用到的地方去订阅这个消息进行消息即可。

另外,为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

备注: 不要认为消息队列只能利用发布-订阅模式工作,只不过在解耦这个特定业务环境下是使用发布-订阅模式的。除了发布-订阅模式,还有点对点订阅模式(一个消息只有一个消费者),比较常用的是发布-订阅模式。

流数据处理

针对分布式系统产生的海量数据,如业务日志、监控数据、用户行为等,消息队列可以实现或批量收集这些数据,并将其导入到大数据引擎中,实现高效的流数据管理与处理。

消息队列带来的问题

  • 系统可用性降低: 系统需考虑消息丢失或 MQ 挂掉等情况。
  • 系统复杂性提高: 加入 MQ 之后,系统需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等问题!
  • 一致性问题: 消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度,但是,如果消息的真正消费者并没有正确消费消息,就会导致数据不一致的情况!!

APQP和JMS

  • AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。在 Java 体系中,多个 client 均可以通过 JMS 进行交互,不需要应用修改代码,但是其对跨平台的支持较差。而 AMQP 天然具有跨平台、跨语言特性。
  • JMS 支持 TextMessageMapMessage 等复杂的消息类型;而 AMQP 仅支持 byte[] 消息类型(复杂的类型可序列化后发送)。
  • 由于 Exchange 提供的路由算法,AMQP 可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。

RPC和消息队列的区别

  • 从用途来看:RPC 主要用来解决两个服务的远程通信问题,不需要了解底层网络的通信机制,通过 RPC 框架,系统可以调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。消息队列主要用来降低系统耦合性、实现任务异步、有效地进行流量削峰。
  • 从通信方式来看:RPC 是双向直接网络通讯,消息队列是单向引入中间载体的网络通讯。
  • 从架构上来看:消息队列需要把消息存储起来,RPC 则没有这个要求,因为前面也说了 RPC 是双向直接网络通讯。
  • 从请求处理的时效性来看:通过 RPC 发出的调用一般会立即被处理,存放在消息队列中的消息并不一定会立即被处理。

分布式消息队列技术

  • RabbitMQ 在吞吐量方面虽然稍逊于 Kafka、RocketMQ 和 Pulsar,但是由于它基于 Erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 Erlang 开发,所以国内很少有公司有实力做 Erlang 源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这几种消息队列中,RabbitMQ 或许是你的首选。
  • RocketMQ阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的 MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。
  • Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 Kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。Kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。

标签:知识点,异步,订阅,队列,处理,RPC,消息
From: https://blog.csdn.net/m0_74119287/article/details/143952398

相关文章

  • 队列
    前言先进先出,没啥好说的STLqueue#include<bits/stdc++.h>usingnamespacestd;intmain(){queue<int>q;q.push(12);//12进入队列q.push(13);//13进入队列q.push(123);//123进入队列cout<<......
  • 【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
    ......
  • 计算机网络:物理层知识点计习题
    网课资源:湖科大教书匠1、物理层概述习题11某网络在物理层规定,信号的电平用+10V+15V表示二进制0,用-10V-15V表示二进制1,电线长度限于15m以内,这体现了物理层接口的A.机械特性B.功能特性C.电气特性D.规程特性2当描述一个物理层接口引脚在处于高电平时的含义时,......
  • 计算机网络:概述知识点及习题练习
    网课资源:湖科大教书匠1、因特网网络之间需要路由器进行互联,互联网是网络的网络,因特网是最大的互联网,连接到网络的设备称为主机,一般不叫路由器为主机。因特网发展:ARPNET->三级结构因特网(NSFNET)->多层次ISP结构的因特网。1983,TCP/IP诞生,因特网诞生时间,因为它采用TCP/IP......
  • 【Python GUI 编程】tkinter :消息框、对话框
    在本教程中,将介绍如何使用tkinter的messagebox模块、filedialog模块、colorchooser模块显示各种消息框、对话框。在使用Tkinter开发应用程序时,需要向用户发送提示、警告、错误信息。这些场景,可以使用messagebox模块中的以下方法实现:showinfo():提示信息。showerror()......
  • review-消息中间件MQ
    RabbitMQRabbitMQ,作为当今流行的开源消息代理软件,以其卓越的可靠性、灵活性和易用性在微服务架构和分布式系统中扮演着至关重要的角色。它不仅能够确保消息在不同系统组件间的高效传递,还能通过其高级消息队列协议(AMQP)支持复杂的路由功能,从而满足各种消息分发场景。RabbitM......
  • 知识点归纳 | 计算机领域学术会议的级别
    在计算机领域,学术会议通常根据其影响力、认可度和投稿难度分为几个档次。虽然具体划分可能因学科和地区而异,一般可以将计算机领域的学术会议分为以下几类:顶级会议(Top-tierConferences)A+级会议:这些是最高水平的会议,通常是该领域最有影响力和认可度的会议。论文的质量要求极......
  • hook 钩子 拦截消息
    在winproc里面别传给最后return那个proc啥函数传,系统就接不到了return函数这个写法是两步计算是先计算函数然后返回值被return接到然后最终返回的是函数计算的结果把returnproc改成return0  这样写是不传给后续进程管理器的排序列表里面的后面还没有执行到......
  • CTFshow渗透知识点
    1.robot.txtRobots是一个协议,全称为“网络爬虫协议”,也称爬虫协议、机器人协议等。网站通过Robots协议告诉搜索引擎哪些页面可以访问,哪些不可以访问。使用方法:在浏览器的网址搜索框中,输入根域名,再输入/robots.txt即可博客:Robots.txt在渗透测试中的利用_robots.txt利用-CSDN博......
  • 用Redis实现去重的任务队列的多种方案
    前情提要:一点小小的不完善的方案的思考和设计,不对的地方或是更好的方案欢迎大佬们在评论区讨论~需求背景:在Redis里使用List数据结构做任务队列,但是有的时候任务可能会重复添加,所以需要进行去重。队列需要有优先级,尽量减少Redis操作次数。尝试方案目前能够想到的方案......