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简介

消息对列RocketMQ版(原ONS)是阿里云基于Apache RocketMQ构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。最初由阿里巴巴自研并捐赠给Apache基金会,服务阿里集团13年,覆盖全集团所有业务。作为双十一交易核心链路的官方指定产品,支持千万级并发、万亿级数据洪峰,历年刷新大规模交易消息流转记录。
开源消息中间件

RocketMQ应用场景

link.
image.png
image.png
image.png
image.png
image.png
image.png

案例

没有使用RocketMQ之前

image.png
image.png
当系统没有采用RocketMQ时,系统是耦合的。交易系统部署在服务器A,会员系统部署在服务器B,商品系统部署在服务器C,一般是采用RPC(Remote Procedure Call:远程过程调用)完成调用,使用RPC调用,只要一个系统宕机了,会导致交易系统异常

使用RocketMQ之后

解决方案是进行解耦,起一台RocketMQ,交易系统进行一次操作(如扣减库存,扣减优惠券),就生成一条消息,把它放到一个对应的主题上来,交给会员系统、商品系统,然后会员系统、商品系统作为消费者从RocketMQ中拿到消息并且处理
image.png

具体流程

1.RocketMQ搭建好

2.引入RocketMQ的客户端

maven包引入:

rocketmq-spring-boot-starter

image.png

3.订单系统完成商品的生产,把消息写入RocketMQ

image.png
生产者把消息发送给RocketMQ
image.png

4.商品系统增加一个监听类,进行商品的消费

RocketMQ作为客户端中,生产者是可以作为controller介入的,消费者一般来说实用的是监听模式(推模式),也就是有消息来了,自动往这个监听里面去发送数据
?

定义一个组件专门监听RocketMQ的消息,主题,分组,模式(集群)
image.pngimage.png

完成商品的消费(通过监听)
image.png
拿到order后调用修改库存(库存-1)的方法

存在问题

如何解决消息丢失?

我们是通过生产者给RocketMQ发送消息,消费者从RocketMQ中取走消息来实现的解耦,那么消息丢失了怎么办呢?

RocketMQ–主从复制

图示

image.png

解析

~~~主从复制

RocketMQ发送消息的时候如果对应的是集群只会发送给主(Master),从的数据是从主的同步复制过去的,这种复制方式可以是同步的也可以是异步的

~~~刷盘

RocketMQ的消息虽然存储在磁盘,但是刚往里面写的时候是写到内存(memory)里的,不保险,万一RocketMQ宕机了或者服务器断电了,数据就丢失了,存入磁盘才能保证数据万无一失,这个过程就叫做刷盘(同步刷盘,异步刷盘)。

~~~~~~同步复制,异步刷盘

一般我们采取的方法是同步复制,异步刷盘:
同步复制:及时复制,主接收到消息的同时,把消息立马发送给从
异步刷盘:如果接收到消息立马把消息存入磁盘效率会很低,比较标准和高可用的方案是消息写入的时候另外起一个线程比如每个10m或每隔30s会把内存当中的数据持久化到磁盘

消费策略

一般情况下,最为消费者,也是从主里面进行消费,当主宕机了或者主非常繁忙,才会从从里面进行消费
?

生产者–重试

结论

生产者给RocketMQ发送消息时调用的方法:rocketMQTemplate.getProducer().send(message) 默认重试两次,第一次发送失败,重试一次(发送的第二次),第二次发送失败,再重试一次(发送的第三次),一般情况下作为生产者会发送三次

原理(源码)

rocketMQTemplate.getProducer().getRetryTimesWhenSendAsyncFailed()
image.png

image.png

image.png

消费者–重试

结论

消费者默认会重试16次,1+16=17,重试16次以上就会进入死信队列
RocketMQ的重试不是由原有的主题来发,而是吧这条消息写入到一个叫做重试队列当中

消费者重试次数与间隔时间

image.png

消费者重试机制(重试与死信队列)

image.png

如何解决消息的重复?–幂等性

上面说了,生产者和消费者解决消息丢失的方案都是重试,那么,一直重试会不会造成消息重复呢?如何解决

最优的方式

去重表,mysql数据库,索引唯一(unique)
image.png

完美的方案

不光写日志,再写一个topic主题 ,可以用来数据分析为什么数据老是重复
image.png

图示

image.png

RocketMQ高效存储架构

kafka在处理海量主题时,性能下降很快!!!
RocketMQ1.0版是完全抄袭的kafka,2.0进行了修改
RocketMQ高效存储架构
![image.png](https://img-blog.csdnimg.cn/img_convert/f872a2063ebb7401ccb3bbdaf7496730.png#clientId=uc1324b2d-2153-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=432&id=uf7d66a30&margin=[object Object]&name=image.png&originHeight=432&originWidth=938&originalType=binary&ratio=1&rotation=0&showTitle=false&size=140146&status=done&style=none&taskId=ubc5d3329-6659-44e5-9234-796681f1556&title=&width=938)
所有的消息都会写在commitlog文件,就算没有任何文件,开始创建就占用1G

写在一个文件里如何消费?

消费的时候会把所有的对应的索引写入另一个文件Comsumequeue,Comsumequeue里会保存主题信息,主题信息是队列的数据结构,轮询的方式

消费的时候怎么确保效率很高?

消费者首先找队列,找到对列就能找到这条消息对应的偏移量,找到偏移量就能在CommitLog中找到消息本体
消费的时间 时间复杂度O1

总结

?欲听详情,请听下回分解!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:14:20  更:2022-02-19 01:15:48 
 
开发: 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年11日历 -2024/11/24 10:27:09-

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