消息队列-Message Queue

消息队列-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 推送、用户注册 等。

应用案例

系统解耦

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

广播

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

消息通讯

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular 第一章 开始

第一章 开始 用 JavaScript 开发应用程序是一个很大的挑战。由于它的延展性和缺少类型检查,在 JavaScript 中构建一个适当大小的应用程序是很困难的。除此之外,我们对所有类型的处理都使用JavaScript,例如用户界面(UI),操作、客户端-服务器交互和业务处理/验证。因此,我们…

Typescript实现单例之父类调用子类

Typescript实现单例之父类调用子类 设计要求 在程序中,需要一个对象可以全局使用,并且只有一个实例Breakpoint 类是一个可以被继承的类,然后子类必须实现 updateView函数updateView 这个函数可以被自动调用,当窗口发生变化的时候构思 UML 图 Layout 是一个单例类,也就是全局只…

Angular性能优化之脏检测

Angular性能优化之脏检测 当我们在使用 Angular 框架搭建项目时,随着组件越来越多,页面也来越复杂,性能会越来越低,主要表现在 CPU 使用率 很高。所以我们要对项目做一定的优化。 Angular脏检查(Change Detection)机制 Angular 的脏检测主要是指 zone.js,这是一个开源的…

第一章、第一节 Angular基础

第一章、第一节 Angular基础 让我们先来看看Angular是如何实现组件模式的。 组件模式 Angular 应用程序使用组件模式。你可能听说过这个模式,它不仅用于软件开发,还用于制造、建筑和其他领域。简单地说,它涉及到将更小的、离散的构建块组合…

Angular Chart.js第三方库ng-chartjs基础使用

Angular Chart.js第三方库ng-chartjs基础使用 项目github地址 这个项目支持基本的Chart.js图表,并且支持内联插件和全局插件的使用。 Demo地址 支持图表类型 linebarradarpiepolarArea安装 npm install ng-chartjs --save npm install chart.js --save导入 正常导入模块i…

linux一键安装node+npm

分享一个linux下一键安装nodenpm脚本。 使用方式为: ./install-node.sh,然后输入版本号,node.js版本查询 切记不需要加 sudo 执行!!! 默认安装10.15.0。 #! /bin/bash############################################################ # …

Angular Material 阴影使用

Angular Material 阴影使用 依托于 Angular Material 库,可以直接使用通用的符合 Material Design 风格的阴影。 使用 使用方式有两种: 外联样式设定,即在css或scss中设定通过class名称设定,即 元素的class名称方式一:外联样式使用 在scss或css文件中导入@import ~@ang…

typescript或javascript深拷贝Object json

typescript或javascript深拷贝Object json Object的json对象很多时候我们需要深拷贝,我写了两个工具函数,供大家参考。 deepCopyObject 深拷贝一个Object对象,返回深复制的对象。 /** * method 深复制一个json对象 * param source 需要深复制的对象 * return 返…

linux安装zsh终端

linux安装zsh终端 ZSH 已经被收录到了 Ubuntu 18.04 LTS 的官方软件包存储库中了 sudo apt install zshZSH Shell 安装好之后,可以使用如下命令查看其版本: zsh --version取代bash,设为默认shell sudo usermod -s /bin/zsh username也可以…

HTML meta使用

HTML meta使用 meta标签是什么? meta标签是HTML语言head区的一个辅助性标签。 meta标签是干什么用的? meta标签用来描述一个HTML网页文档的属性,例如作者、日期和时间、网页描述、关键词、页面刷新等。它提供的信息虽然用户不可见&#x…

共享图片方案

共享图片方案 安装chrome插件 极简图床安装,链接地址 插件使用 使用阿里云 OSS 存储图片 阿里云 OSS 提供了安全、低成本、高可靠的云存储服务,极简图床针对阿里云 OSS 做了整合,通过简单的设置,即可方便地将图片上传到阿里…

javascript复制到黏贴板之完美兼容

javascript复制到黏贴板之完美兼容 很多时候我们需要给用户方便,提供一键复制的功能,但是在实现的过程中遇到各式各样的坑。 原生解决方案 document.execCommand()方法 MDN上的定义: which allows one to run commands to manipulate the contents of the edita…

制作windows启动盘-大于4GB镜像

制作windows启动盘-大于4GB镜像 制作一个 Windows 安装 U 盘是很容易的,使用 UltraISO 这样的刻录工具量产一个 iso 镜像文件到 U 盘即可。然而随着 Windows 10 版本号的提升,镜像变得越来越大,终于 FAT32 文件系统不再能够容纳得下安装镜像…

DIY 主机 所有AMD IntelCPU及主板

DIY 主机 所有AMD IntelCPU及主板 查看intel的cpu及amd的cpu或者对应的主板可以查看这个项目。diy-pc

PC介绍之电脑组成

电脑组成 CPU cpu就是中央处理器,英文为central processing unit。 CPU一般我们需要知道以下几点即可: 主频 CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed),通常所说的某某CPU是多少兆赫的&#xff…

PC介绍之PCIE、总线、内存、电源

PC介绍之PCIE、总线、内存、电源 PCIE降速 PCI-E的总线性能 目前我们所使用的显卡是x16 走 PCIE 3.0,有些显卡虽然插在x16的插槽上,但是速度只有x8的速度,总的来说好的显卡目前都是x16。 主板一般会提供一条x16,x8, x1三个插槽&#xff0c…

PC介绍之显卡

PC介绍之显卡 一、什么是显卡? 显示接口卡(Video card,Graphics card)、显示器配置卡简称为显卡,是个人电脑基本组成部分之一。 用途是将计算机系统所需要的显示信息进行转换驱动,并向显示器提供信号&…

Sublime Text 3 无法输入中文解决方案

Sublime Text 3 安装及无法输入中文解决方案 安装sublime-text 3 如果是ubuntu系统终端输入: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://download.…

Linux Server 安装 raid 1

Linux Server 安装 raid 1 两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。只要一个磁盘正常即可维持运作,可靠性最高。其原…

0-安装Vagrant和使用

0-安装Vagrant和使用 Vagrant 是一款软件,可以自动化虚拟机的安装和配置流程。用来管理虚拟机,如 VirtualBox、VMware、AWS等,主要好处是可以提供一个可配置、可移植和复用的软件环境,可以使用shell、chef、puppet等工具部署。所以…