什么是消息队列

什么是消息队列

消息队列是一种通信机制,用于在不同的应用程序或组件之间传递消息。它允许应用程序之间异步地发送和接收消息,而无需直接依赖彼此的可用性或性能。消息队列通常用于解耦不同组件,提高系统的可伸缩性和可维护性,以及处理异步任务和事件驱动的架构。

以下是一个简单的消息队列示例:

假设有一个电子商务网站,它需要处理来自不同来源的订单和付款通知。为了确保这些任务可以异步处理并且不会阻塞网站的核心功能,可以使用消息队列来协调这些任务。

  1. 订单服务:当客户下订单时,订单服务将订单数据包装成消息,并将其发布到消息队列中,例如 RabbitMQ 或 Apache Kafka。

  2. 付款服务:当客户成功支付订单时,付款服务将付款通知数据包装成消息,并将其发布到同一个消息队列。

  3. 处理订单:有一个独立的工作者服务,它监听消息队列上的消息。一旦它接收到订单消息,它会开始处理订单,可能包括验证订单、准备货物并发送通知邮件。

  4. 处理付款通知:另一个独立的工作者服务也监听消息队列上的消息,一旦它接收到付款通知消息,它会更新订单的支付状态。

使用消息队列的好处包括:

  • 解耦:订单服务和付款服务不需要直接相互通信,它们只需将消息发布到队列中,而工作者服务负责处理消息。

  • 异步处理:订单和付款通知可以异步处理,不会阻塞用户的操作,提高了网站的性能和响应时间。

  • 可伸缩性:您可以轻松地增加工作者服务的数量以处理更多消息,从而实现系统的横向扩展。

  • 容错性:即使工作者服务崩溃或不可用,消息队列仍然可以保存消息,以确保没有消息丢失。

这只是一个消息队列的简单示例,实际中有许多不同的消息队列系统和用例,可以满足不同的需求。

什么时候会用到消息队列

在系统架构中,消息队列的定位就是总线和管道,主要起到解耦上下游系统、数据缓存的作用。它不像数据库,会有很多计算、聚合、查询的逻辑,它的主要操作就是生产和消费。所以,我们在业务中不管是使用哪款消息队列,我们的核心操作永远是生产和消费数据。一般情况下,我们会在需要解耦上下游系统、对数据有缓冲缓存需求或者需要用到消息队列的某些功能(比如延时消息、优先级消息)的时候选择使用消息队列,然后再根据实际需求选型。

下面我们用经典的订单下单流程,来简要概括下对消息队列的使用情况。

在这里插入图片描述

下单流程是一个典型的系统解耦消息分发的场景,一份数据需要被多个下游系统处理。另外一个经典场景就是日志采集流程,一般日志数据都很大,直接发到下游,下游系统可能会扛不住崩溃,所以会把数据先缓存到消息队列中。所以消息队列的基本特性就是高性能、高吞吐、低延时

消息队列网络模块高性能设计

1.如何高效管理大量的 TCP 连接

主流的消息队列 Kakfa、RocketMQ、Pulsar 的网络模块都是基于 IO 多路复用的思路开发的。IO 多路复用技术,是指通过把多个 IO 的阻塞复用到同一个 selector 的阻塞上,让系统在单线程的情况下可以同时处理多个客户端请求。最大的优势是系统开销小,系统不需要创建额外的进程或者线程,降低了维护的工作量,也节省了资源。目前支持 IO 多路复用的系统调用有 Select、Poll、Epoll 等,Java NIO 库底层就是基于Epoll 机制实现的

2.如何快速处理高并发请求

Reactor 模型是一种处理并发服务请求的事件设计模式,当主流程收到请求后,通过多路分离处理的方式,把请求分发给相应的请求处理器处理。如下图所示,Reactor 模式包含Reactor、Acceptor、Handler 三个角色。

在这里插入图片描述

当前业界消息队列的网络模型,比如 Pulsar、Kafka、RocketMQ,为了保证性能,都是基于主从 Reactor 多线程模型开发的。这种方案,优点是 Reactor 的主线程和子线程分工明确。主线程只负责接收新连接,子线程负责完成后续的业务处理。同时主线程和子线程的交互也很简单,子线程接收主线程的连接后,只管业务处理即可,无须关注主线程,可以直接在子线程把处理结果返回给客户端。所以,主从 Reactor 多线程模型适用于高并发场景,Netty 网络通信框架也采用了这种实现。缺点是如果基于 NIO 从零开始开发,开发的复杂度和成本较高。另外,Acceptor 是一个单线程,如果挂了,如何处理客户端新连接是一个风险点。为了解决 Acceptor 的单点问题,有些组件为了保证高可用性,会对主从 Reactor 多线程做一些优化,把 Acceptor 也变为多线程的形态。我们在公有云上商业化版本的 Kafka 就是使用的这种模型

在这里插入图片描述

Kafka 网络模型

一个 Acceptor 接收客户端建立连接的请求,创建 Socket 连接并分配给 Processor 处理。Processor 线程把读取到的请求存入 RequestQueue 中,Handler 线程从 RequestQueue队列中取出请求进行处理。Handler 线程处理请求产生的响应,会存放到 Processor 对应的 ResponseQueue 中,Processor 线程从其对应的 ResponseQueue 中取出响应信息,并返回给客户端。

在这里插入图片描述

RocketMQ 网络模型

RocketMQ 采用 Netty 组件作为底层通信库,遵循 Reactor 多线程模型,同时又在 Reactor模型上做了一些扩展和优化。所以它的网络模型是 Netty 的网络模型,Netty 底层采用的是主从 Reactor 多线程模型,模型的原理逻辑跟前面讲到的主从 Reactor 多线程模型是一样的

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

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

相关文章

day01_Java概述丶环境搭建

前置知识 什么是计算机语言? 计算机语言就是人与计算机之间进行信息交流沟通的一种特殊语言。所谓计算机编程语言,就是人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。 Java语言概述 是美国Sun公司(Stanf…

部署WeBASE

1、检查环境 1.1、检查Java java -version 1.2、检查mysql mysql --version 1.3、检查Python python --version # python3时 python3 --version 2、修改配置 修改common.properties 修改webase-node-mgr 修改webase-node-mgr/conf/application.yml 修改webase-node-mgr…

html用css grid实现自适应四宫格放视频

想同时播放四个本地视频: 四宫格;自式应,即放缩浏览器时,四宫格也跟着放缩;尽量填满页面(F11 浏览器全屏时可以填满整个屏幕)。 在 html 中放视频用 video 标签,参考 [1]&#xff1…

windows内存取证-中等难度-下篇

上文我们对第一台Target机器进行内存取证,今天我们继续往下学习,内存镜像请从上篇获取,这里不再进行赘述​ Gideon 攻击者访问了“Gideon”,他们向AllSafeCyberSec域控制器窃取文件,他们使用的密码是什么? 攻击者执…

大数据与健康:技术助力医疗卫生事业腾飞

大数据与健康:技术助力医疗卫生事业腾飞 随着科技的飞速发展,大数据技术已经渗透到我们生活的方方面面,包括医疗卫生领域。本文将对大数据在健康医疗领域的应用进行分析,并通过数据图表展示其发展趋势和前景。 一、背景介绍 近…

5大自动化测试的Python框架 【实用干货】

自从2018年被评选为编程语言以来,Python在各大排行榜上一直都是名列前茅。 目前,它在Tiobe指数中排名第三个,仅次于Java和C。随着该编程语言的广泛使用,基于Python的自动化测试框架也应运而生,且不断发展与丰富。 因…

eclipse Occurrence

eclipse Occurrence Occurrence of initUi2_setData_99 Window->Preferences->General->Editors->Text Editors->Annotations->Occurrences 个人感觉最好用的颜色; 边线,正文都可以看得清楚

数据结构和算法的精髓是什么?复杂度分析【数据结构与算法】

为什么需要复杂度分析?什么是 O 复杂度表示法?如何分析时间复杂度?常见时间复杂度量级有哪些?O(1)O(logn)O(nlogn)O(mn)、O(m*n) 数据结构和算法解决的是执更快和更省资源的问题,快和省通过复杂度来衡量。 为什么需要复…

整理笔记——0欧电阻、电感、磁珠

设计电路时,经常用到0欧电阻、电感、磁珠,这三个基础电子原件万用表量都是“短路”,这三者之间有什么区别?什么情况下用什么原件? 一、0欧电阻 0欧电阻,并不是指元件的电阻值为0,而是电阻值很小…

C++:string类!

Cstring 是C中的字符串。 字符串对象是一种特殊类型的容器,专门设计来操作的字符序列。 不像传统的c-strings,只是在数组中的一个字符序列,我们称之为字符数组,而C字符串对象属于一个类,这个类有很多内置的特点,在操作…

如何在麒麟上安装 ONLYOFFICE 桌面编辑器

我们很高兴地告诉大家,ONLYOFFICE 桌面编辑器现已上架麒麟软件商店。请阅读下文了解详情。 关于麒麟 麒麟是一款国产操作系统,主要是为了满足中国市场的需求和偏好而设计的。 它能够与各种硬件平台和软件应用程序的广泛兼容,因而受到认可。…

1360. 日期之间隔几天

1360. 日期之间隔几天 Java代码: 【DateFormat】DateFormat用于实现日期的格式化 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // 好像已过时class Solution {public int daysBet…

【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 实现安全版本的单例模式饿汉模式类和对象的概念类对象类的静态成员与实例成员 懒汉模式如何保证…

计算机算法分析与设计(22)---回溯法(最小重量机器设计问题)

文章目录 一、问题描述二、算法思路三、代码编写 一、问题描述 设某一机器由 n n n 个部件组成,每种部件都可以从 m m m 个不同的供应商处购得。设 w i j w_{ij} wij​ 是从供应商 j j j 处购得的部件i的重置, c i j c_{ij} cij​ 是相应的价格。设计…

软件开发全文档归档,开发、管理、实施、运维、服务巡检、信息安全、安全运维

在当今高度信息化的时代,软件开发已成为推动社会进步和发展的重要力量。软件开发过程中,文件支撑作为关键的一环,对于保障项目的顺利进行和产品的质量具有不可替代的作用。本文将探讨软件开发所需的主要文件及其作用。 一、引言 软件开发是…

leetCode 746. 使用最小花费爬楼梯 + 记忆化搜索 + 递推 + 动态规划 + 空间优化

关于此题我的往期文章: leetCode 746. 使用最小花费爬楼梯 动态规划-CSDN博客https://heheda.blog.csdn.net/article/details/133325840 dfs(i-1) 跳到 dfs(i) 需要花费 dfs(i-1) cost[i-1]dfs(i-2) 跳到 dfs(i) 需要花费 dfs(i-2) cost[i-2] (1&…

C++——list

目录 list介绍 list的函数接口 构造函数 push_front和pop_front push_back和pop_back insert erase 迭代器 front和back size resize empty clear list::sort unique reverse 迭代器的实现 list介绍 list是一种可以在常数范围内在任意位置进行插入和删除的序列…

Java实现Web的ashx对接ORM

之前的介绍已经实现了ORM的主体和Web的调用结构主题,那么这次把Web和LIS.Core的容器和ORM做对接,通过ashx实现的业务类测试调用ORM查询数据。 首先改造容器让传入根地址 package LIS.Core.Context;import org.w3c.dom.Document; import org.w3c.dom.El…

@所有人,城市燃气信息化与信息安全建设方法

关键词:城市燃气信息化、智慧燃气建设、城市燃气安全、智慧燃气、智慧燃气平台 近几年,燃气作为一种新兴的燃料迅速普及开来,和燃气有关的企业之间的竞争也不可避免。身处在互联网的时代,企业只有顺应时代的潮流,将城…

Docker 学习路线 2:底层技术

了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理,并有助于您更有效地使用该平台。 Linux容器(LXC) Linux容器(LXC)是Docker的基础。 LXC是一种轻量级的虚拟化解决方案,允许多个隔离的Linux系…