必须先理解的RocketMQ入门手册,才能再次深入解读
RocketMQ入门手册
RocketMQ是一个分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点,
同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
具有以下特点:
能够保证严格的消息顺序
提供丰富的消息拉取模式
高效的订阅者水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
RocketMQ 架构原理分析
RocketMQ 架构
NameServer (名称服务器):
提供轻量级的服务发现和路由。NameServer接受来自Broker群集的注册,并提供检测信号机制以检查Broker是否还存在
每个NameServer记录完整的路由信息(Broker 相关 Topic 等元信息,并给 Producer 提供 Consumer 查找 Broker 信息),提供相应的读写服务。
Broker(消息服务器): 消息存储中心,接收来自 Producer 的消息并存储, Consumer 从这里取得消息
单个Broker节点与所有的NameServer节点保持长连接及心跳,并会定时将Topic信息注册到NameServer,(其底层通信是基于Netty实现的)
Broker负责消息存储,以Topic为维度支持轻量级的队列,单机可以支撑上万队列规模,支持消息推拉模型。
具有上亿级消息堆积能力,同时可严格保证消息的有序性
Producer (生产者):
负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息
生产者支持分布式部署。 分布式生产者通过多种负载平衡模式将消息发送到Broker集群。 发送过程支持快速失败并且延迟低
三种方式发送消息:同步、异步和单向
Consumer(消费者):
负责消费消息,消费者从消息服务器拉取信息并将其输入用户应用程序
也支持“推和拉”模型中的分布式部署。
它还支持集群使用和消息广播。 它提供了实时消息订阅机制,可以满足大多数消费者的需求。
Broker Server
Broker Server负责消息的存储和传递,消息查询,HA高可用等,Broker Server几个主要模块组成:
Remoting Module(远程模块):broker入口,处理来自客户端的请求
Client Manager(客户端管理):管理client(生产者/消费者)并维护消费者的主题订阅
Store Service(存储服务):提供简单的API中数据库中存储或查询消息
HA Service(高可用服务):提供master broker和slave broker之间的数据同步功能
Index Service(索引服务):将message建立索引来提供快速的查询能力
RocketMQ 整体流程
启动 NameServer,NameServer启动后进行端口监听,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心
Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包
心跳包中,包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息
注册成功后,Namesrv 集群中就有 Topic 跟 Broker 的映射关系
收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在哪些 Broker上。也可以在发送消息时自动创建Topic
Producer 发送消息
启动时,先跟 Namesrv 集群中的其中一台建立长连接,并从Namesrv 中获取当前发送的 Topic 存在哪些 Broker 上
然后跟对应的 Broker 建立长连接,直接向 Broker 发消息
Consumer 消费消息
跟其中一台 Namesrv 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上
然后直接跟 Broker 建立连接通道,开始消费消息*RocketMQ的消息领域模型
RocketMQ Message
Topic(主题): 表示消息的第一级类型,是最细粒度的订阅单位(生产者传递消息和消费者提取消息标识)
一条消息必须有一个Topic
一个Group可以订阅多个Topic的消息
Topic一般为领域范围,比如交易消息
Tag(标签): 表示消息的第二级类型,可以是使用相同的Topic不同的Tag来表示同一业务模块的不同任务的消息,比如交易消息又可以分为:交易创建消息,交易完成消息等
助于保持代码整洁和一致
简化RocketMQ提供的查询系统
Message(消息体): 消息是要传递的信息。 Message中必须包含一个Topic,可选Tag和key-vaule键值对
Message Queue(消息队列): 所有消息队列都是持久化
一个Topic下可以有多个Queue
Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力
Group(组): 分为Producer Group(生产者组)和Consumer Group(消费者组),具有相同角色组成Group
原生产者在交易后崩溃,broker可以联系同一生产者组的不同生产者实例以进行提交或回退交易。
消费者组的消费者实例必须具有完全相同的主题订阅
RocketMQ 特性
Message Model(消息模式):
Clustering(集群式):当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可
Broadcasting(广播式):当使用广播消费模式时,MQ 会将每条消息推送给集群内所有注册过的客户端,保证消息至少被每台机器消费一次
Message Order(消息顺序)
使用DefaultMQPushConsumer时,可以决定按顺序或同时使用消息
Orderly:有序地使用消息意味着消息的消费顺序与生产者为每个消息队列发送消息的顺序相同。( 如果要处理必须强制执行全局顺序的情况,请确保您使用的主题只有一个消息队列)
如果指定按顺序使用,则消息使用的最大并发度是使用者组订阅的消息队列数
Concurrently:同时使用消息时,消息使用的最大并发性仅受为每个使用方客户端指定的线程池限制
在此模式下不再保证消息顺序
Message Types(消息类型)
事务消息
顺序消息
延迟消息
RocketMQ单机版安装
下载编译源码
# 下载$
> wget wget http://mirror.bit.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-source- >
# 解压$
>unzip rocketmq-all-4.7.0-source-release.zip
> cd rocketmq-all-4.7.0/
# 编译$
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/target/rocketmq-4.7.0/rocketmq-4.7.0启动 Name Server
# 启动 Name Server 服务
> nohup sh bin/mqnamesrv &
# 启动完成后,查看日志$
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...启动 Broker
在
conf
目录下,RocketMQ 提供了多种 Broker 的配置文件:broker.conf
:单主,异步刷盘。2m/
:双主,异步刷盘。2m-2s-async/
:两主两从,异步复制,异步刷盘。2m-2s-sync/
:两主两从,同步复制,异步刷盘。dledger/
:Dledger 集群,至少三节点
# 启动 Broker服务
> nohup sh bin/mqbroker -n localhost:9876 &
# 启动完成后,查看日志$
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...其中,参数:
通过
-c
参数,配置读取的主 Broker 配置通过
-n
参数,设置 RocketMQ Namesrv 地址
Send & Receive Messages(消息发送与接收)
在发送/接收消息之前,我们需要告知client(生产者/消费者)Name Servers的地址。 RocketMQ提供了多种方法来实现:
在代码中设置:producer.setNamesrvAddr("ip:port")
java属性配置:rocketmq.namesrv.addr
环境变量配置:NAMESRV_ADDR
HTTP Endpoint
为简单起见,我们使用环境变量:NAMESRV_ADDR,如下所示:
# 设置 Name Servers的地址$
> export NAMESRV_ADDR=localhost:9876
# 生产消息$
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
# 消费消息$
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
各位看官还可以吗?喜欢的话,动动手指点个
必须先理解的RocketMQ入门手册,才能再次深入解读的更多相关文章
- RocketMQ入门手册
前言 继我上一篇博客后 分布式消息队列RocketMQ学习教程① 上一篇博客最主要介绍了几种常用的MQ,所以本博客再简单介绍一下RocketMQ的原理和简单的例子,基于Java实现,希望可以帮助学习者 ...
- MyBean 框架入门手册<感谢[青铜]整理的如此细致和系统>
MyBean 框架入门手册 2014/9/15 by lighttop 目 录 MyBean 框架学习笔记............................................... ...
- RocketMQ入门(3)拉取消息
转自:http://www.changeself.net/archives/rocketmq入门(3)拉取消息.html RocketMQ入门(3)拉取消息 RocketMQ不止可以直接推送消息,在消 ...
- RocketMQ入门(2)最佳实践
转自:http://www.changeself.net/archives/rocketmq入门(2)最佳实践.html RocketMQ入门(2)最佳实践 一.服务端安装部署 我是在虚拟机中的Cen ...
- DPDK2.1 linux上开发入门手册
1引言 本文档主要包含INTEL DPDK安装和配置说明.目的是让用户快速的开发和运行程序.文档描述了如何在不深入细节的情况下在linux应用开发环境上编译和运行一个DPDK应用程序. 1.1文档总览 ...
- 【Webpack】320- Webpack4 入门手册(共 18 章)(下)
介绍 1. 背景 最近和部门老大,一起在研究团队[EFT - 前端新手村]的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平. 本文也是属于[E ...
- RocketMQ入门到入土(一)新手也能看懂的原理和实战!
学任何技术都是两步骤: 搭建环境 helloworld 我也不例外,直接搞起来. 一.RocketMQ的安装 1.文档 官方网站 http://rocketmq.apache.org GitHub h ...
- RocketMQ入门到入土(二)事务消息&顺序消息
接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...
- 消息队列扫盲(RocketMQ 入门)
消息队列扫盲 消息队列顾名思义就是存放消息的队列,队列我就不解释了,别告诉我你连队列都不知道似啥吧? 所以问题并不是消息队列是什么,而是 消息队列为什么会出现?消息队列能用来干什么?用它来干这些事会带 ...
随机推荐
- 常见Web安全漏洞--------CSRF
1,CSRF (Cross Site Request Forgery, 跨站域请求伪造),也可以说是模拟请求. 2,黑客获取到了token 令牌,发送恶意模拟请求,攻击网站,防御方法可以参考api 接 ...
- 详谈XSS防御方法
1.HttpOnly 严格的说,httponly并非为了对抗XSS,它解决的是XSS后的Cookie劫持攻击.Cookie设置了httponly之后,JavaScript读不到该cookie的值. ...
- B 雷诺与奴隶主
时间限制 : 5000 MS 空间限制 : 524288 KB 问题描述 自从周文武老师在班上吹嘘了"录试"这款游戏之后,PHD同学沉迷于其中无法自拔. "录试&qu ...
- Luogu 1008 三连击
题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三 ...
- 使用Shiro+JWT完成的微信小程序的登录(含讲解)
使用Shiro+JWT完成的微信小程序的登录 源码地址https://github.com/Jirath-Liu/shiro-jwt-wx 微信小程序用户登陆,完整流程可参考下面官方地址,本例中是按此 ...
- HashMap源码与相关面试题
一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...
- CPU、内存、硬盘、指令之间的关系
我们都知道所有的程序最终都是一系列计算机能够识别的指令和数据,通过执行这些指令来控制整个计算机. 而CPU就是负责读取和解释执行这些指令的,CPU主要包括运算器.控制器和寄存器,控制器负责把指令.数据 ...
- C/C++ 数据精确度的设置
#include<iostream>#include<iomanip> //此库为代码最后一行快捷设置数据格式需要用的的库 #include<math.h>usin ...
- 30.5 Map遍历方法
package day30_2_Map; import java.util.HashMap; import java.util.Map; import java.util.Set; /* 方法一.用e ...
- 30.2 案例:ArrayList本身数据可以重复,写出去重的方法
package day30_HashSet; /* * ArrayList特点(实现List接口) 有序.可以重复.可以使用索引 *使用ArrayList实现数据去重 * */ import java ...