黑马视频笔记--ROCKETMQ

阅读文章吧~
入门
名词解释

生产者 消费者以前是使用RPC现在是使用消息队列传播消息

消息队列的优点
  • 解耦:互相依赖嵌套的系统 因为从消息队列当中获取消息 不用互相依赖出问题

  • 削峰:当某个系统的请求突然增多,可以先缓存队列,减轻请求
    在这里插入图片描述

  • 数据分发 (消息队列来代替做任务)
    在这里插入图片描述
    在这里插入图片描述

组成及工作流程

启动nameserver 创建broker 创建topic 进行生产 进行订阅消费
在这里插入图片描述

在这里插入图片描述
我理解 nameserver就是腾讯的微信 大家都被他管理
broker就是公众号大平台
topic就是不同的频道区域
producer就是每一个公众号
consumer就是订阅者
message queue就是有一个存放不同区域的小区域

消费者打开微信 在微信中搜索存储着文章的公众号 那就要找到想搜索的区域的文章所在的公众号 于是就轮询查看公众号程序当中的每一个公众号 知道找到topic所在的公众号 那就是我要消费的文章

有一点就是进行生产和消费之前必须要有这个写文章的事存在 不要生产者并不写文章 消费者也不知道去哪里读文章 我们起码有一个认知 知道有一个渠道我们才能收发消息 topic要先创建好 否则生产白生产 消费也消费不到

在broker公众号里 每一个topic每一个领域都会横着占用一大堆broker 然后每一个topic派一个个小queue去存储在broker当中
消费者通过查看每一个topic所存在的队列 所存在的broker找到位置
在这里插入图片描述
许多个broker 帮助存储 但是都注册到nameserver了 于是nameserver帮助统计分发消息

同步:要等到上一个任务完成之后才进行下一步任务
异步:同时进行 生产者先注册到broker broker进行返回 的同时也进行主从复制
在这里插入图片描述
首先创建蓝色的topic 看topic存储在那些broker上 生产者要与将要发送的topic所在的队列 所在的broker连接
在这里插入图片描述

收发消息

创建生产者 (ONS)
produxer.start(); 启动生产者

public ProducerImpl(Properties properties) {
      自行翻看ONS代码
    }

启动生产者 之后发送消息 消息类型有string bytes[]

 public SendResult sendMessageDelayTime(String tag, String msg, Long delaySeconds) {
        if (StringUtils.isBlank(msg)) {
            throw new IllegalArgumentException("需要msg信息");
        }
        if (producer == null) {
            throw new IllegalArgumentException(String.format("[%s]非法,请检查topic", topic));
        }

        Message sendMsg;
        try {
            sendMsg = new Message(topic, null != tag ? tag : defaultTag, msg.getBytes("UTF8"));
            if (delaySeconds != null) {
                // 延时消息
                sendMsg.setStartDeliverTime(System.currentTimeMillis() + delaySeconds * 1000);
            }
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return producer.send(sendMsg);
    }

在这里插入图片描述
同步:需要等待上一步的结果完成 才能进行下一步

同步消息

应用场景:用户通过接收手机验证码进行注册,页面上点击获取验证码后,将验证码放到消息队列MQ,然后短信服务(消费者监听)从队列中获取到验证码,并发送给用户

发送同步消息 通常比如发短信 必须要短信验证码回复了才能进行下一步 就会使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DefaultRocketMqProducer producer=new  DefaultRocketMqProducer("组名");  创建生产者
producer.setNamessrvAddr("192.","192.");指定生产者所连接的管理中心nameserver的心跳节点地址  可以多个地址
producer.start();  连接好管理了 也创建好了 生产者可以开始工作了
Message message=new Message(topic,tag,content.getBytes());创建消息 让生产者进行发送
SendResult result=producer.send(message); 发送消息会返回 消息的一个结果
result.getMsgID();现在这条消息存储的id
result.getMessageQuee.getQueueId();结果包含很多状态 比如消息具体存储在那个broker的那个节点的第几个队列
producer.shutdown();  关闭生产者
异步消息

需要时间比较快 ,发送端不能等待broker响应
只有发送消息与上面不同 上面是同步 所以会等到返回结果
异步是无需等待 所以返回结果是要进行回调 才能获得

producer.send(msg,new SendCallBack(){
public void onSuccess(SendResult result){

}
public void onException(Throwable e){

}
});

唯一区别是发送消息这里 会有回掉函数
在这里插入图片描述
在这里插入图片描述

单向发送

在这里插入图片描述
消费者

DefaultMQPUshConsumer consumer=new DefaultMQpushCOnsumer("组名");
consumer.setNamesrvAddr("192."); 连接 nameserver地址
consumer.subscribe(); 订阅消息
消费消息 消费遵循负载均衡 
处理消息的返回结果 用监听器监听

在这里插入图片描述
消息消费遵循两种机制

  • 负载均衡模式

  • 广播模式
    在这里插入图片描述

顺序消费

消费者消费的顺序要和生产者发送的顺序一致
生产者 在这里以集合的形式去生产消息 为的是让自己的消息整体进入一个队列当中 可以被顺序消费 FIFO
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消费者:监听一个队列的集合的消息 并且是一个保证顺序的监听器 orderly
这个主题下的所有消息都被消费
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

延迟消费

消息设定延迟级别
在这里插入图片描述

在这里插入图片描述
消费可以感受到消息的存储时间 getstoretimestamp
在这里插入图片描述

批量消息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

过滤消息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事物消息

在这里插入图片描述
生产者发送的消息带有事务控制 。需要生产者进行事务+消息的提交 ,如果生产消息却不提交事务 是不会被生产者消费掉

事务控制的消息 短暂对消费者不可见 成为half message 但是mqserver可以收到 会回馈4 已经收到了

  • 成功 走7
    本地会对半消息(带有控制事务的消息)进行一个commit提交 7 提交后就被消费了
  • 失败 走4回滚
    本地执行失败了的话 mqserver会回查 查询状态 回滚然后消息队列删除这条消息
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    成功就走7 失败就走4 回滚然后delete msg
  • 事务消息 --生产
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
debug执行程序 再次回忆整个发送事务的流程

  • 1 生产者发送半消息 给mqserver
    在这里插入图片描述
    -2 mqserver方向 就去回调lisenter 监听器当中去执行本地事务执行 对于执行返回A和C提交和不作处理 只有B会回滚最后被删除消息
    在这里插入图片描述
    -3 所以最终只有A/C被消费

项目

在这里插入图片描述
第三方支付平台回调给我方的每一笔消息 如果都还是通过RPC并且是一个同步的关系 等待每一笔都走完才能走下一笔 那必定会堆积很多订单 所以我们要选择MQ 来监停每一个选择
在这里插入图片描述
什么时候执行ONS
什么时候使用ONS
谁使用 ONS 消费者? 生产者?
有了结果之后会有一个ONS处理

MessageListener
public interface MessageListener {
Action consume(Message var1, ConsumeContext var2);
}
生产者 生产 消费者 监听+消费
第一次见消费者监听的函数是 onMessage()
在这里插入图片描述
在这里插入图片描述
服务端支付 调到第三方支付平台 第三方支付成功 将支付结果进行回调发送给服务端
返回的结果 我们要进行写入MQ 让所有监听MQ的系统 都能够听到第三方支付平台的回调消息 进行比如金钱系统金钱减少 订单系统支付+1

比较像preloan 我们通过主应用的开户并调用preloan 然后preloan将返回结果回调给主应用 主应用就1/存储数据库+2/调MQ发送消息让所有监听MQ的都听到返回的结果 所以会看到没有配对主应用的其他的preloan里面写着notify 就是监听到了MQ当中的返回结果 然后自己做为一个preloan就也写写日志 MQ广播模式的发送 然后大家都来监听
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值