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平台发布。
为什么要使用消息中间件?
前言
电商订单系统的核心功能包括库存扣减与订单状态更新,然而,在完成这些核心功能后,还涉及许多其他步骤,如红包发放、短信推送通知、积分等。这些步骤可能导致系统性能下降,尤其是富星国际源码高峰期并发量大时,服务器磁盘、IO、CPU负载高,SQL语句执行性能降低,可能需要1秒至2秒甚至更长时间来完成全部步骤。这一过程影响用户体验,用户在支付后等待时间过长会感到不耐烦。因此,解决子步骤过多、速度慢、让用户等待时间过长的问题是订单系统急需解决的问题。
引入消息中间件(Message Queue,MQ)是解决此问题的一大利器。消息中间件允许系统A与系统B之间进行异步通信,通过消息传递来实现系统间的解耦。系统A发送消息给MQ后,完成自己的任务;系统B根据自身情况,可能在消息发送后1秒、1分钟或更长时间后获取并处理消息。这种异步调用机制使得系统A与系统B之间的通信不局限于同步调用,从而提高整体系统性能。
消息中间件在电商系统中的应用包括:处理减库存、红包发放、短信通知、积分等耗时操作,将其解耦到MQ中,让订单系统仅完成核心功能。在大促活动如双期间,大量下单请求可先到MQ中排队,订单系统以数据库可接受的速率完成操作,避免瞬间高并发请求对数据库造成压力。消息中间件的另一重要功能是削峰填谷,通过控制消息处理速率来平衡系统负载。
在实际应用中,需要考虑MQ的性能、可用性、可靠性、功能支持、文档质量、众车宝源码社区活跃度、开源情况、开发语言等多方面因素。目前业界广泛使用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,助你提升项目性能,实现业务模块解耦。别犹豫,立即开始学习吧!分享你的学习心得,关注、点赞、收藏,共同探索消息队列的无限可能。