首页 > 其他分享 >为什么要使用消息队列

为什么要使用消息队列

时间:2023-07-06 09:45:09浏览次数:27  
标签:为什么 队列 系统 RabbitMQ MQ 消息 支持

为什么要使用消息队列(MQ)?可以列举一些MQ的优点吗?

使用消息队列(MQ)有几个主要的优点:

  1. 解耦:通过使用消息队列,系统之间可以实现解耦。一个系统产生的数据可以通过消息队列发布,其他系统可以订阅该消息并消费,而无需直接与数据产生系统进行交互。这种解耦方式降低了系统之间的依赖性,减少了代码维护成本。

  2. 异步:消息队列支持异步通信模式,可以提高系统的响应速度。当一个系统调用其他系统的API时,同步调用需要等待每个依赖系统逐一完成调用才能返回结果,耗时较长。通过使用消息队列进行异步化,系统可以将调用请求发送到队列中,然后继续处理其他任务,从而大幅缩短调用时间,提高高延时接口的速度。

  3. 削峰:在高峰期,大量请求涌入系统时,如果直接将请求发送到数据库等后端存储,可能会导致系统崩溃。通过使用消息队列,系统可以将请求先写入队列中,在低谷时逐个消费请求,从而避免系统崩溃。尽管消息队列中会积压大量请求,但在低谷期可以逐渐消费掉这些请求。

  4. 分布式一致性:消息队列可以支持分布式系统中的一致性需求。通过使用合适的消息队列,系统可以保证各个模块执行的结果一致性,避免不同模块之间的数据不一致问题。
  5. 点对点消费:消息队列支持点对点的消息消费模式,可以确保消息只被一个消费者接收和处理。这对于一些需要确保消息只被一个接收者处理的场景非常有用。

然而,引入消息队列也可能带来一些问题:

1.可用性降低:如果消息队列出现问题,可能导致生产者无法发送消息,消费者无法消费消息,从而导致整个系统不可用。

2.复杂性增加:使用消息队列需要解决一些复杂性问题,例如消息的幂等性、可靠性、顺序性等。如果不正确处理这些问题,可能会导致数据重复、丢失或顺序错乱等一致性问题。

综上所述,根据不同的业务需求和技术实力,选择适合的消息队列是非常重要的。常见的消息队列包括 ActiveMQ、RabbitMQ、RocketMQ和Kafka。每种消息队列都有其优缺点,如单机吞吐量、时效性、可用性、消息可靠性和功能支持等方面有所差异。因此,在选择消息队列时,需要根据实际情况综合考虑这些因素。 对于中小型公司来说,技术实力一般,业务挑战不高的情况下,使用RabbitMQ是一个不错的选择。RabbitMQ是一个稳定且活跃的开源项目,有活跃的开源社区支持。 对于大型公司来说,如果具备较强的基础架构研发实力,可以考虑使用RocketMQ。RocketMQ是阿里巴巴出品的消息队列系统,具有较高的可用性和消息可靠性。 如果涉及大数据领域的实时计算、日志采集等场景,Kafka是业内标准的选择,具有高吞吐量和强大的功能支持,拥有活跃的开源社区。

介绍一下不同MQ的优缺点呢?

ActiveMQ: 优点:MQ领域的功能非常完备,具备高可用性的主从架构支持。

缺点:单机吞吐量较低,没有经过大规模吞吐量场景验证,社区活跃度也相对较低。

RabbitMQ: 优点:基于Erlang开发,具备并发能力很强、性能很好、延迟很低的特点。MQ功能较为完善,是分布式系统且扩展性较好。拥有稳定的支持和活跃的开源社区。 缺点:Erlang语言限制了Java工程师深入研究和掌控RabbitMQ,对公司而言可能存在不可控的状态。 RocketMQ: 优点:由阿里巴巴出品,具备较高的可用性和分布式架构,支持高吞吐量和消息可靠性。常用于大数据领域的实时数据计算和日志采集等场景。 缺点:尽管已捐赠给Apache,但GitHub上的活跃度相对较低,社区可能存在突然不活跃的风险。

Kafka: 优点:具备高吞吐量和消息可靠性,常用于大数据领域的实时计算和日志采集。Kafka延迟低,支持微秒级的时效性,并具有非常高的可用性和分布式架构。 缺点:相对而言,功能较为简单,主要支持基本MQ功能。

综上所述,对于中小型公司而言,如果技术实力一般且不需要处理高吞吐量场景,推荐使用RabbitMQ。对于大型公司而言,如果具备较强的基础架构研发实力,可以考虑使用RocketMQ。而在大数据领域的实时计算和日志采集等场景中,Kafka是业内的首选,因为它具备高可用性和活跃的开源社区支持

标签:为什么,队列,系统,RabbitMQ,MQ,消息,支持
From: https://www.cnblogs.com/DarylJi/p/17531222.html

相关文章

  • gitflow为什么要单独检出一个release分支?在develop分支上测试不行吗
    在Gitflow工作流中,将release分支从develop分支中单独检出的主要原因是为了在发布之前进行稳定性和功能测试,以确保发布版本的质量。以下是几个原因说明为什么要单独检出release分支进行测试:隔离开发和测试环境:通过将测试从开发环境(develop分支)隔离出来,可以避免测试中......
  • 使用GoEasy快速实现Android原生app中的websocket消息推送
    摘要:GoEasy带来了一项令开发者振奋的消息:全面支持Android原生平台!现在,您可以在Android应用中使用最酷炫的实时通信功能,借助GoEasy轻松实现消息的发送和接收。本文将带您领略GoEasy最新版本的威力,为您的应用增添一抹鲜活的互动色彩。嗨,开发者朋友们!是时候展现您的技术才华,让您的A......
  • 企业为什么需要软件的应用框架?
    软件框架是可用来构建软件的结构。它充当系统的基础,使开发者不必从头开始创建,比如非必要的额外逻辑。框架还类似于模板,你可以对其进行修改并添加某些特性和更高级功能,然后创建许多人可以使用的复杂而普适的项目。软件的应用框架是软件系统的一层抽象,是提供了通用的软件功能,可以通......
  • 延迟队列服务提供对外接口
    延迟队列微服务:redis:list-执行时间<=当前时间   zset-当前时间<执行时间<当前时间+5分钟添加任务:【以防任务数量过大在,一旦服务器挂掉,内存所有的数据都消失了,所以要做数据持久化】添加任务到数据库、符合条件的任务添加到redis【list,zset......
  • 你一定要用这个API管理工具,看完你就知道为什么了
    以下是经常发生在程序员之间的对话:小张:你知道为什么程序员不喜欢写文档?小王:因为代码就是最好的文档啊!谁还需要写那些冗长的说明呢?小张:那你知道为什么程序员也不喜欢别人不写文档吗?小王:当然了!写文档虽然烦人,但对团队合作和项目维护很重要。小张:没错!我们需要养成写文档的好习......
  • SQL 中为什么经常要加NOLOCK?
    刚开始工作的时候,经常听同事说在SQL代码的表后面加上WITH(NOLOCK)会好一些,后来仔细研究测试了一下,终于知道为什么了。那么加与不加到底有什么区别呢?SQL在每次新建一个查询,就相当于创建了一个会话。在不同的查询窗口操作,会影响到其他会话的查询。当某张表正在写数据时,这时候去查......
  • 从事工程、OSPO 或开发者关系领域工作人员为什么一定要会写文档?
    我是Postman开放技术计划办公室的负责人,最近,在一次PostmanOpenTechnologies团队会议上,我提出了一个非常笼统的方向:我们必须成为以文档著称的团队,并需要个人和团队共同记录所有内容。虽然还有更多背景信息,比如我们与产品团队的协作等等,但这也是我给自己以及其他从事工程、OS......
  • 第3章-栈、队列和数组
    3.1栈顺序栈的基本操作#defineMaxSize10typedefstruct{ //栈的顺序存储类型Elemtypedata[MaxSize]; //静态数组存放栈中元素 inttop; //栈顶指针}SqStack;//Sq:sequence--顺序//初始化栈voidInitStack(SqStack&S){S.top=-1; //初始化栈顶指针......
  • 58.类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些?
    58.类成员初始化方式?构造函数的执行顺序?为什么用成员初始化列表会快一些?1.类成员初始化方式1.1初始化方式一:默认时初始化如果类成员没有被显式初始化,将会使用默认初始化。默认初始化指没有提供初始化式的情况下,将使用默认值进行初始化。对于基本数据类型(如整数、浮点数等),默认......
  • 为什么K8s在阿里能成功过?基于K8s的云原生改造实践过程
    导读:本文描述了阿里巴巴在容器管理领域的技术演进历程,解读了为什么K8s最终能够大获成功的原因,以及到今年双11阿里巴巴内部的K8s应用情况。内容着重描述了阿里巴巴基于K8s的云原生改造实践过程的三大能力升级,在对应能力升级过程中沉淀的技术解决方案,以及通过这些能力升级......