案例

有一天,产品跑来说:“我们要做一个用户注册功能,需要在用户注册成功后给用户发一封成功邮件。”

小明(攻城狮):“好,需求很明确了。” 不就提供一个注册接口,保存用户信息,同时发起邮件调用,待邮件发送成功后,返回用户操作成功。没一会功夫,代码就写完了。验证功能没问题后,就发布上线了。

线上正常运行了一段时间,产品匆匆地跑来说:“你做的功能不行啊,运营反馈注册操作响应太慢,已经有好多用户流失了。”

小明听得一身冷汗,赶紧回去改。他发现,原先的以单线程同步阻塞的方式进行邮件发送,确实存在问题。这次,他利用了 JAVA 多线程的特性,另起线程进行邮件发送,主线程直接返回保存结果。测试通过后,赶紧发布上线。小明心想,这下总没问题了吧。

没过多久,产品又跑来了,他说:“现在,注册操作响应是快多了。但是又有新的问题了,有用户反应,邮件收不到。能否在发送邮件时,保存一下发送的结果,对于发送失败的,进行补发。”

小明一听,哎,又得熬夜加班了。产品看他一脸苦逼的样子,忙说:“邮件服务这块,别的团队都已经做好了,你不用再自己搞了,直接用他们的服务。”

小明赶紧去和邮件团队沟通,谁知他们的服务根本就不对外开放。这下小明可开始犯愁了,明知道有这么一个服务,可是偏偏又调用不了。

邮件团队的人说,“看你愁的,我给你提供了一个类似邮局信箱的东西,你往这信箱里写上你要发送的消息,以及我们约定的地址。之后你就不用再操心了,我们自然能从约定的地址中取得消息,进行邮件的相应操作。”

后来,小明才知道,这就是外界广为流传的消息队列。你不用知道具体的服务在哪,如何调用。你要做的只是将该发送的消息,向你们约定好的地址进行发送,你的任务就完成了。对应的服务自然能监听到你发送的消息,进行后续的操作。这就是消息队列最大的特点,将同步操作转为异步处理,将多服务共同操作转为职责单一的单服务操作,做到了服务间的解耦

哈哈,这下能高枕无忧了。太年轻,哪有万无一失的技术啊~

不久的一天,你会发现所有业务都替换了邮件发送的方式,统一使用了消息队列来进行发送。这下仅仅一个邮件服务模块,难以承受业务方源源不断的消息,大量的消息堆积在了队列中。这就需要更多的消费者(邮件服务)来共同处理队列中的消息,即所谓的分布式消息处理

未完待续。。。

总结

定义

有了上面的基础,再看非常官方的解释应该也能理解了。

消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。 ——维基百科

名词解释

解释还是太官方了,我们来看一个最简单的架构模型:

[图片上传失败...(image-f274b2-1513223931791)]

  • Producer:消息生产者,负责产生和发送消息到 Broker;
  • Broker:消息处理中心。负责消息存储、确认、重试等,一般其中会包含多个 queue;
  • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理;

特性

异步性

将耗时的同步操作,通过以发送消息的方式,进行了异步化处理。减少了同步等待的时间。

松耦合

消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。

分布式

通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性(当然消息队列本身也可以做成分布式集群)。

可靠性

消息队列一般会把接收到的消息存储到本地硬盘上(当消息被处理完之后,存储信息根据不同的消息队列实现,有可能将其删除),这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。


原文:https://github.com/jasonGeng88/blog

转载于:https://juejin.im/post/5aa7705d6fb9a028bb18a995

一个故事告诉你什么是消息队列相关推荐

  1. 一个故事告诉你,学习编程是否需要天赋?

    学习编程需要天赋吗? 一个故事告诉你,学习编程是否需要天赋? 1.你适合学习编程吗? 有的时候我也会怀疑我自己,我到底适不适合学习编程呢?感觉身边的同龄人都好牛X: 1.985/211 2.阿里/百度 ...

  2. mysql 消息队列_一个简单的 MySQL 批量事务消息队列

    基于 MySQL 的批量事务消息队列 消息队列本质上是一个存储介质,通常是链表结构,不同的进程或线程可以向消息队列中写入或读取消息.消息队列的使用场景有很多,比如异步处理任务.应用解耦.流量削锋等等. ...

  3. 一个故事告诉你,数据分析如何给企业带来价值

    引言:这两年,大数据把"数据分析"炒火了.很多企业都开始重视并着手业务数据分析,并视为信息化建设的下一个大目标.以前收集.处理.分析数据可能是IT部门和数据库员的专属,现在很多业务 ...

  4. JAVA面试题:你怎么设计一个消息队列?

    1 面试题 写一个消息队列,你如何进行架构设计,说一下你的思路! 2 考点分析 一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个mq的架构原理 ...

  5. 七万字,151张图,通宵整理消息队列核心知识点总结!这次彻底掌握MQ!

    前言 本文主要涵盖了关于消息队列的大部分核心知识点,涉及的消息队列有 RocketMQ.Kafka. 本文很长,所有内容都为博主原创,纯手打,如果觉得不错的话,来个点赞评论收藏三连呀! 之后还会有迭代 ...

  6. windows消息和消息队列详解

     windows消息和消息队列 与基于MS - DOS的应用程序不同,Windows的应用程序是事件(消息)驱动的.它们不会显式地调用函数(如C运行时库调用)来获取输入,而是等待windows向它们传 ...

  7. 知识整理——消息队列

    注:以下全部内容为从网上摘抄整理而来,仅用于个人知识储备 什么是消息队列 消息队列,一般我们会简称它为MQ(Message Queue) 我们先不管消息(Message)这个词,来看看队列(Queue ...

  8. 消息队列,高并发的救火员

    文章目录 一.前言 二.消息队列三功能 2.1 异步通信 2.2 服务解耦 2.3 流量控制 三.消息队列的两种模型 3.1 队列模型 3.2 发布/订阅模型 3.3 小结 四.消息队列的三个独有设置 ...

  9. 消息队列超详解(以RabbitMQ和Kafka为例,为何使用消息队列、优缺点、高可用性、问题解决)

    消息队列超详解(以RabbitMQ和Kafka为例) 为什么要用消息队列这个东西? 先说一下消息队列的常见使用场景吧,其实场景有很多,但是比较核心的有3个:解耦.异步.削峰. 解耦:现场画个图来说明一 ...

最新文章

  1. 人脸识别经典算法一:特征脸方法(Eigenface)
  2. @Data 注解对类静态字段, 无效
  3. react-router使用教程
  4. 牛客-十二桥问题【最短路,状压dp】
  5. MongoDB的查询语法和SQL的SELECT语法做对比
  6. 理解CSRF(跨站请求伪造)
  7. error LNK2019: unresolved external symbol “__declspec(dllimport) public: __thiscall 的解决方案
  8. 利用Python连接MySQL将表单转化为DataFrame
  9. Perl语言程序设计_输入与输出
  10. 软件工程师成长为架构师必备的十项技能
  11. 杀戮尖塔 地图生成器参考
  12. stata 导出 相关系数表_【BBtime】戏说会计论文---stata简单实操
  13. 系统自带恶意软件清理助手
  14. 【Spring】注解驱动开发
  15. bzoj 4484: [Jsoi2015]最小表示 拓扑排序+bitset
  16. 为什么普遍自学能力不足
  17. Linux启动流程详解
  18. css样式 向下补白,CSS尺寸与补白
  19. SecureCRT 如何快速执行常用命令
  20. 大一C语言入门到底怎么学

热门文章

  1. elasticsearch服务相关脚本
  2. 在Shell中,“$“和““的作用
  3. HTML中,TextArea的换行问题(添加wrap属性)。
  4. VS2010解决闪退的方法
  5. Mysql插入中文的字段内容时乱码的解决方法
  6. C# 让你解决方案乱七八糟的DLL放入指定文件夹
  7. 缓存雪崩,缓存穿透解决方案
  8. php抛出异常Exception和\Exception使用区别
  9. vue+sentry 前端异常日志监控
  10. Maven的安装和使用