Java 从 0 到架构师目录:【Java从0到架构师】学习记录
基础知识
在分布式微服务架构中,不同服务之间的通信方式主要有两种:
- 通过 RPC 框架,直接远程调用其他服务:Dubbo、Spring Cloud
- 通过消息中间件完成消息的存储和转发:RocketMQ、Kafka、RabbitMQ
常见的消息中间件:
- ActiveMQ:Apache 比较老的一个开源的消息中间件,完全支持 JMS 规范、API 丰富,现在比较少用
- RabbitMQ:实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ 服务器由 Erlang 语言编写的,其集群和故障转移是构建在开放电信平台框架上
- KafKa:Apache 开发的开源流处理平台,由 Scale 和 Java 编写;Kafka 是一种高吞吐量的分布式发布订阅消息系统,可以处理消费者在网站中的所有动作流数据,在大数据领域和日志处理解决方案用的比较多
- RocketMQ:阿里巴巴在 2012 年开源的分布式消息中间件,捐赠给 Apache 基金会,于 2017 年 9 月 25 日成为 Apache 的顶级项目。目前 RocketMQ 在阿里集团被广泛应用在订单、交易、充值、流计算、消息推送、日志流式处理、 binlog 分发等场景。
同步刷盘:当数据写如到内存中之后立刻刷盘(同步),在保证刷盘成功的前提下响应 client(不会丢失数据) 异步刷盘:数据写入内存后,直接响应 client,异步将内存中的数据持久化到磁盘上(会丢失数据)
这里经常遇到的“消息推送”,并不是指将消息推送给用户,而是指:将消息从消息中间件推送到消费者的过程
RocketMQ 的核心特性:
-
低延迟:1ms 内响应的延迟超过 99.6% -
高稳定性:阿里巴巴双十一官方指定消息产品,支撑阿里巴巴集团所有的消息服务,历经十余年高可用与高可靠的严苛考验,是阿里巴巴交易链路的核心产品
服务可用性 99.95%,Region 化、多可用区、分布式集群化部署,确保服务高可用,即便整个机房不可用仍可正常提供消息服务 数据可靠性 99.99999999%,同步双写、超三副本数据冗余与快速切换技术确保数据可靠
-
高性能:历年双 11 购物狂欢节零点千万级 TPS、万亿级数据洪峰,创造了全球最大的业务消息并发以及流转纪录(日志类消息除外);在始终保证高性能前提下,支持亿级消息堆积,不影响集群的正常服务,在削峰填谷(蓄洪)、微服务解耦的场景下尤为重要 -
丰富的消息类型:提供丰富的消息类型,满足各种严苛场景下的高级特性需求,当前支持的消息类型涵盖普通消息、顺序消息(全局顺序 / 分区顺序)、分布式事务消息、定时消息/延时消息
消息中间件的应用
异步解耦
同步方式调用服务:服务和服务之间耦合性比较高,一定要执行完某个服务再执行下一个
异步方式调用服务:系统的耦合性降低,就算某个服务挂掉,也不会影响其他主要业务;等挂掉的服务恢复正常,系统可以继续调用
削峰填谷
消息分发
RocketMQ 核心组件
运行模型:
- 启动服务器 NameServer
NameServer 的作用类似于 ZK 这样的注册中心,主要用于存储元数据的管理,比如每个 Topic 的位置信息 - 启动服务器 Broker
是数据处理服务器,不同的消息存储在不同的 Topic 中;同一个 Topic,为了提高消息处理的并发能力,会有多个 Queue 队列 - 启动生产者,连接 NameServer,获取对应的 Topic 信息,开始创建消息并发送
- 启动消费者,连接 NameServer,获取对应的 Topic 信息,开始消费消息
- NameServer - 名称服务:充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的 Broker IP 列表;多个 Namesrver 实例组成集群,但相互独立,没有信息交换。
- Broker - 消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。
- Topic - 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是 RocketMQ 进行消息订阅的基本单位。
- Queue :为了提高消息处理的并发度,我们的每个消息主题 Topic 会有多个 Queue
- Producer:负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。
- Comsumer:负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从 Broker 服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。
- Message:消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ 中每个消息拥有唯一的 Message ID,且可以携带具有业务标识的 Key。系统提供了通过 Message ID 和 Key 查询消息的功能。
RocketMQ 安装
源码安装
下载源码:
wget https://archive.apache.org/dist/rocketmq/4.7.0/rocketmq-all-4.7.0-source-release.zip
unzip rocketmq-all-4.7.0-source-release.zip -d /usr/local/src
安装 Maven:百度的教程
执行 Maven 构建:
mvn -Prelease-all -Dmaven.test.skip=true clean install -U
-P 激活指定的环境
-U 强制更新本地仓库的文件
当构建完成以后,移动目录:
mv distribution/target/rocketmq-4.7.0/ -R /usr/local/
修改配置参数
为了保证 RocketMQ 正常启动,默认情况会使用比较大的内存,建议给 NameServer 和 Broker 设置 1G 内存:
# 进入到 rocketmq-4.7/bin
# 修改 runbroker.sh 和 runserver.sh 脚本
# 修改以下内容
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 修改为
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
启动
启动 NameServer:
nohup bin/mqnamesrv &
启动 Broker:
nohup bin/mqbroker -n 127.0.0.1:9876 &
查看状态:
# 1 使用jdk命令
jps
# 2 使用操作系统命令
netstat -ntlp
关闭服务:
bin/mqshutdown broker
bin/mqshutdown nameserver
管理控制台安装
https://github.com/apache/rocketmq-externals
管理控制台项目:rocketmq-externals/rocketmq-console
- 本身是一个 SpringBoot 项目
- 打包以后可以直接通过 java -jar 运行,如果需要修改配置文件,可以创建一个 application.properites
# 安装 git
yum install -y git
# 下载源码, 在 /usr/local/src 目录
git clone https://gitee.com/heshengjun/rocketmq-externals.git
# 执行Maven构建
## 进入到管理控制台项目
cd rocketmq-externals/rocketmq-console
mvn package -Dmaven.test.skip=true
# 1 启动rocket服务, 在启动管理控制台之前, 必须先启动NameServer
# 2 在启动目录创建一个application.properties, 配置信息如下:
server.port=9999
rocketmq.config.namesrvAddr=127.0.0.1:9876
# 3 启动管理控制台
nohup java -jar rocketmq-console-ng-1.0.1.jar &
测试项目
# 设置一个NameServer的地址的环境变量
export NAMESRV_ADDR=127.0.0.1:9876
# 启动生产者
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 启动消费者
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
|