rocketmq简介

Apache RocketMQ™是一个开源的分布式消息和流数据平台。php

一、既然是消息系统,最核心的功能就是要提供消息的发布与订阅功能,最简单的概念模型以下:java

可是rocketmq提供的能力会比这个复杂的多,如一个生产方发布消息,须要多个消费方订阅,也会存在多个生产方生产消息,一个消费方消费消息,出现一对多,多对一的状况。c++

上图就是扩展了producer、consumer和Topic的概念模型,rocketmq最核心的概念就是Tpoic,producer和consumer都是围绕Topic展开,每一个broker下能够有多个topic,topic下又能够有很对队列messageQueue,相同的topic又能够分布在不一样broker节点下,producer发送消息会轮训的发送到topic的队列下;相同consumer分组是负载均衡订阅消息,不一样的consumer分组之间互不干扰,即便广播订阅消息;同一Topic下的每一个队列只能被相同分组下的一个consumer订阅消费,但一个consumer能够消费多个队列。web

二、总体部署架构图编程

  • nameserver是几乎没有状态的节点,能够集群部署,节点之间也没有任何数据同步。
  • broker的部署相对复杂,是一个数据分散集群,分master和slave,每一个master存储一部分数据,为了数据的高可用,每一个master节点能够有多个slave节点,master之间无数据同步,master与slave之间有数据同步。master和slave之间的关系经过brokerName来绑定,brokerId来定义,即相同的brokerName,brokerId等于0表示master节点,非0表示slave节点。全部的broker节点与nameserver集群的全部节点保持长链接,定时注册Topic信息到全部的nameserver。
  • producer与nameserver集群中的一台(随机)保持长链接,定时获取Topic路由信息,而且与提供Topic服务的broker的master节点保持长链接,并定时发送心跳,producer集群也是无状态的,能够集群部署。
  • consumer与nameserver集群中的一台(随机)保持长链接,定时获取Topic路由信息,而且向提供Topic的broker的master和slave节点都保持长链接,并定时发送心跳,Consumer既能够从 Master 订阅消息,也能够从 Slave 订阅消息,订阅规则由 Broker 配置决定,consumer也是集群的部署的,负载均衡的消费Topic的消息。

三、消息的存储模型架构

rocketmq的消息存储与消费队列是分开的,消息被存储在commitLog下,而后再异步构建消费队列messageQueue,消费队列并不存储真正的消息内容,只是存储消息在commitLog下的偏移量、消息的长度和消息的tag的hashcode。如图所示:负载均衡

  • 全部数据单独存储到一个 Commit Log,彻底顺序写,随机读。
  • 对最终用户展示的队列实际只存储消息在 Commit Log 的位置信息,而且串行方式刷盘。

这样设计有如下优点:异步

  • 队列轻量化,单个队列数据量很是少。
  • 对磁盘的访问串行化,避免磁盘竟争,不会由于队列增长致使 IOWAIT 增高。

但也存在如下缺点:分布式

  • 写虽然彻底是顺序写,可是读却变成了彻底的随机读。
  • 读一条消息,会先读 Consume Queue,再读 Commit Log,增长了开销。
  • 要保证 Commit Log 与 Consume Queue 彻底的一致,增长了编程的复杂度。

四、rocketmq具备如下特色工具

  • 可以保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

与其余消息队列系统的一个对好比下:

消息产品 支持客户端 协议和规范 顺序消息 定时消息 批量消息 广播消息 消息过滤 消息回溯 消息优先级 高可用和故障切换 消息追踪 配置 管理和操做工具 Server Triggered Redelivery 消息存储
ActiveMQ java,c++,php,net 推模型,支持 OpenWire, STOMP, AMQP, MQTT, JMS 独占消费和消息分组支持顺序 支持 不支持 支持 支持 支持 支持 支持,leveldb+zookeeper 不支持 默认配置是低级别的,用户须要优化配置参数 支持 不支持 支持JDBC,leveldb,kahadb
Kafka java,scala 拉模型, 支持TCP 分区内消息有顺序 不支持 支持异步生产者 不支持 支持 支持 不支持 支持,依赖zookeeper 不支持 Kafka使用键值对格式进行配置。这些值能够经过文件提供,也能够经过编程方式提供 支持,使用命令行 不支持 高性能文件存储
RocketMQ java,c++,go 拉模型, 支持TCP, JMS, OpenMessaging 确保消息的严格顺序,并能够优雅地扩展 支持 支持同步模式,以免消息丢失 支持 支持 支持按时间和偏移量 不支持 支持主从模式 支持 开箱即用,用户只需注意一些配置 支持,命令行和web客户端 支持 高性能和低延迟的文件存储
相关文章
相关标签/搜索