IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> RocketMQ架构及原理 -> 正文阅读

[大数据]RocketMQ架构及原理

RocketMQ源于阿里,原名MetaQ,后捐献给apache,支持Java、C/C++、Python、Go

架构设计核心特性

NameServer

路由中心/注册中心,管理Broker,类似于kafka中的zookeeper,负责Broker节点注册,Producer和Consumer发送和消费消息会先去NameServer中查找可用的Broker节点;Broker节点在启动的时候就会去查找配置文件中有哪些NameServer,然后在所有的NameServer中注册自己建立长连接,之后每隔30秒发送一个心跳告诉NameServer当前节点还存活可用;而NameServer也会定时每隔10秒查看列表中哪些Broker长时间没有发送心跳,如果120秒没有发送心跳就会将Broker从列表中移除。

?那么RocketMQ为什么不用zookeeper而选择自己造一个NameServer呢?

(1)因为基于RocketMQ的架构设计,他们仅需要一个轻量级的元数据服务器,只需要保证最终一致性,而不需要像zookeeper一样保持强一致。

(2)使用zookeeper担心服务故障,需要考虑高可用问题,需要维护

为什么NameServer之间不需要同步?如何保持一致?

(1)服务注册(Broker新增):每个Broker启动时都会查看配置文件有多少NameServer,然后向所有的NameServer注册自己保证NameServer彼此一致

(2)服务剔除(Broker关闭或宕机):Broker关闭会将自己从所有的NameServer中移除;如果Broker宕机,NameServer会10秒监测一次列表中的Broker是否存活,如果Broker挂了,也会将其移除

(3)路由发现(客户端获取最新的Broker list,初始连接、后续连接):Producer和Consumer会定期每隔30秒刷新一次本地路由列表,通过重试机制可以解决30秒内连接了宕机Broker的问题

?消费模式

  • 集群模式:消费者组里的消费者会负载消费不同的消息
  • 广播模式:消费者组里的消费者会将消息全部消费一遍,所有消费者消费一样的消息

?

消费模型

RabbitMQ既支持Pull也支持Push,而Kafka只支持Pull;从接口而言RocketMQ也同时支持Pull和Push,但是实际上RocketMQ的Push不是真正的Push,而是通过Pull来实现的,最终启动了一个pull服务

Message Queue

类似于Kafka中的partition分区,创建topic时需要指定写队列数量读队列数量;写队列数量决定了有几个message queue,用来划分存储位置,如果没有配置,服务端默认写队列数量是8,而生产端默认是4个;读队列数量决定了消费者有几个线程来消费这些消息,用来做负载。

MessageQueue有三个属性:
????????topic:指定当前message queue是属于topic
????????broker名字:指定存在哪个broker上
????????queue编号:一个topic下有多个queue,所以需要根据编号来寻找

工作原理

生产者

生产者消息发送规则

通过MessageQueueSelector实现类来定义发送规则,有以下三个实现类:

  • SelectMessageQueueByHash(默认):发送消息时,API底层默认使用此规则,根据队列id取绝对值和队列数取余数,然后id自增达到轮询效果
    ??
    public class SelectMessageQueueByHash implements MessageQueueSelector {
        public SelectMessageQueueByHash() {}
        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
            int value = arg.hashCode();
            if (value < 0) {
                value = Math.abs(value);
            }
    
            value %= mqs.size();
            return (MessageQueue)mqs.get(value);
        }
    }
  • SelectMessageQueueByRandom:随机选择一个队列
    public class SelectMessageQueueByRandom implements MessageQueueSelector {
        private Random random = new Random(System.currentTimeMillis());
        public SelectMessageQueueByRandom() {}
    
        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
            int value = this.random.nextInt(mqs.size());
            return (MessageQueue)mqs.get(value);
        }
    }
  • SelectMessageQueueByMachineRoom:返回空,没有实现

也可以自定义发送规则(实现MessageQueueSelector接口):

SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
    public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
        Integer id = (Integer) arg;
        int index = id % mqs.size();
        return mqs.get(index);
    }
}, i);

顺序消息

  1. 生产者发送消息时,到达broker是有序的,所以生产者只能用单线程顺序发送
  2. 写入broker时,要顺序写入,相同主题的消息集中写入,选择同一个message queue,传入相同的hashkey
  3. 消费者消费的时候只能单线程消费

事务消息(两阶段提交)

如何保证数据库操作与MQ消息发送操作要么都成功,要么都回滚?

  1. 生产者发送消息到broker,把消息状态标记为“未确认”,这个状态的消息无法被消费
  2. 如果broker可以接收成功,broker通知生产者消息接收成功
  3. 生产者执行数据库事务操作,并返回执行结果
  4. 如果事务执行成功,生成者修改消息状态为“确认”,否则丢弃消息
  5. 如果生产者数据库事务操作没有返回结果,broker主动查询事务执行结果

延迟消息

订单超时未支付自动关闭,怎么实现?

消息设为延迟消息,30分钟之后才发送,然后消费端查询订单是否支付,如果没有支付则关闭订单。

Broker

消息如何存储

清理策略

主从同步

故障转移

消费者

负载消费

rebalance

重试

死信队列

RocketMQ集群部署:https://gper.club/articles/7e7e7f7ff3g59gcfg66

RocketMQ常用命令:https://blog.csdn.net/gwd1154978352/article/details/80829534

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:15:11  更:2021-07-15 16:15:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 1:43:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码