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 整体流程

  1. 启动 NameServer,NameServer启动后进行端口监听,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心

  2. Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包

    • 心跳包中,包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息

    • 注册成功后,Namesrv 集群中就有 Topic 跟 Broker 的映射关系

  3. 收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在哪些 Broker上。也可以在发送消息时自动创建Topic

  4. Producer 发送消息

    • 启动时,先跟 Namesrv 集群中的其中一台建立长连接,并从Namesrv 中获取当前发送的 Topic 存在哪些 Broker 上

    • 然后跟对应的 Broker 建立长连接,直接向 Broker 发消息

  5. 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单机版安装

  1. 下载编译源码

      # 下载$ 
    > 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
  2. 启动 Name Server

     # 启动 Name Server 服务
    > nohup sh bin/mqnamesrv &
    # 启动完成后,查看日志$
    > tail -f ~/logs/rocketmqlogs/namesrv.log
    The Name Server boot success...
  3. 启动 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 地址

  4. 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入门手册,才能再次深入解读的更多相关文章

  1. RocketMQ入门手册

    前言 继我上一篇博客后 分布式消息队列RocketMQ学习教程① 上一篇博客最主要介绍了几种常用的MQ,所以本博客再简单介绍一下RocketMQ的原理和简单的例子,基于Java实现,希望可以帮助学习者 ...

  2. MyBean 框架入门手册<感谢[青铜]整理的如此细致和系统>

    MyBean 框架入门手册 2014/9/15 by lighttop 目 录 MyBean 框架学习笔记............................................... ...

  3. RocketMQ入门(3)拉取消息

    转自:http://www.changeself.net/archives/rocketmq入门(3)拉取消息.html RocketMQ入门(3)拉取消息 RocketMQ不止可以直接推送消息,在消 ...

  4. RocketMQ入门(2)最佳实践

    转自:http://www.changeself.net/archives/rocketmq入门(2)最佳实践.html RocketMQ入门(2)最佳实践 一.服务端安装部署 我是在虚拟机中的Cen ...

  5. DPDK2.1 linux上开发入门手册

    1引言 本文档主要包含INTEL DPDK安装和配置说明.目的是让用户快速的开发和运行程序.文档描述了如何在不深入细节的情况下在linux应用开发环境上编译和运行一个DPDK应用程序. 1.1文档总览 ...

  6. 【Webpack】320- Webpack4 入门手册(共 18 章)(下)

    介绍 1. 背景 最近和部门老大,一起在研究团队[EFT - 前端新手村]的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平. 本文也是属于[E ...

  7. RocketMQ入门到入土(一)新手也能看懂的原理和实战!

    学任何技术都是两步骤: 搭建环境 helloworld 我也不例外,直接搞起来. 一.RocketMQ的安装 1.文档 官方网站 http://rocketmq.apache.org GitHub h ...

  8. RocketMQ入门到入土(二)事务消息&顺序消息

    接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...

  9. 消息队列扫盲(RocketMQ 入门)

    消息队列扫盲 消息队列顾名思义就是存放消息的队列,队列我就不解释了,别告诉我你连队列都不知道似啥吧? 所以问题并不是消息队列是什么,而是 消息队列为什么会出现?消息队列能用来干什么?用它来干这些事会带 ...

随机推荐

  1. Python查看3Dnii文件

    from nibabel.viewers import OrthoSlicer3D from nibabel import nifti1 import nibabel as nib from matp ...

  2. 模块 subprocess 交互shell

    subprocess 交互shell 执行shell命令, 与操作系统交互 三种执行命令的方法 subprocess.run(*popenargs, input=None, timeout=None, ...

  3. Day13 流程控制

    Linux中的流程控制语句 一.if语句 1.单分支if条件语句 格式:if [ 条件判断式 ] then 程序     fi 注意:1.在Linux中是以if开头,fi结尾.其他地方一般是{开头,} ...

  4. Activiti组任务

    一.Candidate-users候选人 1.需求 在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义 ...

  5. NKOJ4270 小奇挖矿2

    问题描述 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小 ...

  6. B - 来找一找吧 HihoCoder - 1701(排列组合 + 同余差值相同)

    这次到渣渣问桶桶了... 准备给你n个数a1, a2, ... an,桶桶你能从中找出m个特别的整数吗,我想让任意两个之差都是k的倍数. 请你计算有多少种不同的选法.由于选法可能非常多,你只需要输出对 ...

  7. 字符串学习笔记(一)---- String介绍

    一.String类的特点 1.字符串对象一旦被初始化就不会被改变: (1)常见问题 a public static void main(String[] args) { String a = &quo ...

  8. FileReader与URL.createObjectURL实现图片、视频上传前预览

    之前做图片.视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览.实际上这只是文件“上传后再预览”,这既浪 ...

  9. qq群排名靠前最新方法

    QQ群排名这几年是越来越火,因为很多灰产业都选择做QQ群排名,毕竟没有那么严,那么要做QQ群排名虽然不难,但是还是需要一点技术和软件的. https://url.cn/5JbR4C8 QQ群排名分为如 ...

  10. DevEco Toolkit使用指南--平行视界

      高效开发和创新业务是开发者一直追求的目标,当接到开发需求时,如果可以找到现成的API调用,能为开发者节省大把时间,将会留有更多的时间进行业务的创新.华为DevEcoToolkit聚合了华为丰富的开 ...