论消息队列在分布式系统的重要性

原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com

举例说事


提高系统运行效率,从应用程序通信做起。当前流行的互联网平台由多个分布式应用程序串连,它们就像流水线一样处理数据,产能的高低受制于流水线的运转速度。以前人们使用扫描数据库的方式来交互,即承担流水线职责是数据库,显然数据库应该承担的是仓库职责。每个生产环节都不停的跑到仓库去询问,有没有它要加工的产品,仓库的压力可想而知,生产效率可想而知。没有工厂会这样运行,但你的项目就这样干过。

我们需要在各应用程序间建立有效的通信机制来承担流水线的职责,去掉轮询将会有效降低数据库的压力。轮询带来的弊端有:

1. 硬件资源投入随着用户的增加成比例上升。工厂要生产更多的商品,厂长就得增加更多的仓库来服务,否则仓库会由于压力太大而崩溃。但由于流水线本身的运转速度不够,投入产出比太低。

2. 稳定性不足,可靠性不够。订单多的时候仓库忙不过来,没订单的时候仓库也没闲着,尽管这时候仓库里没货也有很多人来问。同时,为了防止不同流水线拿错商品,仓库还要做好登记,标明哪个商品在哪条流水线生产。受制于此,产能极易受到波动,一点小小的冲击可能造成灾难性的后果。

3. 结构复杂,维护困难,难以满足灵活多变的业务需求。某天市场部门收到新产品的订单,需要培训新的生产工人,仓库也需要为此做出改变,并增加更多的仓库,牵一发动全身,难以按时交货。好不容易顶住压力完成交货,却由于质量不高客户怨声载道。新产品市场反应不好,不再有订单需要生产,刚投入的资源需要全部收回。笨重的生产流程难以适应市场需求,我们需要灵活、高效、可靠的生产线。

需要做出改变



  如何能抛弃轮询的机制,让信息高效传递呢? 数据量大,实时性要求高是互联网系统的重要特点,技术团队需要有所创新和改变,敢于直面用户需求。

如果各应用程序依靠轮询数据库来传递消息,模块A做完后将数据写入数据库,模块B通过轮询数据库来确定模块A已经完成,它看起来就像这样:


  我们想要的结果是下图这样, 但数据库不能做到。因为数据库顾名思义就是保存数据的地方,消息通信不是它的职责。
      
  有没有可能让信息主动传递呢?如果不用数据库呢?如果使用消息呢?YES,它就是我们想要的。
     

  如此调整之后将有效降低数据库的负载,结构优雅高效,提高了稳定性,降低无谓的资源消耗。调整后各组件职责更为明确,做组件擅长的事情。数据库负责持久化数据、Redis负责缓存热数据、MQ负责在应用程序间传递消息。

流水线上一环节生产的半成品直接交给下一环节再加工,提高了工人效率,解放了仓库保管员,市场部不再抱怨生产部了,这才是真正的流水线。

时间: 2024-09-28 23:06:03

论消息队列在分布式系统的重要性的相关文章

第十一章 企业项目开发--消息队列activemq

注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC的一种手段. 1.消息队列的基本使用流程 假设: 我们有这样一个需求,当每注册一个admin的之后,就写一条日志log数据到数据库. 分析: 在实际中,我们是不会把日志直接写入数据库的,因为日志数据通常是庞大的,而且日志的产生是频繁的,如果我们使用数据库存储日志,哪怕是使用异步存储,也是极耗性能的.

初识中间件之消息队列

初识中间件之消息队列 测试那点事儿 测试那点事儿 初识中间件之消息队列 1 消息队列概述 消息队列是分布式系统中的重要组件,主要解决应用耦合,异步消息,流量削锋等问题,以实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统中不可缺少的中间件. 目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等,比如我之前用过的RabbitMQ以及kafka. 2 消息队列应用场景 在实际应用中,消息队列常用于异步处理.应用解耦.流量削锋

消息队列常用应用场景介绍

消息队列作为分布式系统中重要的组件,可以解决应用耦合,异步消息,流量削锋等系列问题 实现高性能,高可用,可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景. 1 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信.传统的做法有两种 1.串行的方式:2.并行方式 (1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信.以上三个任

【MQ】消息队列及常见MQ比较

一.什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰.降低系统耦合性.目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列. 另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的.比如生产者发送消息1,2,3...对于消费者就会按照1,2,3..

Spring Boot:使用Rabbit MQ消息队列

综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息,而消息队列就是在消息的传输过程中保存消息的容器,你可以简单的把消息队列理解为类似快递柜,快递员(消息发布者)往快递柜(消息队列)投递物件(消息),接受者(消息订阅者)从快递柜(消息队列)接收物件(消息),当然消息队列往往还包含一些特定的消息传递和接收机制. 消息队列作为分布式系

新手也能看懂,消息队列其实很简单

消息队列其实很简单 “RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,我们常常听到消息队列这个关键词.我也在我的多篇文章中提到了这个概念.可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论.如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你打开消息队列大门的一板砖. 一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当

中间件 | mq消息队列解说

消息队列 1.1 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰.降低系统耦合性.目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ. 1.2 为什么要用消息队列 使用消息队列主要有两点好处: 1.通过异步处理提高系统性能(削峰.减少响应所需时间; 2.降低系统耦合性.[结合你自己的项目来回答] 1.2.1 通过

关于消息队列的技术选型

https://cloud.tencent.com/developer/article/1006035 导语 : 消息队列是分布式系统中重要的组件,在很多生产环境如商品抢购等需要控制并发量的场景下都需要用到.最近组内需要做流水server的选型升级,这里对消息队列及常见的消息队列进行了一次调研,整理了相关资料,分享给大家. 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制

消息队列基础

什么是消息队列? 就是消息的传输过程中保存消息的容器. 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰.降低系统耦合性. 1.异步处理提高系统性能(削峰.减少响应所需要的时间) 不使用消息队列: 在不使用消息队列时,用户的请求数据直接写入数据库,在高并发情况下,数据库的数据剧增,使得响应速度慢. 使用消息队列: 使用了消息队列,用户的请求发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库.响应速度得到大幅改善 消息队列具