消息队列-Message Queue

目前随着互联网的普及以及上网用户的增多,拥有一套 安全稳定低耦合高性能内部通信工具尤为重要。

什么是消息队列?

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

消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。 ——互联网

这些解释都太深奥,我们通过图片来了解一下。

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

可能这个模型还是过于专业,那我们再看一个通俗一点的:

此时有一封信件,加入到队列中,然后接收者从队列中拿出自己的信件,这个队列就好比 邮箱

消息队列 一般作为 应用程序中的中间件。通过提供 消息传递消息排队 模型,它可以在 分布式环境 下提供 应用解耦弹性伸缩冗余存储流量削峰异步通信数据同步 等等功能,其作为 分布式系统架构 中的一个重要组件,有着举足轻重的地位。

消息队列的特点

异步性

消息发送者 可以发送一个消息而无须等待响应。消息发送者 将消息发送到一条 虚拟的通道(主题 或 队列) 上,消息接收者订阅 或是 监听 该通道。一条信息可能最终转发给 一个或多个 消息接收者,这些接收者都无需对 消息发送者 做出 同步回应。整个过程都是 异步的

解耦合

主要体现在如下两点:

  • 发送者和接受者不必了解对方、只需要 确认消息
  • 发送者和接受者 不必同时在线

比如在线交易系统为了保证数据的 最终一致,在 支付系统 处理完成后会把 支付结果 放到 消息中间件 里,通知 订单系统 修改 订单支付状态。两个系统是通过消息中间件解耦的。

分布式

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

可靠性

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

消息队列的传输模式

首先看一个经典的 消息队列的传递服务模型

MOM: Message Oriented Middleware 消息的中间件

消息队列目前有两大分类: 点对点(P2P)

点对点模型 用于 消息生产者消息消费者 之间 点到点 的通信。消息生产者将消息发送到由某个名字标识的特定消费者。这个名字实际上对于消费服务中的一个 队列Queue),在消息传递给消费者之前它被 存储 在这个队列中。队列消息 可以放在 内存 中也可以 持久化,以保证在消息服务出现故障时仍然能够传递消息。

一句话总结:消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息,消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
**

发布/订阅模型(Pub/Sub)

发布者/订阅者 模型支持向一个特定的 消息主题 生产消息。0多个订阅者 可能对接收来自 特定消息主题 的消息感兴趣。

在这种模型下,发布者和订阅者彼此不知道对方,就好比是匿名公告板。这种模式被概况为:多个消费者可以获得消息,在 发布者订阅者 之间存在 时间依赖性。发布者需要建立一个 订阅(subscription),以便能够消费者订阅。订阅者 必须保持 持续的活动状态接收消息

在这种情况下,在订阅者 未连接时,发布的消息将在订阅者 重新连接重新发布,如下图所示:

特性:

  • 每个消息可以有多个订阅者;
  • 客户端只有订阅后才能接收到消息;
  • 持久订阅和非持久订阅。
  • 发布者和订阅者有时间依赖:接受者和发布者只有建立订阅关系才能收到消息;
  • 持久订阅:订阅关系建立后,消息就不会消失,不管订阅者是否都在线;
  • 非持久订阅:订阅者为了接受消息,必须一直在线。 当只有一个订阅者时约等于点对点模式

消息队列应用场景

当你需要使用 消息队列 时,首先需要考虑它的必要性。可以使用消息队列的场景有很多,最常用的几种,是做 应用程序松耦合、异步处理模式、发布与订阅、最终一致性、错峰流控 和 日志缓冲 等。

异步处理

非核心 流程 异步化,减少系统 响应时间,提高 吞吐量。例如:短信通知、终端状态推送、App 推送、用户注册 等。

应用案例

系统解耦

  • 系统之间不是 强耦合的,消息接受者 可以随意增加,而不需要修改 消息发送者的代码。消息发送者 的成功不依赖 消息接受者。
  • 不强依赖 于非本系统的核心流程,对于 非核心流程,可以放到消息队列中让 消息消费者 去按需消费,而 不影响核心主流程

广播

生产者/消费者 模式,只需要关心消息是否 送达队列,至于谁希望订阅和需要消费,是 下游 的事情,无疑极大地减少了开发和联调的工作量。

消息通讯

消息队列一般都内置了 高效的通信机制,因此也可以用于单纯的 消息通讯,比如实现 点对点消息队列 或者 聊天室 等。

消息队列-Message Queue相关推荐

  1. 消息队列(Message Query)的初学习

    消息队列(Message Query)的初学习   摘要:本篇笔记主要记录了对于消息队列概念的初次学习.消息队列的基础知识. 文章目录 消息队列(Message Query)的初学习 1.何为消息? ...

  2. python消息队列模块_day43-python消息队列二-queue模块

    Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...

  3. Linux进程间通信--消息队列(Message queuing)

    今天我们来谈一谈Linux进程间通信的方式之一消息队列 我们先来看看关于消息队列的定义: 1.消息队列是消息的链表,存放在内核中并由消息队列标识符表示. 2.消息队列提供了一个从一个进程向另一个进程发 ...

  4. Linux IPC 进程间通信——消息队列message

    消息队列是消息的连接表,存储在内核中.本实例主要实现消息队列方式进行进程间通信,接收端收到消息之后,立马转发给发送端:发送端发出消息之后,立马监听接收端回馈的消息,实现一个双向通信示例. 一.示例 发 ...

  5. MSMQ(MicroSoft Message Queue,微软消息队列)

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位 ...

  6. 去哪儿网消息队列设计与实现

    去哪儿网近日在GitHub上开源了其内部广泛使用的消息队列(内部代号QMQ),本文从去哪儿网使用消息队列所碰到的各种问题出发探讨去哪儿网消息队列的设计与实现. 背景 2012年,随着公司业务的快速增长 ...

  7. 消息队列服务器 轻量,PHP的轻量消息队列php-resque使用说明

    消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操 ...

  8. rocketmq 顺序消费_10 分钟看懂消息队列 RocketMQ

    RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目.作为经历过多次阿里巴巴双十一这种&qu ...

  9. php 共享内存列队,php中对共享内存,消息队列的操作

    消息队列中的数据同样受到大小的约束,具体约束范围可通过msg_stat_queue的msg_qbytes看到.这段代码唯一有点小改动的地方就在接受消息时,指定了MSG_IPC_NOWAIT,不然如果目 ...

最新文章

  1. 第k大的数python代码_【Python】【输出前m大的数】
  2. linux中文系统装offci,Ubuntu 14.04 LTS中安装fcitx中文输入法的教程
  3. python 代码转程序_python将代码转换成网页
  4. 天眼FAST如何发现脉冲星?
  5. iOS提交审核:您的 App 正在使用广告标识符 (IDFA)
  6. SpringBoot最佳实践-dev-tools
  7. iWiscloud智慧家居控制中心
  8. struts2 零配置
  9. C++之虚函数是如何实现的
  10. 整理的几个常用的数据库维护的脚本
  11. 《Python入门到精通》运算符
  12. 工业标准接口OPC Server
  13. 你写的api接口代码真是_百度AI接口之JavaAPI方式调用示例代码[持续完善中]
  14. matlab画图一片空白的问题
  15. php根据身份证号码确定地区(省份)地址
  16. DJ设备市场现状及未来发展趋势
  17. python爬取招聘网站源码及数据分析_如何用爬虫抓取招聘网站的职位并分析
  18. windows电脑使用iTunes导入视频/音乐(本人使用,仅供参考)
  19. 蓝桥杯JAVA数列求和
  20. matlab 三维立体图,利用matlab将三维数据画成三维立体图

热门文章

  1. 远程服务器 上传公钥,SecureCRT+Ubuntu SSH服务器的远程公钥登陆
  2. C++中dynamic_cast的简介
  3. Mac下使用macdeployqt打包qt程序:
  4. java 程序流程控制知识点_JAVA基础知识点梳理三:流程控制语句
  5. 同一个html页面中两个area,HTML中的map和area标签
  6. android+使用bmob冲突,bmob开发android遇到的问题
  7. case是java关键字吗_Java关键字
  8. mysql gui 修改密码_MySQL修改root密码的各种方法整理
  9. mysql解释中fitered_MySQL的explain中的参数说明
  10. 如何手动输入给数组赋值_你是否真的了解VBA数组呢?让我带你认识一下真正的数组...