消息队列选型
一、要解决的问题
1.1 异步
分析: 需要根据场景来判断。若整体链路的逻辑中,某些逻辑是不需要强实时的,滞后一段时间是允许的,同时又不会对用户带来不好的体验,那么可以使用MQ完成异步操作。
例如:秒杀场景,是有限资源,同时用户可以接受某些逻辑的延迟,比如生成订单,发送积分等逻辑
1.2 流量控制 - 削峰
分析: 服务器的资源是有限的,同时高峰流量不是一直持续的,且为了保护后端的服务不被打垮,因此,需要对后端服务进入的请求流量进行限制,提高了吞吐量。
缺点:
- 由于在网关层将请求放入了消息队列,整体的请求耗时将会变长,降低了用户的体验;
- 下游服务都需要将同步请求修改为异步请求,增加了系统的复杂度。
改进方案:若能预估出秒杀服务的处理能力,可采用令牌桶策略,网关在调用秒杀服务之前,先获取令牌桶,获取不到,则直接拒绝请求,这样用户可以快速的得到秒杀结果。

1.3 解耦
实现服务之间的解耦。已电商的下单为例:
- 下单后,会调用支付服务发起支付请求;
- 下单后,会调用风控服务发起订单合法性的校验;
- 下单后,会调用数仓服务更新数据
如果后续增加新的下游服务,那么订单服务每次都需要调整接口,都需要适配接口,影响开发效率。因此,可以使用MQ来进行解耦。
其他的应用场景:
- 实现系统间的观察者模式;
- 可以将消息广播给大量的消费者
使用MQ带来的问题:
1. 会带来延迟问题;
2. 数据存在短时间内的不一致问题
3. 系统复杂度上升
二、主流技术解决方案
2.1 MQ选型的考虑因素
1. 是否开源。后续出现bug,可以通过修改源代码来进行解决
2. 社区是否活跃。出现bug,能够找到解决方案;
3. 生态兼容性。与主流技术栈的兼容性,若兼容性不好,则需要耗费精力去和技术栈进行融合。
4. 消息不丢失;
5. 高可用:支持集群模式,保证MQ时时可用
6. 性能。能够满足绝大多数场景的需求。
2.2 主流MQ
2.2.1 Rabbit MQ
特点:
- 开箱即用,非常轻量化;
- 支持非常
灵活的路由配置,和其他消息队列不同的是,它在生产者(Producer)和队列(Queue)之间增加了一个Exchange模块,你可以理解为交换机;- 基于elang语言开发,底层是采用了AMQP协议。
- 可用性:基于主从架构
核心架构:

缺点:
- 消息堆积处理不好。RabbitMQ认为消息堆积是异常情况,因此大量消息堆积下,性能下降的厉害;
- 性能差。每秒钟仅能处理大概几万条消息;
- 语言壁垒高
2.2.2 RocketMQ

RocketMQ是阿里开源的消息中间件,它是一个开源的分布式消息传递和流式数据平台。总共有四大部分:NameServer,Broker,Producer,Consumer。
NameServer:用来管理brokers以及路由信息。broker服务器启动时会注册到NameServer上,并且两者之间保持心跳监测机制,以此来保证NameServer知道broker的存活状态。而且,每一台NameServer都存有全部的broker集群信息和生产者/消费者客户端的请求信息。Broker:负责管理消息存储分发,主从数据同步,为消息建立索引,提供消息查询等能力。
优点:
- 每秒钟大概能处理几十万条消息
- 消息零丢失
- 高性能:毫秒级的时延
- 可用性:分布式架构
2.2.3 Kafka
最初设计的目的是处理海量的日志。整体架构图:

核心原理: 一个Kafka集群由多个Broker和一个ZK集群组成,Broker作为Kafka节点的服务器。同一个消息主题Topic由多个分区Partition组成,分区物理存储在Broker上。为了负载均衡,同一个Topic的多个分区存储在不同的Broker上;为了提高可靠性,每个分区在不同的Broker上会存在副本。Kafaka里的ZK主要有以下作用:
1. Broker注册:当Broker故障时能及时感知;
2. 元数据管理:存储Broker,Topic和Partitions的配置信息,能感知信息的变化;
3. 消费者组管理:维护消费者的订阅信息,偏移量等,实现负载均衡;
4. Leader选举:Kafka中的每个Partition分区都会有一个leader,zk可以负责leader的选举,确保在leader宕机后,集群可以快速选择新的leader进行服务。
Kafka的分区和RockerMQ的队列是类似的。
优缺点:
- 异步性能高。底层大量采用了批量和异步的思想;
- 时延:毫秒级
- 每秒钟可以处理几十万条消息;
- 生态兼容性好
- 同步收发消息响应时延高。底层原理:当Kafka接收到消息时,并不会立即发送出去,而是等一会攒一批再发送。因此,当每秒钟消息没有那么多时,等的时间就比较长,时延就很长,因此不适合在线业务场景。
2.2.4 pulsar
新兴的MQ产品,采用存储与计算分离的架构。
2.3 各种MQ适用场景
● 若对消息队列功能和性能要求不高,建议选择RabbitMQ,开箱即用且易于维护
● 若处理在线业务,建议选择RockMQ,低延迟和金融级的稳定性是非常nice的;
● 若处理海量消息,例如日志,监控或埋点信息,建议选择Kafaka。
相关文章:
消息队列选型
一、要解决的问题 1.1 异步 分析: 需要根据场景来判断。若整体链路的逻辑中,某些逻辑是不需要强实时的,滞后一段时间是允许的,同时又不会对用户带来不好的体验,那么可以使用MQ完成异步操作。 例如:秒杀场…...
ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中
whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪,未在虚拟环境中安装包 解决办法1࿱…...
力扣127.单词接龙讲解
距离上一次刷题已经过去了.........嗯............我数一一下............整整十天,今天再来解一道算法题 由于这段时间准备简历,没咋写博客。。今天回来了!!!!!!!&…...
latex笔记
双列排版,右端margin不对齐怎么解决 如下图这种情况, 解决方法: 在文档开头引入ragged2e包 \usepackage{ragged2e}然后在子章节的开头添加 \justifying\subsection{camouflaged object detection based on coarse-to-fine strategy} \just…...
秋招算法——AcWing101——拦截导弹
文章目录 题目描述思路分析实现源码分析总结 题目描述 思路分析 目前是有一个笨办法,就是创建链表记录每一个最长下降子序列所对应的节点的链接,然后逐个记录所有结点的访问情况,直接所有节点都被访问过。这个方法不是很好,因为需…...
IDEA不能创建新项目和新模块
问题: IDEA不管是创建新项目还是新模块都创建不成功,会报如下图错误 解决方案: 在电脑设置里搜索 “防火墙和网络保护” ,打开如下图所示 找到你所安装的IDEA,更改设置,选中IDEA 最后,确定&am…...
WebRTC 的核心:RTCPeerConnection
WebRTC 的核心:RTCPeerConnection WebRTC 的核心:RTCPeerConnection创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE什么是 Candidate?收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换远端…...
LeetCode hot100-39-N
101. 对称二叉树给你一个二叉树的根节点 root , 检查它是否轴对称。做不出来哇,递归一生之敌 普通的对一棵树的递归遍历根本没办法只接比较左子树的左和右子树的右这样来比较,所以这题比较巧妙的是把这棵树当做两棵树一样去遍历比较。 官方…...
NumPy常用操作
目录 一:简介 二:NumPy 常用操作 三:总结 一:简介 是一个开源的Python库,它为Python提供了强大的多维数组对象和用于处理这些数组的函数。NumPy的核心是ndarray,它是一个高效的多维数组容器,用于存储和处理大规模的数据。NumPy还提供了许多数学函数,用于数组之间的操…...
学习笔记——字符串(单模+多模+练习题)
单模匹配 Brute Force算法(暴力) 算法思想 母串和模式串字符依次配对,如果配对成功则继续比较后面位置是否相同,如果出现匹配不成功的位置,则j(模式串当前的位置)从头开始,i&…...
DOT + graphviz 轻松画图
GraphViz:2 DOT语法和相关应用_graphviz dot-CSDN博客 图可视化之Graphviz - 知乎 Graphviz 是由AT&T Research、Lucent Bell实验室开源的可视化图形工具,可以很方便的用来绘制结构化的图形网络。具体地,其使用一种名为dot语言的DSL来编…...
使用Vue调用ColaAI Plus大模型,实现聊天(简陋版)
首先去百度文心注册申请自己的api 官网地址:LuckyCola 注册点开个人中心 查看这个文档自己申请一个ColaAI Plus定制增强大模型API | LuckyColahttps://luckycola.com.cn/public/docs/shares/api/colaAi.html来到vue的页面 写个样式 <template><Header …...
Unity使用sherpa-onnx实现离线语音合成
sherpa-onnx https://github.com/k2-fsa/sherpa-onnx 相关dll和lib库拷进Unity,官方示例代码稍作修改 using SherpaOnnx; using System; using System.IO; using System.Runtime.InteropServices; using UnityEngine;public class TTS : MonoBehaviour {public st…...
Elasticsearch入门基础和集群部署
Elasticsearch入门基础和集群部署 简介基础概念索引(Index)类型(Type)(逐步弃用)文档(Document)字段(Field)映射(Mapping)分片&#x…...
12、24年--信息系统治理——IT治理
主要考选择题,2分左右,案例、论文涉及概率不大,需要认证读课本原文。 1、IT治理基础 IT治理是描述组织采用有效的机制对信息技术和数据资源开发利用,平衡信息化发展和数字化转型过程中的风险,确保实现组织的战略目标的过程。 1.1 IT治理的驱动因素 1)存在很多问题: 信…...
Electron学习笔记(三)
文章目录 相关笔记笔记说明 五、界面1、获取 webContents 实例(1)通过窗口对象的 webContent 属性获取 webContent 实例:(2)获取当前激活窗口的 webContents 实例:(3)在渲染进程中获…...
【Redis】Redis键值存储
大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪…...
C++系统编程篇——Linux初识(系统安装、权限管理,权限设置)
(1)linux系统的安装 双系统---不推荐虚拟机centos镜像(可以使用)云服务器/轻量级云服务器(强烈推荐) ①云服务器(用xshell连接) ssh root公网IP 然后输入password ①添加用户: addus…...
No Cortex-M SW Device Found
将DIO和CLK管脚调换一下...
提升写作效率的秘密武器:一个资深编辑的AI写作体验
有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
