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 核心组件

运行模型:

  1. 启动服务器 NameServer
    NameServer 的作用类似于 ZK 这样的注册中心,主要用于存储元数据的管理,比如每个 Topic 的位置信息
  2. 启动服务器 Broker
    是数据处理服务器,不同的消息存储在不同的 Topic 中;同一个 Topic,为了提高消息处理的并发能力,会有多个 Queue 队列
  3. 启动生产者,连接 NameServer,获取对应的 Topic 信息,开始创建消息并发送
  4. 启动消费者,连接 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 基础 - 应用、核心组件、安装相关推荐

  1. 【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令

    分布式基石 Zookeeper 框架全面剖析 Zookeeper 安装.配置.运行 Zookeeper 的核心工作机制 特性 数据结构.节点 基本操作命令 服务器的启动和监控 客户端连接 创建节点 查 ...

  2. 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot

    RocketMQ 消息中间件 集成 SpringBoot 入门案例 生产消息类型 - 同步.异步.一次性 消费模式 - 集群.广播 延时消息 设置消息标签 设置消息的 Key 自定义属性设置 消息过滤 ...

  3. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息

    RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...

  4. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

  5. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  6. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  7. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  8. 【Java从0到架构师】SpringMVC - 基础

    SpringMVC - 基础 SpringMVC - 入门 web.xml 配置 DispatcherServlet appliactionContext.xml 新建 Controller Spri ...

  9. 【Java从0到架构师】MySQL 基础

    MySQL MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DDL 语句 - 数据库 DDL 语句 - 表 常用数据类型 - 数字类型 常用数据类型 ...

最新文章

  1. 回顾2016,展望2017
  2. X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作
  3. Hyperledger Fabric 智能合约实战 (5) go语言开发
  4. 安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版
  5. vue和java实现页面增删改_SpringBoot-Vue实现增删改查及分页小DEMO
  6. Angular4.0环境搭建详解--windows系统环境
  7. 10篇写给Git初学者的最佳教程
  8. Python文档阅读笔记-PyAutoGUI基本使用
  9. python封装举例_Python+Pycharm—学习1—封装导入
  10. golang 交叉编译总结
  11. 《如何搭建小微企业风控模型》第十一节 逻辑回归与评分卡 节选
  12. 访问tomcat7 java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl
  13. [题解] 2038: [2009国家集训队]小Z的袜子(hose)
  14. TortoiseSVN使用教程
  15. Markdown自定义CSS样式
  16. 弹幕服务器维护,分布式弹幕服务架构
  17. 江门android培训,基于selenium模块的江门市干部培训网络学院自动选课脚本
  18. 使用C/C++编程控制LEGO EV3
  19. 【PS】抠图,快速选择工具
  20. java小红球下载_小红球闯关

热门文章

  1. 创业几乎不要本钱,是创业圈内最大的谎言
  2. 垄断者 Google Chrome 若被迫分拆,谁将会接盘?
  3. JS基础--组合继承,寄生组合式继承
  4. Python安装第三方库临时使用国内源
  5. ubuntu下使用脚本自动禁用笔记本触摸板和键盘
  6. 如何对AWS RDS SQL Server数据库进行分类
  7. ssrs批量权限管理_管理SSRS安全性并使用PowerShell自动化脚本
  8. Java foreach remove问题分析
  9. BZOJ 3668: [Noi2014]起床困难综合症【二进制+贪心】
  10. ASP.NET 4.0 来了