1.RocketMQ 消费者(2)客户端设计和启动流程详解 & 源码解析
2.为什么要使用消息中间件?消息息中
3.详解rocketMQ顺序消息
4.Apache RocketMQ 远程代码执行漏洞(CVE-2023-37582)
5.Web中间件简述
6.数据库中间件-cetus源码介绍
RocketMQ 消费者(2)客户端设计和启动流程详解 & 源码解析
RocketMQ 消费者系列的第二篇文章深入剖析了客户端设计和启动流程。本文将带你了解消费者类的中间结构、启动过程,源间件以及源码细节。码消
首先,源码消费者客户端设计的消息息中服装批发小程序源码核心是DefaultMQPullConsumer和DefaultMQPushConsumer,它们都实现了消费者接口,中间并扩展了客户端配置类。源间件DefaultXXXXConsumer实际上是码消一个代理,内部通过DefaultMQXXXXConsumerImpl执行大部分方法,源码后者包含了MQClientInstance,消息息中它是中间客户端实例的管理核心,负责与Broker通信和存储元数据。源间件
消费者启动涉及这三个关键类:DefaultMQPullConsumer/ConsumerImpl和MQClientInstance。码消启动流程分为新建消费者、源码消费者启动以及客户端实例的初始化。拉消费者和推消费者虽然操作不同,但内部都依赖拉取消息服务,如PullMessageService,推消费者还利用ConsumeMessageService接口进行并发或顺序消费。
拉模式和推模式的消费者启动流程相似,但推消费者更注重消息推送的自动处理。在DefaultMQPushConsumer的启动中,实际是调用其代理类的启动方法,而MQClientInstance则负责初始化客户端通信和设置。
源码解析部分,我们会在后续文章中详细剖析DefaultMQProducerImpl和MQClientInstance的启动过程。想要获取更多消息中间件的源码解析和最新动态,别忘了关注我们的公众号消息中间件(middleware-mq),同时,本文由OpenWrite平台发布。
为什么要使用消息中间件?
前言
电商订单系统的核心功能包括库存扣减与订单状态更新,然而,在完成这些核心功能后,还涉及许多其他步骤,如红包发放、短信推送通知、积分等。这些步骤可能导致系统性能下降,尤其是iapp软件变源码高峰期并发量大时,服务器磁盘、IO、CPU负载高,SQL语句执行性能降低,可能需要1秒至2秒甚至更长时间来完成全部步骤。这一过程影响用户体验,用户在支付后等待时间过长会感到不耐烦。因此,解决子步骤过多、速度慢、让用户等待时间过长的问题是订单系统急需解决的问题。
引入消息中间件(Message Queue,MQ)是解决此问题的一大利器。消息中间件允许系统A与系统B之间进行异步通信,通过消息传递来实现系统间的解耦。系统A发送消息给MQ后,完成自己的任务;系统B根据自身情况,可能在消息发送后1秒、1分钟或更长时间后获取并处理消息。这种异步调用机制使得系统A与系统B之间的通信不局限于同步调用,从而提高整体系统性能。
消息中间件在电商系统中的应用包括:处理减库存、红包发放、短信通知、积分等耗时操作,将其解耦到MQ中,让订单系统仅完成核心功能。在大促活动如双期间,大量下单请求可先到MQ中排队,订单系统以数据库可接受的速率完成操作,避免瞬间高并发请求对数据库造成压力。消息中间件的另一重要功能是削峰填谷,通过控制消息处理速率来平衡系统负载。
在实际应用中,需要考虑MQ的性能、可用性、可靠性、功能支持、文档质量、xss 获取网页源码社区活跃度、开源情况、开发语言等多方面因素。目前业界广泛使用Kafka、RabbitMQ和RocketMQ三种消息中间件,它们各有优劣。Kafka在吞吐量、性能、高可用性方面表现优秀,但可能在数据持久化和功能复杂性上有所欠缺。RabbitMQ具备数据不丢失的机制、高可用性、部分高级功能,但吞吐量较低,维护复杂,且开发语言限制了部分团队的使用。RocketMQ则在性能、高可用性、数据保证、功能丰富性等方面表现出色,且支持Java开发,易于阅读和修改源码。然而,RocketMQ的文档相对简单,是其需要改进之处。
选择合适的消息中间件时,需考虑业务需求、性能要求、扩展性、团队技术栈和维护成本等因素。对于大数据收集场景,Kafka通常为理想选择;对于国内一线互联网大厂的核心系统,RocketMQ因其高性能、集群部署能力及高级功能而成为首选;对于中小型互联网公司,RabbitMQ在吞吐量、功能需求较低的情况下也能满足需求。在高并发、性能要求高的场景下,考虑未来的文档分享平台 源码扩展性和定制需求时,RocketMQ提供了更好的选择。
详解rocketMQ顺序消息
RocketMQ是一个高效的消息中间件,具备高可用性和顺序消息处理能力。本文将深入解析RocketMQ顺序消息的场景应用、示例操作、原理以及源码实现。场景
在有严格顺序要求的业务场景,如订单创建、支付和发货等,RocketMQ的顺序消息特性至关重要。它确保这些操作按特定顺序执行,避免潜在的错误结果。示例
例如,在电商订单系统中,用户下单后,操作流程需要按以下顺序:下单、扣减库存、创建订单。不按顺序执行可能导致库存减少但订单未创建成功。RocketMQ通过确保相同业务操作发送至同一队列,实现消息的有序处理。发送和消费
Producer发送顺序消息时,创建一个MessageQueueSelector来选择队列,如使用order.getId()。Consumer消费时,通过MessageListenerOrderly或ConsumeOrderlyEnable确保按发送顺序读取消息。以下为简单示例:Producer: DefaultMQProducer send(Message msg, MessageQueueSelector selector)
Consumer: DefaultMQPushConsumer consumeMessage(Message msg, MessageListener listener)
原理与源码
RocketMQ利用消息队列实现顺序,同一队列内的消息按序,不同队列无序。生产者发送时会根据选择策略选择队列,消费者则按顺序消费。源码中,send方法(如DefaultMQProducerImpl.send())和consumeMessage方法(如ConsumeMessageOrderlyService.consumeMessageDirectly())具体操作了顺序消息的发送和消费。Apache RocketMQ 远程代码执行漏洞(CVE--)
Apache RocketMQ是一款高效的分布式消息中间件,然而,其在版本5.1.1及以下和4.9.6及以下存在远程代码执行漏洞(CVE--)。此漏洞源于对先前修复(CVE--)的不完善处理,使得在未经授权访问NameServer的情况下,攻击者可以构造恶意请求,源码阅读 知乎以系统用户身份执行命令。
为了验证此漏洞,需要搭建环境。参考了关于CVE--的环境搭建指南。在Linux环境下启动相关服务,使用源码启动RocketMQ。此过程需启动两个服务:NamesrvStartup和BrokerStartup,确保环境变量ROCKETMQ_HOME已配置为ROCKETMQ_HOME=/home/ubuntu/Desktop/rocketmq-rocketmq-all-5.1.0。
漏洞复现通常涉及执行特定脚本或命令。在本例中,运行了一个Python脚本,成功在指定目录下的test.txt文件中写入了“test”字符串。此操作揭示了漏洞的潜在危害。
为助力网络安全学习者,提供了一系列学习资源,包括网安学习成长路径思维导图、+经典常用工具包、+SRC分析报告、+网安攻防实战技术电子书、CISSP认证考试指南、CTF实战技巧手册、网安大厂面试题合集、APP客户端安全检测指南等。
深入分析漏洞,发现org/apache/rocketmq/remoting/protocol/RequestCode.java中的code参数被用于调用特定功能,此处调用的是更新配置操作。根据对应的code,会调用相应的函数进行处理,进一步在org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java中实现。在处理过程中,会调用src/main/java/org/apache/rocketmq/remoting/Configuration.java中的update方法,获取并处理文件路径。具体流程包括:判断是否为可控属性,获取文件路径(configStorePath),然后调用src/main/java/org/apache/rocketmq/common/MixAll.java中的string2File和string2FileNotSafe方法,最终使用IOTinyUtils.java中的writeStringToFile方法进行文件写入。
针对此漏洞的修复措施包括禁用修改配置路径的参数。这将限制攻击者利用该漏洞进行恶意操作,增强系统安全性。
Web中间件简述
中间件(英语:Middleware)是介于应用系统和系统软件之间的一类软件,它包括一组服务,以便于软件各部件之间的交互。
也就是说,中间件可以被理解为:一种能够促进一种或多种应用程序相互合作、资源共享,并为这些应用程序提供相关服务的软件。(注意:中间件是一类软件的总称,而非一个单独的软件)它通常提供以下功能:通信支持、应用支持、公共服务。
一般情况下,一次Web的访问顺序为:web浏览器—服务器(硬件)—web容器—web应用服务器—数据库服务器。
需要注意的是,中间件是一类软件的总称,不是单独的一个软件。
二、中间件的分类
1、事务式中间件
事务式中间件,也称为事务处理管理程序,是目前使用最广泛的中间件之一。它具有高可靠性和极强扩展性等特点,主要应用于电信、金融、飞机订票系统、证券等拥有大量客户的领域。
2、过程式中间件
过程式中间件,也称为远程过程调用中间件。它具有较好的异构支持能力,简单易用,但由于客户和服务器之间采用访问连接,所以在易剪裁性和容错方面存在一定的局限性。
3、面向消息的中间件
面向消息的中间件,简称为消息中间件,是一类以消息为载体进行通信的中间件。它利用高效可靠的消息机制来实现不同应用间大量的数据交换。消息中间件的非直接连接,支持多种通信规程,达到多个系统之间的数据共享和同步。
4、面向对象中间件
面向对象中间件,也称为分布对象中间件,是分布式计算技术和面向对象技术发展的结合。它被称为对象中间件。分布对象模型是面向对象模型在分布异构环境下的自然拓广。
5、Web应用服务器
Web应用服务器是Web服务器和应用服务器相结合的产物,受到广大用户的欢迎,成为中间件市场上竞争的热点。J2EE架构是应用服务器方面的主流标准。
6、其他
新的应用需求、新的技术创新、新的应用领域促成了新的中间件产品的出现。如,ASAAC在研究标准航空电子体系结构时提出的通用系统管理GSM,属于典型的嵌入式航电系统的中间件。互联网云技术的发展云计算中间件、物流网的中间件等随着应用市场的需求应运而生。
三、常见的中间件
1、事务处理中间件——Hadoop
Hadoop实现了分布式计算中的基础算法(如一致算法、选举算法、故障检测、快照等),同时为用户提供了编程和命令接口。
2、消息中间件——QPID
Qpid是Apache开发的一款面向对象的消息中间件,Qpid提供了很多额外的HA特性,非常适合集群环境下的消息通信。
3、面向对象中间件——ICE
ICE作为一种新型的面向对象中间件,目前并未得到广泛地应用。然而它在架构上为应用开发提供的种种好处,如面向对象的语义、支持同步和异步的消息传递、支持多个接口、机器、语言、操作系统无关性、线程支持、位置和服务器的透明性、高度的安全性、内建的恒久机制以及开放的源码等等,它有着非常强大的技术优势。在构建三层分布式系统方面,ICE中间件技术有着良好的发展前景。
3、Web服务器中间件——TOMCAT
Tomcat服务器是一个免费的开放源代码的Web应用服务器,其工作流程如下图所示:
往期回顾:
数据库中间件-cetus源码介绍
数据库中间件Cetus的源码介绍将重点放在其内部流程的解析上。从启动开始,Cetus的执行流程主要从src/mysql-proxy-cli.c文件的main函数出发,调用main_cmdline函数。在正常情况下,启动service后,流程会进入main_cmdline函数中的chassis_mainloop。
chassis_mainloop函数将调用cetus_master_process_cycle,该过程一直传递chassis结构,其包含关键元素。在cetus_master_process_cycle中,程序开启worker_process,主要在cetus_spawn_process函数中进行,之后进入cetus_worker_process_cycle进行初始化。
worker_process通过死循环调用主进程chassis_event_loop,并监听客户端消息。在执行流程中,会经过event_base_loop和ev_run等函数,进一步处理事件。
具体任务处理流程从event_base_loop开始,调用ev_run、ev_invoke_pending、ev_x_cb_io、ev_x_cb,最终到达network_mysqld_con_handle处理传入的SQL语句,并将它们赋值给con->orig_sql。接下来调用normal_read_query_result函数,此函数调用network_mysqld_read_rw_resp处理与后端数据库的消息,并基于返回结果进行后续操作。
总结,Cetus源码中,从启动至执行流程,再到任务处理,构成了一个完整的数据库中间件执行逻辑。其核心在于通过一系列函数调用,实现消息的传递、处理和最终反馈,确保数据的高效、准确处理。流程清晰,结构严谨,体现了Cetus在数据库中间件领域的专业性和高效性。
RocketMQ消息中间件从入门到高级实战教程,让你轻松掌握速来学习!
《消息队列三部曲》的最后篇章,今日重磅推出《消息队列三部曲之RocketMQ》。在深入探讨消息队列的作用前,让我们通过一个实际案例来理解消息队列的重要性。假设我们需要实现用户注册功能,包括信息存入数据库、发送激活邮件与注册短信。采用同步方案,每步ms,总耗时ms。优化后,数据库与邮件、短信并发执行,耗时降至ms。
进一步优化,引入消息队列,数据库操作后向队列发送通知,各模块异步处理邮件与短信,实现整体任务ms完成。消息队列不仅提升了项目性能,还实现了业务模块间的解耦。至此,消息队列的作用已清晰可见。
学习ActiveMQ、RabbitMQ后,RocketMQ的探索将较为轻松。RocketMQ在阿里巴巴高并发场景中经受多年实战考验,其性能与稳定性在众多消息队列中脱颖而出。本套视频教程内容丰富,从源码深入解读,为你揭示消息队列的精髓。
RocketMQ的独特优势,结合《消息队列三部曲》的系统教学,构成了不可多得的消息队列经典教程。视频课程内容精心设计,情节紧凑,带你领略消息队列的奥秘。
欲知更多详情,请访问课程链接。此教程将带你深入了解RocketMQ,助你提升项目性能,实现业务模块解耦。别犹豫,立即开始学习吧!分享你的学习心得,关注、点赞、收藏,共同探索消息队列的无限可能。