什么是消息队列

news2024/11/24 16:28:58

什么是消息队列

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

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

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

  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.coloradmin.cn/o/1164604.html

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

相关文章

【Python入门一】Python及PyCharm安装教程

Python及PyCharm安装教程 1 Python简介1.1 Python下载及安装 2 PyCharm简介2.1 PyCharm下载及安装 参考 1 Python简介 Python是一种开源的高级编程语言,由Guido van Rossum于1991年创建。Python易于学习、阅读和编写,具有丰富的标准库和第三方模块&…

智慧校园管理云平台电子班牌系统源码,数据管理、信息发布、家校互通、物联控制、教务管理、日常办公、人脸识别

智慧校园平台源码 智慧校园云平台电子班牌系统源码 一款全功能智慧校园管理云平台电子班牌系统源码,融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用,是校园管理的现代手段。 电子班牌系统的主要功能包括:数据信…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V,电流高达500mA,而三个同步降压转换器的输入电压范围为3.0V至4.2V,输出电压范围为0.8V至3.9875V,峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

c++实现建造者模式

代码 director.h #pragma once #include<vector> #include<string> #include<iostream>class Product { private:std::vector<std::string> _parts;public:void Add(const std::string& part) {_parts.push_back(part);}void show(){std::cout &…

L1和L2正则化通俗理解

机器学习中&#xff0c;如果参数过多&#xff0c;模型过于复杂&#xff0c;容易造成过拟合&#xff08;overfit&#xff09;。即模型在训练样本数据上表现的很好&#xff0c;但在实际测试样本上表现的较差&#xff0c;不具备良好的泛化能力。为了避免过拟合&#xff0c;最常用的…

在Linux上通过NTLM认证连接到AD服务器(未完结)

这篇文章目前还没有实现具体的功能&#xff0c;只实现了明文登录&#xff0c;因为我缺少一些数据&#xff0c;比如通过密码生成hash&#xff0c;以及通过challenge生成response&#xff0c;我不知道怎么实现&#xff0c;因此这篇文章也是一个交流的文章&#xff0c;希望大佬看见…

Linux的test测试功能

测试文件名的类型&#xff0c;文件是否存在&#xff0c; 文件的权限检测 文件之间的比较 两个整数之间的比较 判断字符串数据 多重条件判定 一个一个来&#xff0c;这个有点多&#xff0c;不过比较有意思&#xff0c;来代码 案例1&#xff0c;判断文件是否存在&#xff…

VS Code提取扩展时出错。XHR failed

需求&#xff1a;想要在扩展中心下载插件&#xff0c;发现报错 原因&#xff1a;vs code之前设置了代理&#xff0c;需要删除即可

【LLM】大模型中的温度系数temperature是啥玩意||底层逻辑

【LLM】大模型中的温度系数是啥玩意_山顶夕景的博客-CSDN博客 大佬两句话就讲明白了&#xff0c;厉害~ 总结一下就是crossentropy里面引入t如下页ppt公式所示&#xff0c;t越大&#xff0c;每个词都有更大的概率被使用&#xff0c;也就体现出了多样性。

基于OR-Tools的装箱问题模型求解(PythonAPI)

装箱问题 一、背包问题&#xff08;Knapsack problem&#xff09;1.1 0-1背包模型基于OR-Tools的0-1背包问题求解&#xff08;PythonAPI&#xff09;导入pywraplp库数据准备声明MIP求解器初始化决策变量初始化约束条件目标函数调用求解器打印结果 1.2 多重背包问题&#xff08;…

74X138元件怎么找——错误解决方法

1.在做74X138的时候根据课本&#xff0c;无法在现有的库中找到74X138&#xff0c;搜索了老师发的库中&#xff0c;都是集成库打不开&#xff0c;那我该怎么办? 根据这个课本P343&#xff0c;&#xff08;即机械工业出版社&#xff0c;刘超&#xff0c;包建荣&#xff0c;俞优姝…

深入理解TCP协议

深入理解TCP 1.TCP基础概念了解 1.1简介 TCP&#xff08;Transmission Control Protocol&#xff09;是一种计算机网络协议&#xff0c;用于在网络上可靠地传输数据。它确保数据的完整性、顺序性和可靠性&#xff0c;通过建立连接、数据分段、错误检测和恢复机制&#xff0c…

什么是DNS

什么是DNS 概述 域名系统&#xff08;英语&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网**。DNS使用[TCP和UDP端口53。当前&#…

【算法练习Day36】最后一块石头的重量 II目标和一和零

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 最后一块石头的重量 II目标…

2m照片用手机怎么照?三个方法随心选!

在用手机拍照的时候&#xff0c;我们会发现拍出的照片尺寸都很大&#xff0c;占用手机的存储空间较多&#xff0c;而自己又不需要如此高清晰度的照片&#xff0c;那么如何解决这个问题呢&#xff1f;下面介绍了三种方法。 方法一&#xff1a;调整手机拍照的设置选项 1、打开手…

Python---字符串切片-----序列名称[开始位置下标 : 结束位置下标 : 步长]

字符串切片&#xff1a;是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。 本文以字符串为例。 基本语法&#xff1a; 顾头不顾尾&#xff1a; ----------类似range&#xff08;&#xff09; 范围&#xff0c;顾头不顾尾 相关链接Python----ran…

YOLOv5 - yolov5s.yaml 文件

基于深度学习的目标检测模型的结构:输入->主干->脖子->头->输出。主干网络提取特征&#xff0c;脖子提取一些更复杂的特征&#xff0c;然后头部计算预测输出。 YOLOv5网络结构主要由以下几部分组成: 骨干网络(Backbone) &#xff1a;Backbone:骨干网络&#xff0c…

JAVA虚拟机-第2章 Java自动内存管理-异常实践

Java堆溢出 堆的参数设置&#xff1a;将堆的最小值-Xms参数与最大值-Xmx参数设置 public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list new ArrayList<OOMObject>();while (true) {list.add(new OO…

FRI及相关SNARKs的Fiat-Shamir安全

1. 引言 本文主要参考&#xff1a; Alexander R. Block 2023年论文 Fiat-Shamir Security of FRI and Related SNARKsAlbert Garreta 2023年9月在ZK Summit 10上分享 ZK10: Fiat-Shamir security of FRI and related SNARKs - Albert Garreta (Nethermind) 评估参数用的Sage…

【Git企业开发】第五节.远程操作

文章目录 前言一、理解分布式版本控制系统二、远程仓库 2.1 新建远程仓库 2.2 克隆远程仓库 2.3 向远程仓库推送 2.4 拉取远程仓库总结 前言 一、理解分布式版本控制系统 我们目前所说的所有内容(工作区&#xff0c;暂存区&#xff0c;版本库等等)&#x…