源码编译过程-从零开始学习RocketMQ(一)-RocketMQ灯光布置概述及源码编译

说到RocketMQ,就不得不布局MessageQueue,简称MQ。 据我了解,消息队列虽然是一种常规的数据结构,比如FIFO。 这类模型可以形象地产生一个生产者-消费者模型,即生产者将数据放入队列,然后消费者从队列中取出数据。 在这个过程中,生产者和消费者可能不在同一个项目中,也可能是不同业务类型的应用,而生产者和消费者具有相同的数据处理能力。所以我们可以总结一下消息队列的几个功能

业务前馈:例如,销售系统会在用户付款成功后更新订单状态,但下单时会扣除锁定库存。 传统的单一项目可能是一条业务线到底,但随着互联网的发展,很多服务在单一业务的原则下只处理一类业务,这样MQ就可以起到业务前馈的作用。 支付成功后,支付系统发送消息通知消费者交易成功,以便订阅此队列的消费者可以接收、更新订单、扣除库存。 削峰填谷:这个比较容易理解。 在高并发场景下,个别业务不一定要立即执行。 借助MQ,可以有效降低系统压力。 比如1000人同时登录系统,如果不使用MQ,可能会减少登录后的点数、记录日志等,串行化处理服务会减少登录响应时间。 这就是利用MQ来减少并发的流量,转换成MQ,信用系统可以根据自己的吞吐量来消化那些业务,而不是直接抵制高并发请求,慢慢处理峰值流量。 异步:从里面两点可以看出,无论是业务前馈整合还是削峰填谷,都不是序列化执行,虽然生产者和消费者是异步的。

好吧,我们回到RocketMQ。 是阿里开源的MQ中间件。 早期,为了传输交易的核心数据,阿里需要一个可以存储海量消息但支持顺序消息的MQ。 于是,内部研发开始了。 名为MetaQ的中间件在2012年版本迭代后被封装到RocketMQ中并开源。 经过多年的双11促销以及阿里巴巴内部上千的应用,RocketMQ早已成为高性能、高可用、稳定性强的消息中间件。

安利了这么多RocketMQ,我们先看一下它的结构

RocketMQ架构图

从上图可以看出,RocketMQ分为几个部分,包括Producer集群、Consumer集群、NameServer集群、Broker集群组。 下面一一梳理各部分的功能和工作流程。

信息

消息显然是一个PO对象,其中包含一些特殊的属性,比如Topic、唯一的MessageId、消息体等。

制片人 制片人

它是业务发送数据方的系统的同义词,生产者将按照RocketMQ指定的格式将消息投递到Broker。 那么问题来了,他是怎么得到Broker的邮寄地址的呢? 下面介绍完NameServer就清楚了。 生产者传递的消息可以分为顺序传递、同步传递、异步传递、双向传递来传递消息。

消费者

作为下游业务系统的同义词,消费者会通过Push和Pull方法从Broker获取消息来进行后续业务,从Broker获取消息的原理与Producer相同。

NameServer是一个类似于Zookeeper的注册中心

在当今的分布式架构设计中,注册表扮演着举足轻重的角色。 在RocketMQ集群环境中,Broker会与各个NameServer节点连接并保持脉冲通信,并将Broker的连接信息、Topic等信息同步到NameServer。 每个NameServer都包含集群中所有Broker的信息,比如Topic对应的Broker信息。 Producer和Consumer根据Topic生产或消费信息时,会返回对应的Broker信息,然后Broker和Producer/Consumer之间建立连接用于发送和消费消息,NameServer之间不进行通信。

Broker我从来没想过哪个名字比较好安利,官方的名字是代理服务器

Broker在RocketMQ架构中扮演着最重要的角色。 它将与所有名称服务器连接和通信以实现高可用性。 它负责存储和转发Producer下发的消息,并负责创建和管理Topic。

接下来,让我们运行RocketMQ。 首先,从GitHub获取源代码。 如果您是新学者,可以下载已经编译好的二进制补码代码文件。 这里我将以源码的形式启动RocketMQ,为进一步了解RocketMQ做好计划。 GitHub地址已经编译好RocketMQ连接

RocketMQ源码结构

已经简单介绍了该模块的功能。 可以知道Producer、Consumer、Broker都依赖于NameServer,所以先启动NameServer,对应的源码模块为namesrv。 请设置环境中的ROCKETMQ_HOME变量以匹配RocketMQ安装的位置',在环境变量中设置ROCKETMQ_HOME=/rocketmq/distribution即可正常启动,当右侧输出显示NameServer启动成功

名称服务器启动成功

然后启动Broker,启动类org.apache.rocketmq.broker.BrokerStartup#main,同样第一次启动也需要在配置ROCKET_MQ的前提下进行,从里面的结构图可以看到Broker要和NameServer建立连接,所以我们需要指定NameServer的地址,所以在环境变量中指定NAMESRV_ADDR=localhost:9876,启动成功后会出现如右图所示

经纪商启动成功

拿出来启动生产者和消费者。 我先用源码中的示例代码来演示一下生产者和消费者。 在梳理各个模块的时候源码编译过程,我会写一些代码来演示

首先启动生产者org.apache.rocketmq.example.quickstart.Producer#main,这里可以看到有Specifynameserveraddresses。或者可以在代码注释中指定nameserveraddressesviaexportingenvironmentalvariable:NAMESRV_ADDR,也就是说需要指定NameServer来启动生产者。 可以配置环境变量NAMESRV_ADDR,虽然也可以在DefaultMQProducer类中设置namesrvAddr属性,但这里我使用第二个设置为localhost:9876,如图

开始制作人

可以看到,启动生产者后,已经在向RocketMQ发送消息了,同样的方式启动消费者,如图

启动消费者

可以看到,消费者启动成功后,立即消费了生产者刚才产生的1000条消息,这就证明启动成功了。

至此,如果已经整理好了MQ的基本原理、RocketMQ的概念和发展历史、RocketMQ的结构图以及各个模块的功能源码编译过程,最后从从源码角度来看,这里 RocketMQ 已经算是一个介绍了。 前面我从源码的角度深入梳理了各个模块的原理,并通过例子进行了演示。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 源码编译过程-从零开始学习RocketMQ(一)-RocketMQ灯光布置概述及源码编译 https://www.wkzy.net/game/151200.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务