1 rocketmq简介
RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
1.能够保证严格的消息顺序
2.提供丰富的消息拉取模式
3.高效的订阅者水平扩展能力
4.实时的消息订阅机制
5.亿级消息堆积能力
消息中间件是典型的生产者-消费者模型,核心作用是解耦,生产者和消费者彼此没有直接依赖,同步化解成了异步
原理:
1. 零拷贝原理:
Consumer消费消息过程,使用了零拷贝,零拷贝包含以下两种方式:
1) 使用mmap+write方式:
优点:即使频繁调用,使用小块文件传输,效率也很高
缺点:不能很好的利用DMA方式,会比sendfile多消耗CPU,内存安全性控制复杂,需要避免JVM Crash问题
2) 使用sendfile方式:
优点:可以利用DMA方式,消耗CPU较少,大块文件传输效率高,无内存安全新问题
缺点:小块文件效率低于mmap方式,只能是BIO方式传输,不能使用NIO
RocketMQ选择了第一种方式,mmap+write方式,因为有小块数据传输的需求,效果会比sendfile更好。
RocketMQ队列
1) RocketMQ队列:
所有数据单独存储到一个Commit Log,完全顺序写,随机读。
对最终用户展现的队列实际只存储消息在Commit Log的位置信息,并且串行方式刷盘。
2) 优点
队列轻量化,单个队列数据量非常少
对磁盘的访问串行化,避免磁盘竟争,不会因为队列增加导致IO WAIT增高
3) 缺点
写虽然完全是顺序写,但是读却变成了完全的随机读
读一条消息,会先读Consume Queue,再读Commit Log,增加了开销
要保证Commit Log与Consume Queue完全的一致,增加了编程的复杂度
4)commitlog重要性
CommitLog中存储了所有的元信息,包含消息体,类似于Mysql、Oracle的redolog,所以只要有CommitLog在,Consume Queue即使数据丢失,仍然可以恢复出来。
刷盘策略
RocketMQ的所有消息都是持久化的,先写入系统PAGECACHE,然后刷盘,可以保证内存与磁盘都有一份数据,访问时直接从内存读取。
同步刷盘与异步刷盘的唯一区别是异步刷盘写完PAGECACHE直接返回,而同步刷盘需要等待刷盘完成才返回,同步刷盘流程如下:
1 写入PAGECACHE后,线程等待,通知刷盘线程刷盘
2 刷盘线程刷盘后,唤醒前端等待线程,可能是一批线程
3 前端等待线程向用户返回成功
初步理解Producer/Consumer Group
Group机制:
通过Group机制,让RocketMQ天然的支持消息负载均衡!,比如某个Topic有9条消息,其中一个Consumer Group有3个实例(3个进程 OR 3台机器),那么每个实例将均摊3条消息!(注意RocketMQ只有一种模式,即发布订阅模式。)
RocketMQ的负载均衡:
RocketMQ提供了两种消息队列轮询:一种是根据Hash值进行轮询,另一种是随机方式
组件介绍:
Name Server是RocketMQ的寻址服务。用于把Broker的路由信息做聚合。客户端依靠Name Server决定去获取对应topic的路由信息,从而决定对哪些Broker做连接。
- Name Server是一个几乎无状态的结点,Name Server之间采取share-nothing的设计,互不通信。
- 对于一个Name Server集群列表,客户端连接Name Server的时候,只会选择随机连接一个结点,以做到负载均衡。
- Name Server所有状态都从Broker上报而来,本身不存储任何状态,所有数据均在内存。
- 如果中途所有Name Server全都挂了,影响到路由信息的更新,不会影响和Broker的通信。
Broker是处理消息存储,转发等处理的服务器
- Broker以group分开,每个group只允许一个master,若干个slave。
- 只有master才能进行写入操作,slave不允许。
- slave从master中同步数据。同步策略取决于master的配置,可以采用同步双写,异步复制两种。
- 客户端消费可以从master和slave消费。在默认情况下,消费者都从master消费,在master挂后,客户端由于从Name Server中感知到Broker挂机,就会从slave消费。
- Broker向所有的NameServer结点建立长连接,注册Topic信息。
2 rocketmq安装(双主集群部署)
https://github.com/apache/rocketmq-externals
2.2 配置ip映射 (修改俩台master中的hosts文件:)
为避免服务器重名出现,建议进行以下操作:
2.3 修改RocketMQ配置
master1服务器
master2服务器
2.4 服务启动(2台机器都要做)
修改日志配置文件
【替换.xml文件中的主机名】
修改启动脚本参数(2台都要配置)
打开runserver配置文件
启动NameServer
启动Broker (master1和master2都要这样做)
3 部署管控台
3.1首先下载https://github.com/apache/incubator-rocketmq-externals
3.2 修改配置文件
server.port 为运行的这个web应用的端口,如果不设置的话默认为8080;
rocketmq.config.namesrvAddr 为rocketmq服务器地址,如果不设置的话默认为“”
rocketmq.config.dataPath 为mq的数据目录,可自定义设置
3.3 编译rocketmq-console
打包完以后会生产target目录
将jar拷到mq目录(这里不是必须的,放在一起是方便后续管理)
3.4. 启动jar包
表示已经起来了