使用场景
异步、削峰、解耦
同类比较
- ActiveMQ一般都是老项目使用较多,新项目几乎都不会使用。
- RabbitMQ 企业中使用的也挺多,功能也挺多。但是erlang语言不好调试。延迟极低,微秒级
- RocketMQ 新兴的消息中间件,国内逐渐开始使用,并结合Spring Cloud Alibaba技术使用的越来越多。
- Kafka 一般大数据使用的较多,吞吐量大,但是功能相对单一
基本构成
- producer(生产者)、consumer(消费者)
producer和consumer可看做是rocketmq的客户端,一般依附于业务应用程序。 - brokerServer、nameServer
其中brokerServer和nameServer是rocketmq的服务端,两者一起独立的对外提供服务
producer
consumer 负责消费producer发送的消息。consumer会从brokerServer获取消息,并传递给应用程序。
RocketMQ使用的消息原语是At Least Once(至少一次成功消费),如果一定时间内没有接收到consumer消息确认消费的响应结果,会将同一条消息再次投递给consumer。RocketMQ采用ack机制保证消息的消费成功,所以consumer可能会多次收到同一条消息,需要consumer的业务方做好幂等防护。
从使用者的角度来看,consumer分为两种方式来获取信息。一种是推模式(push consume),推模式看起来像是brokerServer将消息推给了consumer;另一种是拉模式(pull consume),拉模式看起来像是consumer主动的去brokerServer拉取消息(实际上,推模式是基于拉模式实现的)。
BrokerServer
BrokerServer负责消息的接收,存储和分发,是rocketmq最核心,最重量级的组成部分。为实现高可用和高吞吐,brokerServer通常采用集群部署,共同对外提供服务。Broker分主节点(master)和从节点(slave),主节点主要是面向生产者一般用于写操作,从节点主要是面向消费者用于读操作。一个主节点可以有多个从节点,Broker是通过name来分组的,每组中又通过id来区分主从的,id为0表示主节点,非0表示从节点。
NameServer
ameServer负责提供路由元数据。例如,brokerServer通常是集群部署的,其拓扑结构会经常的发生变化。如果每次集群中broker机器的上下线都需要通知所有的消费者、生产者,效率太低。
因此,rocketmq引入了nameServer作为brokerServer路由信息的维护者,broker的每次上下线都和nameServer通信,由nameServer来维护broker的路由信息,而producer和consumer通过访问nameServer获得对应broker的访问地址后,再向对应的broker发起请求。
nameServer解除了broker和客户端的耦合依赖关系,大大提高了效率。nameServer同样能以集群形式对外提供服务,集群内的nameServer服务器并不会互相通信,而是保持相互独立。如果将BrokerServer看做是一个微服务,那么NameServer就是注册中心,生产者发送消息需要从NameServer获取一个可用的BrokerServer,然后再往该BrokerServer中发送消息。
基本概念
Topic(主题)
Topic表示主题的意思,用于表示一类消息的分类名称或者说是一类消息对应的分类编码,生产者在发送消息时都必须指定一个Topic(分类),消费者通过指定分类来表示要具体消费那种消息。Topic就是消息的分类
Tag(标签)
如果说Topic用分类来表示,一般分类可能还会有具体的子类或者称为二级分类,那么Tag就是Topic的二级分类,或者理解为二级Topic。Tag用于对消息再次进行具体细致的分类。
Message(消息)
message消息是rocketmq中传递消息的主体,一般是个JSON字符串,生产者会将该JSON字符串发送到BrokerServer中,消费者会通过BrokerServer获取该JSON字符串来处理业务逻辑。
Message Queue(消息队列)
消息队列是消息的家,用来存储消息的地方。每个Topic默认都会分配4个Message Queue用于存储该Topic下的Message。
集群(Clustering)消费/广播(Broadcasting)消费
集群消费和广播消费是消费的两种方式:
集群消费:同一消费者组下的所有消费者共同瓜分消息,一个消息只能被一个消费者消费。
广播消费:同一消费者组下的所有消费者都能消费到每一条消息,人人有份,不用抢,就像村里的大喇叭一样,广播一响所有人都能听得见。
单机安装
http://rocketmq.apache.org/docs/quick-start/
然后按照官方的命令来即可
环境变量
vi ~/.bash_profile
export ROCKETMQ_HOME=/usr/local/rocketmq-all-4.8.0-bin-release
source ~/.bash_profile
修改两个sh文件broker和server,将jvm内存参数改小。
启动服务端:
# 启动nameser
nohup sh bin/mqnamesrv &
# 查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
#启动broker
nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log