【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
RocketMQ 消息中间件
- 基础知识
- 消息中间件的应用
- 异步解耦
- 削峰填谷
- 消息分发
- RocketMQ 核心组件
- RocketMQ 安装
- 源码安装
- 修改配置参数
- 启动
- 管理控制台安装
- 测试项目
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.zipunzip 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 brokerbin/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
【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装相关推荐
- 【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令
分布式基石 Zookeeper 框架全面剖析 Zookeeper 安装.配置.运行 Zookeeper 的核心工作机制 特性 数据结构.节点 基本操作命令 服务器的启动和监控 客户端连接 创建节点 查 ...
- 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot
RocketMQ 消息中间件 集成 SpringBoot 入门案例 生产消息类型 - 同步.异步.一次性 消费模式 - 集群.广播 延时消息 设置消息标签 设置消息的 Key 自定义属性设置 消息过滤 ...
- 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息
RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...
- 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】Redis 基础 - 数据类型
Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...
- 【Java从0到架构师】Linux 基础知识、常用命令
Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...
- 【Java从0到架构师】SpringMVC - 基础
SpringMVC - 基础 SpringMVC - 入门 web.xml 配置 DispatcherServlet appliactionContext.xml 新建 Controller Spri ...
- 【Java从0到架构师】MySQL 基础
MySQL MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DDL 语句 - 数据库 DDL 语句 - 表 常用数据类型 - 数字类型 常用数据类型 ...
最新文章
- 回顾2016,展望2017
- X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作
- Hyperledger Fabric 智能合约实战 (5) go语言开发
- 安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版
- vue和java实现页面增删改_SpringBoot-Vue实现增删改查及分页小DEMO
- Angular4.0环境搭建详解--windows系统环境
- 10篇写给Git初学者的最佳教程
- Python文档阅读笔记-PyAutoGUI基本使用
- python封装举例_Python+Pycharm—学习1—封装导入
- golang 交叉编译总结
- 《如何搭建小微企业风控模型》第十一节 逻辑回归与评分卡 节选
- 访问tomcat7 java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl
- [题解] 2038: [2009国家集训队]小Z的袜子(hose)
- TortoiseSVN使用教程
- Markdown自定义CSS样式
- 弹幕服务器维护,分布式弹幕服务架构
- 江门android培训,基于selenium模块的江门市干部培训网络学院自动选课脚本
- 使用C/C++编程控制LEGO EV3
- 【PS】抠图,快速选择工具
- java小红球下载_小红球闯关
热门文章
- 创业几乎不要本钱,是创业圈内最大的谎言
- 垄断者 Google Chrome 若被迫分拆,谁将会接盘?
- JS基础--组合继承,寄生组合式继承
- Python安装第三方库临时使用国内源
- ubuntu下使用脚本自动禁用笔记本触摸板和键盘
- 如何对AWS RDS SQL Server数据库进行分类
- ssrs批量权限管理_管理SSRS安全性并使用PowerShell自动化脚本
- Java foreach remove问题分析
- BZOJ 3668: [Noi2014]起床困难综合症【二进制+贪心】
- ASP.NET 4.0 来了