消息队列基础

什么是消息队列?

就是消息的传输过程中保存消息的容器。 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

1.异步处理提高系统性能(削峰、减少响应所需要的时间)

不使用消息队列:

在不使用消息队列时,用户的请求数据直接写入数据库,在高并发情况下,数据库的数据剧增,使得响应速度慢。

使用消息队列:

使用了消息队列,用户的请求发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。响应速度得到大幅改善

  • 消息队列具有很好的削峰功能-即异步处理功能,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
  • 举例:在电子商务一些秒杀、促销活动中,合理使用消息 队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。
  • 因为在请求在发送给消息队列后就返回给用户了,但是请求数据的后续业务校验,写数据库等操作可能失败。因此使用消息队列进行异步处理后,需要适当修改业务流程进行配合。
  • 比如:用户在提交订单之后,订单数据写入消息队列,这个时候不能直接返回用户订单提交成功,需要在消息队列的消费者进程真正处理完该订单,再通过邮件通知用户订单成功。

2.降低系统耦合性

可以使模块直接不直接调用,那么新增模块或者修改模块就对其他模块影响较小,可扩展性更好

消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送 至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该 消息从何而来。

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

使用消息队列带来的一些问题

  • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或 者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
  • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺 序性等等问题!
  • 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万 一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!

原文地址:https://www.cnblogs.com/programmerzx/p/12324578.html

时间: 2024-11-02 04:35:29

消息队列基础的相关文章

Linux消息队列基础

消息队列基本概念 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限与本机) 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 管道 vs. 消息队列: 管道: 流管道          消息: 有边界 先进先出            可以后进入.先出来 消息队列大小三大限制

POSIX 消息队列基础知识复习,以及相关例程

1.1        Posix消息队列 1.1.1       消息队列的创建和删除 1.1.1.1     mq_open( ) #include<mqueue.h> mqd_tmq_open( const char *name, int flag ) mqd_t mq_open( const char *name, int flag, mode_t mode, mq_attrattr ) 创建或获取一个消息队列.成功返回消息队列描述符:失败返回-1. 参数name指定与消息队列相关联的名

.Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理系统.相信大家对这两个肯定都已经很熟悉了,在开发过程中,这两个组件扮演了不可或缺的角色: 消息队列帮助我们进行 ”解耦“.”异步“.”削峰“ 定时任务帮助我们进行 "后台".”监控".“补偿" 定时任务调度系统大家都介绍过很多次了,园子里的很多文章我也都拜读过,我相信大

消息队列高手课

<消息队列高手课>从源码角度全面解析 MQ 的设计与实现 消息队列中间件的使用并不复杂,但如果你对消息队列不熟悉,很难构建出健壮.稳定并且高性能的企业级系统,你会面临很多实际问题: 如何选择最适合系统的消息队列产品? 如何保证消息不重复.不丢失? 如何做到水平扩展? 如果你掌握了消息队列的底层技术,无论使用哪种消息队列产品,你都可以从原理层面来分析问题,再简单看一下它的 API 和相关配置项,就能很快知道该如何配置消息队列,写出高性能并且可靠的程序. 1.基础篇 以讲解消息队列的使用方法和最佳

C#消息队列(MQ)零基础从入门到实战演练

一.课程介绍 如果您从工作中之听过但未有接触过消息对队列(MQ),如果你接触过一点关于MQ的知识,如果没有这么的多如果的话......,那么阿笨将通过本次<C#消息队列零基础从入门到实战演练>分享课让您对消息队列有一个实质性的了解和认识,达到实际的灵活贯通和运用.本次分享课您将学习到以下知识点: 1.微软MSMQ的基本使用技能以及MSMQ在WCF技术中的运用. 2.企业级RabbitMQ消息队列的两种消费模式(生产消费和发布订阅)的介绍和使用. 3.如何实现RabbitMQ客户端(Client

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re

【c#】队列(Queue)和MSMQ(消息队列)的基础使用

原文:[c#]队列(Queue)和MSMQ(消息队列)的基础使用 首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非常的好理解. 可以看下官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.queue?view=netframework-4.7.2 示例代码 我这里

消息队列之kafka(基础介绍)

一.关于JMS 1. JMS 的基础 ??JMS是Java提供的一套技术规范.即Java消息服务(Java message service).应用程序接口.是一个Java平台中关于面向消息中间件的API.用于在两个应用程序之间或者分布式系统中发送消息,进行异步通信.Java消息服务是一个与具体平台无关的API.??用来异构系统集成通信,缓解系统瓶颈. 提高系统的伸缩性.增强系统用户体验.使得系统模块化和组件化变得可行并更加灵活.JAVA2EE十三大规范:https://blog.csdn.net

ASP.NET Core消息队列RabbitMQ基础入门实战演练

一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不是零基础教学,课程内容的侧重点是讲解的RabbitMQ的最实用.最简单的实战运用场景:Publish/Subscrib(发布/订阅)模式,发送端发送消息,单个接收端接收处理消息. 学完本次"是猴子都看的懂的消息队列RabbitMQ实战课程"后,阿笨带直接让你也能如此优雅简单的上手使用Rab