消息队列RocketMQ入门实践(一)

文章目录

  • 前言
  • 1、RocketMQ介绍
    • 1.1 RocketMQ简介
    • 1.2 RocketMQ的历史发展
    • 1.3 RocketMQ的核心概念说明
      • Producer
      • Consumer
      • NameServer
      • Broker
    • 1.4 RocketMQ的消息领域模型
      • Message
      • Topic
      • Tag
      • Group
      • Queue
      • Message Queue
      • Offset
  • 2、部署安装
    • 2.1 安装包方式安装
    • 2.2 docker方式安装
      • 2.2.1 拉取镜像
      • 2.2.2 创建nameserver容器
      • 2.2.3 创建broker容器
      • 2.2.4 启动容器
      • 2.2.5 停止删除容器
    • 2.3 部署RocketMQ的UI管理工具
      • 2.3.1 拉取镜像
      • 2.3.2 创建并启动容器
      • 2.3.3 浏览器访问测试
  • 总结


前言

嗨,大家好,我是希留。

自工作以来接触的消息队列中间件有ActiveMQRocketMQKafkaRabbitMQ,虽然接触的不算少,但仅仅只是停留在应用层面,真正原理的地方还是了解的比较少。所以打算边学边写,形成一系列的文章,揭开消息中间件的神秘面纱。

本文算是RocketMQ的开篇文章,下面就和我一起进入学习吧。

1、RocketMQ介绍

1.1 RocketMQ简介

消息队列RocketMQ入门实践(一)_第1张图片

Apache RocketMQ是一个采用Java语言开发的分布式的消息系统,由阿里巴巴团队开发,与2016年底贡献给
Apache,成为了Apache的一个顶级项目。

在阿里内部,RocketMQ 很好地服务了集团大大小小上千个应用,在每年的双十一当天,更有不可思议的万亿级
消息通过 RocketMQ 流转(在 2017 年的双十一当天,整个阿里巴巴集团通过 RocketMQ 流转的线上消息达到了 万
亿级,峰值 TPS 达到 5600 万),在阿里大中台策略上发挥着举足轻重的作用 。

官网地址:http://rocketmq.apache.org/

1.2 RocketMQ的历史发展

消息队列RocketMQ入门实践(一)_第2张图片

  • 阿里巴巴消息中间件起源于2001年的五彩石项目, Notify 在这期间应运而生,用于交易核心消息的流转 。

  • 2010年,B2B开始大规模使用 ActiveMQ 作为消息内核,随着阿里业务的快速发展,急需一款支持顺序消息,拥有海量消息堆积能力的消息中间件, MetaQ 1.0 在 2011 年诞生。

  • 2012年, MetaQ已经发展到了3.0版本,并抽象出了通用的消息引擎 RocketMQ。 随后,对 RocketMQ 进行了开源 , 阿里的消息中间件正式走人了公众视野 。

  • 2015年, RocketMQ已经经历了多年双十一的洗礼,在可用性、可靠性以及稳定性等方面都有出色的表现。与此同时 ,云计算大行其道, 阿里消息中间件基于RocketMQ推出了Aliware MQ 1.0,开始为阿里云上成千上万家企业提供消息服务 。

  • 2016年, MetaQ 在双十一期间承载了万亿级消息的流转,跨越了一个新的里程碑 ,同时 RocketMQ 进入Apache 孵化 。

  • 2017年,RocketMQ正式发布4.0版本,专家称新版本适用于电商领域,金融领域,大数据领域,兼有物联网领域的编程模型。

以上部分内容以及图片来源于《RocketMQ实战与原理解析》

1.3 RocketMQ的核心概念说明

消息队列RocketMQ入门实践(一)_第3张图片

RocketMQ的架构由四大核心部分组成:ProducerConsumerNameServerBroker

Producer

消息生产者,负责产生消息,一般由业务系统负责产生消息。RocketMQ 提供了三种方式发送消息:同步异步单向

  • 同步发送:同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息,例如重要通知邮件、营销短信。

  • 异步发送:异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包,一般用于可能链路耗时较长而对响应时间敏感的业务场景,例如用户视频上传后通知启动转码服务。

  • 单向发送:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。

Consumer

消息消费者,负责消费消息,一般是后台系统负责异步消费。- Consumer也由用户部署,支持PushPull两种消费模式,支持集群消费广播消息,提供实时的消息订阅机制

  • Pull:拉取型消费者(Pull Consumer)主动从消息服务器拉取信息,只要批量拉取到消息,用户应用就会启动消费过程,所以 Pull 称为主动消费型。

  • Push:推送型消费者(Push Consumer)封装了消息的拉取、消费进度和其他的内部维护工作,将消息到达时执行的回调接口留给用户应用程序来实现。所以 Push 称为被动消费类型,但从实现上看还是从消息服务器中拉取消息,不同于 Pull 的是, Push 首先要注册消费监听器,当监听器处触发后才开始消费消息。

NameServer

集群架构中的组织协调员。主要负责对于源数据的管理,包括了对于Topic和路由信息的管理,收集broker的工作情况,不负责消息的处理。

Broker

消息中转角色,负责存储消息,转发消息。

  • 是RocketMQ的核心负责消息的发送、接收、高可用等(真正干活的)
  • 需要定时发送自身情况到NameServer,默认10秒发送一次,超时2分钟会认为该broker失效。

1.4 RocketMQ的消息领域模型

消息队列RocketMQ入门实践(一)_第4张图片
RocketMQ的消息领域模型主要分为Message、Topic、Queue、Offset以及Group这几部分。

Message

消息,就是要传输的信息。

Topic

主题,可以看做消息的规类,不同类型的消息以不同的Topic名称进行区分,如User、Order等。它是消息的第一级类型。一条消息必须有一个主题。

Tag

标签,可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同 Topic 而不同的 Tag 来标识。一条消息可以没有 Tag。

Group

分组,一个组可以订阅多个Topic。

分为ProducerGroup,ConsumerGroup,代表某一类的生产者和消费者,一般来说同一个服务可以作为Group,同一个Group一般来说发送和消费的消息都是一样的。

Queue

队列,每个Queue内部是有序的,在RocketMQ中分为读和写两种队列,一般来说读写队列数量一致,如果不一致就会出现很多问题。

Message Queue

消息队列,主题被划分为一个或多个子主题,即消息队列。
一个 Topic 下可以设置多个消息队列,发送消息时执行该消息的 Topic ,RocketMQ 会轮询该 Topic 下的所有队列将消息发出去。

消息的物理管理单位。一个Topic下可以有多个Queue,Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力。

Offset

在RocketMQ 中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset 来访问,Offset 为 java long 类型,64 位,理论上在 100年内不会溢出,所以认为是长度无限。

也可以认为 Message Queue 是一个长度无限的数组,Offset 就是下标。

以上内容参考 《浅入浅出》-RocketMQ 作者:敖丙 链接:https://juejin.cn/post/6844904008629354504

2、部署安装

2.1 安装包方式安装

  • (1)下载安装包
    下载最新的版本4.9.3 ,wget https://downloads.apache.org/rocketmq/4.9.3/rocketmq-all-4.9.3-bin-release.zip

消息队列RocketMQ入门实践(一)_第5张图片

  • (2)解压
    unzip rocketmq-all-4.9.3-bin-release.zip

消息队列RocketMQ入门实践(一)_第6张图片

  • (3)启动nameserver
    命令:bin/mqnamesrv

后台启动命令:nohup sh mqnamesrv &

image.png
出现错误:Please set the JAVA_HOME variable in your environment, We need java(x64)

原因
在 /usr/local/rocketmq/bin/runserver.sh 文件指定了jdk目录,但是机器上安装的jdk不在该目录里面

解决方式:找到runserver.sh 文件里指定的jdk目录的地方,注释掉,重新写上自己jdk的安装目录。

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_321

消息队列RocketMQ入门实践(一)_第7张图片

重新启动,启动成功

image.png

  • (4)启动broker
    命令:bin/mqbroker -n 42.194.222.32:9876 (#-n 指定nameserver地址和端口)
    后台启动:nohup sh bin/mqbroker -n 42.194.222.32:9876 &

出现错误:Java HotSpot™ 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error=‘Cannot allocate memory’ (errno=12)

原因:RocketMQ的配置默认是生产环境的配置,设置的jvm的内存
大小值比较大。因为内存不够,导致启动失败。

消息队列RocketMQ入门实践(一)_第8张图片

解决方式:调整默认的内存大小参数。

修改runserver.sh文件
消息队列RocketMQ入门实践(一)_第9张图片

修改runbroker.sh文件
消息队列RocketMQ入门实践(一)_第10张图片

重新启动,启动成功

image.png

  • (5)测试发送消息

export NAMESRV_ADDR=42.94.222.32:9876

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

消息队列RocketMQ入门实践(一)_第11张图片
发送成功。

  • (6)测试接收消息
    sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

消息队列RocketMQ入门实践(一)_第12张图片
接收成功。

2.2 docker方式安装

2.2.1 拉取镜像

docker pull foxiswho/rocketmq:server-4.9.3

docker pull foxiswho/rocketmq:broker-4.9.3

2.2.2 创建nameserver容器

docker create -p 9876:9876 --name rmqserver
-e “JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m”
-e “JAVA_OPTS=-Duser.home=/opt”
-v /rmq/rmqserver/logs:/opt/logs
-v /rmq/rmqserver/store:/opt/store
foxiswho/rocketmq:server-4.9.3

2.2.3 创建broker容器

docker create -p 10911:10911 -p 10909:10909 --name rmqbroker
-e “JAVA_OPTS=-Duser.home=/opt”
-e “JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m”
-v /rmq/rmqbroker/conf/broker.conf:/etc/rocketmq/broker.conf
-v /rmq/rmqbroker/logs:/opt/logs
-v /rmq/rmqbroker/store:/opt/store
foxiswho/rocketmq:broker-4.9.3

2.2.4 启动容器

docker start rmqserver rmqbroker

经测试,可以正常发送、接收消息。

2.2.5 停止删除容器

docker stop rmqbroker rmqserver

docker rm rmqbroker rmqserver

2.3 部署RocketMQ的UI管理工具

RocketMQ提供了UI管理工具,名为rocketmq-console,项目地址:https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console

该工具支持docker以及非docker安装,这里我们选择使用docker安装

2.3.1 拉取镜像

pull styletang/rocketmq-console-ng:1.0.0

消息队列RocketMQ入门实践(一)_第13张图片

2.3.2 创建并启动容器

run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=42.194.222.32:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8082:8080 -t styletang/rocketmq-console-ng:1.0.0

消息队列RocketMQ入门实践(一)_第14张图片

2.3.3 浏览器访问测试

通过浏览器进行访问:http://42.194.222.32:8082/#/,
切换语言到中文,所有的功能就一目了然了。
消息队列RocketMQ入门实践(一)_第15张图片

总结

以上就是本文的主要内容了。本文主要介绍了RocketMQ的基础概念以及安装部署,感谢大家的阅读,如有疑问之处,欢迎在评论区留言交流~

下篇文章我们不见不散,敬请期待。

你可能感兴趣的:(消息中间件,Java,java,消息队列,rocketmq)