1.MQ介绍

MQ

消息队列,本质是一个队列,先进先出,只不过队列中存放的内容是message而已。

为啥学习MQ

1.流量消峰

如果一个订单系统最多每秒能处理一万次订单,正常情况下我们下单1秒后就能返回结果。但是在高峰期,如果有两万次下单操作,系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消一万笔订单的限制,把一秒内下的订单分散成一段时间来处理,通过排队逐一处理消息,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。

2.应用解耦

电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出现了故障,都会导致下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多。比如物流系统发生故障,需要几分钟来修复。在这几分钟时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可。下单用户感受不到物流系统的故障,提升系统的可用性。

3.异步处理

 如果A调用B,B需要花很长时间执行。但是A需要指定B什么时候执行完。

传统方式:

1.A等一段时间去调用B的查询api接口去查询B是否执行完。

2.A提供一个回调api接口,B执行完后调用A的回调api通知A服务。

使用消息队列:

A调用B后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给MQ,MQ会将此消息转发给A服务。这样A服务既不能循环调用B的查询api,也不用提供回调api。A服务还能及时的到异步处理成功的消息。

MQ的分类

1.ActiveMQ

比较老,维护少,很少使用高吞吐量场景。

2.Kafka

为大数据而生的消息中间件。百万级TPS的吞吐量。性能卓越,单机写入TPS越百万条/s。

Kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据。

Kafka Web管理界面Kafka-Manager。

在日志领域比较成熟。大数据领域实时计算以及日志采集应用广泛。

缺点:Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息的响应时长变长,消费失败不支持重试,也就是容易丢失消息。支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢。

适用场景:产生大量数据的数据收集业务,大型公司建议使用,是日志采集功能的首选。

3.RocketMQ

阿里巴巴开源产品,java语言编写,设计时候参考了Kafka,并做出自己的改进。被阿里巴巴广泛应用于订单、交易、充值、流计算、消息推送、日志流式处理,binglog分发等场景。

单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到0丢失,mq功能较为完善,还是分布式的,扩展性好,支持10亿级别的消息堆积,不会因为堆积导致性能下降,源码是java可以自己阅读的源码,定制自己公司的MQ。

缺点:支持的客户语言不多,目前是java和C++,其中C++不成熟。社区活跃度一般,没有在MQ核心中去实现JMS等接口,有些系统要迁移需要修改大量代码。

适用场景:为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,在大量交易涌入时,后端可能无法及时处理的情况。在阿里双11已经经历了多次考验。高并发场景。

4.RabbitMQ

使用AMQP高级消息队列协议基础上完成的,可复用的企业消息系统,是最主流的消息中间件之一。由于erlang语言的高并发特性,性能较好。吞吐量到万级,功能比较完备、健壮、稳定、易用、跨平台、支持多种语言:Python,Ruby,.NET,java,jms,c,php,ActionScript,xmpp,stomp等。

支持ajax文档齐全,开源提供的管理界面非常好,社区活跃度高,更新频率高。

缺点:商业版需要收费,学习成本高。

适用场景:erlang语言本身的并发优势,性能好,时效性微秒级,如果数据量没那么大,中小型公司优选。

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

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

相关文章

服务端正常启动了,但是客户端请求不到

服务端正常启动了,但是客户端请求不到有哪些原因?如何排查? 如果客户端请求的接口没有响应,排查的方式: 检查接口IP地址是否正确,ping一下接口地址。 检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1",选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机,比如我选择的是192.168.0.104: 结果提示:Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

splunk编写自定义命令

1. 自定义命令简介 splunk有丰富的内置搜索命令,但也提供了编写自定义命令来实现个性化的搜索需求,以此方式扩展splunk搜索处理语言(SPL)。 自定义搜索命令是一个可执行文件,可读入和写出数据,它可以是一…

状态机和工作流的选择

结论 如果你的需求主要集中在状态管理和状态转换控制,并且你使用的是Spring生态系统,Spring State Machine 是一个非常合适的选择。 如果你的需求是企业级的业务流程自动化,涉及到跨系统、跨组织的业务协调,并且需要强大的流程设计…

办公效率翻倍!2024最适合办公电脑安装的系统推荐!

当前,电脑已成为我们日常办公最常用的工具。为了确保高效顺畅的办公体验,选择一款合适的操作系统至关重要。那么,如何找到并下载最适合办公电脑的操作系统呢?接下来系统之家小编为您推荐2024年最适合办公电脑安装的系统&#xff0…

递推算法及解题套路

数学归纳法 step 1: 验证k0成立 step 2: 验证如果ki成立,那么ki1也成立 step 3: 联合step1与step2,证明由k0->kn成立 如何解决递推问题 1.确定递推状态 一个函数符号f(x),外加这个函数符号的含义描述 一般函数所对应的值,就是…

Qt窗口程序整理汇总

到今日为止,通过一个个案例的实验,逐步熟悉了 Qt6下 窗体界面开发的,将走过的路,再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

基于单片机STC89C52和GSM实现的远程拨号开锁设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于单片机STC89C52和GSM实现的远程拨号开锁设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘要 仿真图 单片机系统流程图 实物图 代码 系统论文 资源下载 摘要 本文介…

ArduPilot开源代码之AP_DAL_InertialSensor

ArduPilot开源代码之AP_DAL_InertialSensor 1. 源由2. 框架设计2.1 类定义和成员变量2.2 公共方法2.3 构造函数和其他方法2.4 私有成员变量 3. 重要例程3.1 InertialSensor-like 方法3.1.1 get_loop_rate_hz3.1.2 get_imu_pos_offset 3.2 accel 方法3.2.1 get_accel_count3.2.2…

无人机监测的必要性及方法

为什么需要无人机探测? 无人机的快速发展和广泛使用为各个行业带来了巨大好处,包括送货服务、农业和监控。然而,这种扩散也导致滥用现象增多,造成非法入侵空域、侵犯隐私和安全威胁。监控和探测在特定空域盘旋的无人机的能力变得…

Linux C++ 058-设计模式之解释器模式

Linux C 058-设计模式之解释器模式 本节关键字:Linux、C、设计模式、解释器模式 相关库函数: 概念 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。 解释器模式用于构建一…

python数据可视化(9)——绘制小提琴图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 python:3.12.3 所有库都使用最新版。 Python绘制小提琴图 小提琴图(violin plot…

理想主义者

我自认为不是一个理想主义者,可能更多的是一个实用主义者,做了这么多年的产品我更多的是关注产品的落地。但这并不妨碍我对理想主义者的敬重。 偏见只是偏见,微信之父张小龙的人生并不会被各种偏见左右。当所有人都在说张小龙迷茫时&#xf…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备: 任意markdown编辑器,以typora为例pandoc,官方下载地址 思路整理: 从swagger提取离线md文档将md文档转换为word格式 操作步骤: 一、安装pandoc (markdown编辑器安装略) 前往官网…

Yak与nuclei的深度融合:打造高效漏扫生态,解锁PoC管理新姿势

在Yakit中使用nuclei很简单,只需要几行代码。在Yak Runner中,使用下面代码,指定扫描的目标与选项,便能调用nuclei的漏扫能力: results:nuclei.Scan(target,opts...)~for result in results { dump(result)} 比如以…

UNiapp微信小程序Ucharts

效果图如下 以上为加载接口所得数据的玫瑰图与折线图 具体步骤如下 1,将插件导入Hbuiler 所需要的项目中(插件地址:秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场) 2,导入成功是这样的 3&#xff0c…

java 根据当前时间获取 yyyy-MM-dd HH:mm:ss 标准格式的时间

在Java中,可以使用java.time包中的LocalDateTime类和DateTimeFormatter类来获取并格式化当前时间为yyyy-MM-dd HH:mm:ss格式。 代码示例 以下是如何获取当前时间并格式化为yyyy-MM-dd HH:mm:ss格式的完整示例: import java.time.LocalDateTime; impor…

app的进程启动为什么不是init的fork,而是zygote的fork

在Android系统中,应用程序(App)的进程启动不是通过init进程的fork,而是由Zygote进程的fork来完成的,这主要是出于性能和资源利用优化的考虑。以下是详细的原因分析: 一、init进程的角色 初始化系统&#…

2024-07-16升级问题:调用自带软件打开文件时 android.os.FileUriExposedException

2024-07-16升级问题:调用手机自带软件打开文件时,出现以下问题: E/AndroidRuntime: FATAL EXCEPTION: mainProcess: rs.tabletcropland, PID: 10997android.os.FileUriExposedException: file:///storage/emulated/0/arcgis/%E7%9F%B3%E7%8B…

ES6基本语法(二)——函数与数组

函数 函数是JavaScript中组织代码的一种方式&#xff0c;它可以提高代码的复用性&#xff0c;并使其更加模块化。 在<script>标签中定义函数 你可以在HTML文件的<script>标签内定义函数&#xff0c;或者在JavaScript文件中定义后再引入到HTML中。 <script&g…