这篇文章主要介绍RocketMQ的功能及搭建好单机版本的消息队列,能够发送并接收简单的消息。
简单来说,分布式消息队列可以提供应用解耦、流量削峰、消息分发等功能,已经成为大型互联网服务架构标配的中间件。
复杂的应用里会存在多个子系统,比如在电商应用中有订单系统、库存系统、物流系统、支付系统等。这个时候如果各个子系统之间的耦合性太高,整体系统的可用性就会大幅降低。多个低错误率的子系统强耦合在一起,得到的是一个高错误率的整体系统。
以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
每年的双十一,淘宝的很多活动都在0点的时候开启,大部分应用系统流量会在瞬间猛增,这个时候如果没有缓冲机制,不可能承受住短时大流量的冲击。通过利用消息队列,把大量的请求暂存起来,分散到相对长的一段时间内处理,能大大提高系统的稳定性和用户体验。
在大数据时代,数据对很多公司来说就像金矿,公司需要依赖对数据的分析,进行用户画像、精准推送、流程优化等各种操作,并且对处理的实时性要求越来越高。数据是不断产生的,各个分析团队、算法团队都要依赖这些数据来进行工作,这个时候有个可持久化的消息队列就非常重要。数据的产生方只需要把各自的数据写入一个消息队列即可,数据使用方根据各自需求订阅感兴趣的数据,不同数据团队所订阅的数据可以重复也可以不重复,互不干扰,也不必和数据产生方关联。
第一代的Notify主要使用了推模型,解决了事务消息;第二代的MetaQ主要使用了拉模型,解决了顺序消息和海量堆积的问题。RocketMQ基于长轮询的拉取方式,兼有两者的优点。此外RocketMQ是使用Java语言开发的,比起Kafka的Scala语言和RabbitMQ的Erlang语言,更容易找到技术人员进行定制开发。
从RocketMQ官网链接下载,我们以4.9.2 release的Binary版本为例说明如何快速使用
unzip rocketmq-all-4.9.2-bin-release.zip -d rocketmq-all-4.9.2
cd rocketmq-all-4.9.2/rocketmq-4.9.2
里面含有以下内容
LICENSE NOTICE README.md benchmark bin conf lib
LICENSE、NOTICE和README.md包括一些版权声明和功能说明信息;benchmark里包括运行benchmark程序的shell脚本;bin文件夹里含有各种使用RocketMQ的shell脚本(Linux平台)和cmd脚本(Windows平台),比如常用的启动NameServer的脚本mqnamesrv,启动Broker的脚本mqbroker,集群管理脚本mqadmin等;conf文件夹里有一些示例配置文件,包括三种方式的broker配置文件、logback日志配置文件等,用户在写配置文件的时候,一般基于这些示例配置文件,加上自己特殊的需求即可;lib文件夹里包括RocketMQ各个模块编译成的jar包,以及RocketMQ依赖的一些jar包,比如Netty、commons-lang、FastJSON等。
启动单机的消息队列服务比较简单,不需要写配置文件,只需要依次启动本机的NameServer和Broker即可。
nohup sh bin/mqnamesrv &
# 查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
2022-07-19 15:44:52 INFO main - The Name Server boot success. serializeType=JSON
tail -f ~/logs/rocketmqlogs/broker.log
# 查看日志
nohup sh bin/mqbroker -n localhost:9876 &
2022-07-19 15:48:55 INFO main - The broker[%s, localhost:10911] boot success. serializeType=JSON and name server is localhost:9876
2022-07-19 15:49:05 INFO BrokerContro
export NAMESRV_ADDR=localhost:9876
# 发送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 查询发送消息日志
SendResult [sendStatus=SEND_OK, msgId=7F00000124887F31245A652AC2C003E7, offsetMsgId=C0A868AB00002A9F0000000004CAA3A0, messageQueue=MessageQueue [topic=TopicTest, brokerName=hostname, queueId=2], queueOffset=281]发送日志
# 消费消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
# 查询消费消息日志
ConsumeMessageThread_8 Receive New Messages: [MessageExt [brokerName=hostname, queueId=2, storeSize=192, queueOffset=273, sysFlag=0, bornTimestamp=1658302101168, bornHost=/ip:53454, storeTimestamp=1658302101168, storeHost=/ip:10911, msgId=C0A868AB00002A9F0000000004CA8BA0, commitLogOffset=80382880, bodyCRC=1177128659, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=282, CONSUME_START_TIME=1658302499991, UNIQ_KEY=7F00000124887F31245A652AC2B003C7, CLUSTER=DefaultCluster, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 54, 55], transactionId='null'}]]
从最简单的消息发送和接收入手,理解消息队列提供的功能,为后续遇到的场景提供解决方案。
如果您觉得有帮助,欢迎收藏点赞哦 ~ ~ 多谢~