rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读

推荐阅读一下下

  • 2020年后想跳槽?MQ、ZK、Nginx、Kafk等分布式技术你都掌握了?
  • 阿里架构师推荐学习的《RabbitMQ实战指南》,渣渣的你都看过吗?

RocketMQ入门手册

RocketMQ是一个分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点,

同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。

具有以下特点:

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

RocketMQ 架构原理分析

RocketMQ 架构

51e489a9e6b0f8768218cac020c7f0f6.png

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几个主要模块组成:

2fec24fe3ba10605c42e934839d1c9c8.png

Remoting Module(远程模块):broker入口,处理来自客户端的请求

Client Manager(客户端管理):管理client(生产者/消费者)并维护消费者的主题订阅

Store Service(存储服务):提供简单的API中数据库中存储或查询消息

HA Service(高可用服务):提供master broker和slave broker之间的数据同步功能

Index Service(索引服务):将message建立索引来提供快速的查询能力

RocketMQ 整体流程

9c0a66642a6a8e92a5901c65422e4aed.png
  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

ee2729b936d6c988162b7332f1a9c136.png

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(消息发送与接收)
    为简单起见,我们使用环境变量: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...

作者:Ccww
原文链接:https://juejin.im/post/5e9571ccf265da47cd35733a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...

一、理解asp.net绑定数据库终于学习到了连接数据库部分的内容,杨中科老师视频看起来挺轻松的,如果是高清版就更ok了。我发现我学习新的编程语言会有一个特点,都想要赶紧学习数据库,数据就是一切,有了数据才能操作一切的…

jetty代理jetty_如何在Jetty中使用SPDY

jetty代理jettySPDY是Google提出的一种新协议,是针对网络的新协议。 SPDY与HTTP兼容,但尝试通过压缩,多路复用和优先级降低网页负载。准确地说,快速的目标是:( http://dev.chromium.org/spdy/spdy-whitepap…

将Java EE与jOOQ结合使用的初学者指南

Java EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的想法是,业务逻辑通常并不像关系代数…

mysql备份需要停应用吗_对于含有innodb表的实例进行文件拷贝备份时必须停mysql实例吗...

展开全部在实际环境中,62616964757a686964616fe59b9ee7ad9431333361313261时不时需要备份恢复单个或多个表(注意:这里除非明确指定,所说的表一律指InnoDB表),而对于innodb引擎恢复单个表需要整体的恢复,xtrabackup也可…

Apache Camel 2.16发布–十大亮点

Apache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名(加1作为奖励)的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是如何将消息发送到端点,uri应该使用消息中的动态值(例如标头)。 在…

[原创软件]体验组批量加分工具

软件主要功能: 从excel批量导入用户QQ、昵称、年龄信息批量粘贴用户QQ或昵称进行筛选批量添加积分软件界面截图: 开发环境及语言: c#.NET Framework 4.0Visual Studio 2015更新日志: v1.2(2016.9.30) 增加格…

java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。特点是:逻辑上相邻的数据元素,其物理次序上也是相邻的。顺序表…

akka连接是什么_什么是Akka?

akka连接是什么在深入探讨什么是Akka之前,让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现,应用程序设计演变为更多的基于流程或任务的设计模型…

c java 系统开发_java开发系统内核:使用C语言开发系统应用程序

更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论我们的操作系统通过增添内核接口导出机制后,已经可以作为平台,运行应用程序…

抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”(不要与吞咽或忽略异常的不良做法相混淆)。 …

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是,尽管也有一些有趣的考虑,但读取模型经常被忽略。 在本文中,我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说,随着我们项目的迭代以及业务的越来越复杂,项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时,我们就需要考虑是否需要对项目进行重构了,或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击,攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击,请按照下面这些通用步骤操作&…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中,我谈到了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行后续介绍。 你好,世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号,而你需要把它们传输到服务器,这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中,这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

ssh图片上传 java_ssh上传并显示图片

struts部分:attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …