rocketmq的原理_dns原理及其解析过程

rocketmq的原理_dns原理及其解析过程1如何保证消息的可靠性传输生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功,broker:主从复制,同步刷盘消费端:消费重试,只有返回consume_success才算消费完成,保证消息的可靠性,最终还是消费16次还是失败的会进死信队列2.如何保证消息不被重复消费消费端消费消息的幂等1服务端代码根据messageId设置分布式锁,获取锁再做业务操作2更新数据库时校验业务的状态3或者设置唯一索引3.如何保证消息的顺序性…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1 如何保证消息的可靠性传输

生产者丢失数据:生产者设置同步提交消息,并且手动提交,将消息同步刷盘到从节点后在返回成功;

broker :主从复制,同步刷盘;

消费端:消费重试,只有返回consume_success 才算消费完成,保证消息的可靠性,最终还是消费16次还是失败的会进死信队列。

2.如何保证消息不被重复消费

消费端消费消息的幂等

1 服务端代码根据messageId 设置分布式锁,获取锁再做业务操作
2 更新数据库时校验业务的状态
3 或者设置唯一索引

3.如何保证消息的顺序性

消息被发送时保持顺序:通过业务唯一标识取模运算发送到同一个queue,保证发送的有序性;

消息被存储时保持和发送的顺序一致:同步发送,发送成功存储到broke再返回发送成功;

消息被消费时保持和存储的顺序一致:消费端实MessageListenerOrderly接口,保证消费端单线程从同一个queue拉取消息。

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

官网地址:https://rocketmq.apache.org/

RocketMQ架构图

Producer
消息生产者,位于用户的进程内,Producer通过NameServer获取所有Broker的路由信息,根据负载均衡策略选择将消息发到哪个Broker,然后调用Broker接口提交消息。

Producer Group
生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组,类似于同一个服务的多个节点。

Consumer
消息消费者,位于用户进程内。Consumer通过NameServer获取所有broker的路由信息后,向Broker发送Pull请求来获取消息数据。Consumer可以以两种模式启动,广播(Broadcast)和集群(Cluster),广播模式下,一条消息会发送给所有Consumer,集群模式下消息只会发送给一个Consumer。

Consumer Group
消费者组,和生产者类似,消费同一类消息的多个 Consumer 实例组成一个消费者组。

Broker
Broker是RocketMQ的核心模块,负责接收并存储消息,同时提供Push/Pull接口来将消息发送给Consumer。Consumer可选择从Master或者Slave读取数据。多个主/从组成Broker集群,集群内的Master节点之间不做数据交互。

NameServer可以看作是RocketMQ的注册中心,它管理两部分数据:集群的Topic-Queue的路由配置;Broker的实时配置信息。其它模块通过Nameserv提供的接口获取最新的Topic配置和路由信息。

Topic
主题,表示一类消息的集合,Topic是消息队列订阅的基本单位

Message
代表一条消息,系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个Topic,拥有唯一的MessageID,且可以携带具有业务标识的Key。

Queue
消息队列,组成Topic的最小单元,Topic是逻辑概念,Queue是物理存储,Consumer在消费Topic消息时底层实际是拉取Queue的消息

Tag
标签可以被认为是对 Topic 进一步细化。主要用来区分和过滤消息,一般在相同业务模块中通过引入标签来标记不同用途的消息。

Offset
RocketMQ在存储消息时会为每个Topic下的每个Queue生成一个消息的索引文件,每个Queue都对应一个Offset记录当前Queue中消息条数。

二.为什么使用消息队列

1.应用解耦

微服务系统中,如果藕合调用支付服务,库存服务合物流服务,如果任何一个子服务出现问题都会造成下单操作失败,从而影响用户使用体验,当中间有消息队列做缓冲后,系统可用性就高多了,当物流系统发生故障恢复后,物流系统从消息队列中拉取消息,用户感知不到系统异常,同时服务间异步调用提升系统响应时间。
2.流量削峰
瞬间的请求如果直接打到数据库,可能会造成系统崩溃,引入消息队列后,服务根据自身处理能力消费消息。
3.消息分发
当基础服务基础数据发生修改时,其他使用数据的微服务可以订阅基础服务消息,同步更新修改。

4.分布式事务一致性
使用事务消息,既可以实现系统之间解耦,又能保证数据的最终一致性。

5.顺序收发
当业务场景需要异步按顺序调用其他微服务时,可以考虑使用异步消息

三.怎么使用消息队列

消息发送的三种方式:

同步:发送网络请求后同步等待Broker服务器的返回结果,支持发送失败后重试,适用于较重要的消息通知场景;

异步:异步发送网络请求,不会阻塞当前线程,不支持失败重试,适用于相应时间较高的场景;

单向:同异步,但不支持回调,适用于相应时间极短,可靠性不高的场景,如日志收集,用户操作记录等。

消息队列正确订阅关系

消息队列正确订阅关系

1.顺序消息

消息发送时保持顺序
消息被存储时保持和发送的顺序一致
消息被消费时保持和存储的顺序一致

Producer的投递策略,主要有以下三种投递策略

在这里插入图片描述

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

在消息发送时,需指定对应的MessageQueueSelector,此时我们只需通过业务ID与queue进行关联, send中的参数arg即为select中的arg,将订单号作为参数传入,同一业务ID的相关消息则可以保证在同一queue中。同时在消费者监听时设置监听模式为MessageListenerOrderly。

2.延时消息

RocketMQ目前指定的延时时间间隔有1s,5s,10s,30s,1m,2m,3m,4m,5m,6m,7m,8m,9m,10m,20m,30m,1h,2h,用等级来表示时间间隔。

应用场景可定时关单。

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

在这里插入图片描述

设置延时等级,大于0即为延时消息,大于最大等级则将延时等级修改为最大等级;
Broker默认会有一个延迟消息专属的Topic,下面有18个队列,每个延迟级别对应一个队列。如果Broker接收到的是延迟消息,会改写消息的Topic和queueId,将消息暂时统一写入延迟队列中,然后由ScheduleMessageService线程对延迟队进行扫描,将到期需要交付的消息从CommitLog中读出来,然后恢复消息原本的Topic和queueId等属性,重新写回CommitLog,然后Consumer就可以正常消费了。

3.事务消息

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

在这里插入图片描述

四.其他相关问题

1.主从复制:

同步复制(SYNC_MASTER):Master服务器和Slave都写成功后才返回给客户端写成功状态,优点是Master宕机后,Slave有全部的数据备份,消费者可以继续从Slave中消费,缺点是写入延迟增加,降低系统吞吐量;

异步复制(ASYNC_MASTER):Master写入Broker后立即返回客户端状态,优点延迟低吞吐量高,Master宕机后缺点未同步的数据可能丢失。

2.读写分离:

客户端只能写入数据到Master,消费者消费消息时根据消息的堆积情况选择从Master或Slave中拉取,当Master服务器的消息堆积超过物理内存的40%时,则会从Slave中拉取,这个比例可以在配置文件中设置。

3.为什么放弃ZooKeeper选择NameServer
RocketMQ早期使用了ZooKeeper做集群管理,后来放弃了转而使用自研的NameServer。
RocketMQ部署多主多从时,Broker 的Master和Slave不会部署在同一台机器上,谁主谁从是预先在配置文件中就设置好了的,无需Zookeeper的选举机制,NameServer的设计实现复杂度低,使得网络通信简单,性能得到大大的提升。

4.如何避免消息发送时丢失
消息发送方式
消息队列部署方式
刷盘方式

5.如何避免消费时被重复消费
消费者消费成功后未提交相应的offset到broker

消费者消费失败,service层未使用事务注解。

6.生产环境下 RocketMQ 为什么不能开启自动创建主题

自动创建的Topic可能只会分布在单一的broker的queue中,对于集群部署的broker来说,分布就不均一

7.各个消息队列产品比较

特性 ActiveMQ RabbitMQ RocketMQ Kafka开发语言 java erlang java scala单机吞吐量 万级 万级 十万级 十万级时效性 ms us ms ms可用性 高(主从) 高(主从) 非常高(分布式) 非常高(分布式)功能特性 成熟,使用广泛,各种协议支持的好 基于erlang开发,延时低,并发强,性能极好 基于java开发,扩展性强,天然分布式部署,有成熟的管理界面和消息查询机制 主要运用于大数据领域,未提供消息查询功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/224135.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 微信小程序商城项目实战(第七篇:生成订单支付页)

    微信小程序商城项目实战(第七篇:生成订单支付页)订单支付分析代码实现效果图展示分析顶部改为”支付”上方为地址,跳转至地址管理,可修改下方为订单信息最下方显示所需支付金额以及支付按钮,点击支付则支付成功跳转订单页如果不支付则可以在我的订单内容查看该订单并且继续支付代码实现改变顶部导航内容”navigationBarTitleText”:”支付”界面:<navigatorurl=”/pages/addressList/addressList”class=”user_info_row”wx:if=”{{statu!=’待发

  • idea2022.2.4激活码(JetBrains全家桶)

    (idea2022.2.4激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • datax(9):Job和TaskGroup的通讯机制

    datax(9):Job和TaskGroup的通讯机制先后看完了TaskGroupContainer和JobContainer,梳理下他们的关系与职责;一,各自职责JobContainer:Job执行器,负责Job全局拆分、调度、前置语句和后置语句等工作的工作单元。类似Yarn中的JobTrackerTaskGroupContainer:TaskGroup执行器,负责执行一组Task的工作单元,类似Yarn中的TaskTracker(Yarn中的JobTracker和Yarn中的TaskTracker通过RPC进行通讯);二.

  • Ubuntu 搭建opengrok 流程

    Ubuntu 搭建opengrok 流程opengrok平台搭建流程软件下载链接:https://pan.baidu.com/s/1kCeXNlj2l3FujyMza3rM0w提取码:iniy搭建前的准备电脑系统电脑系统推荐使用ubuntu16,这版系统较为稳定。细节未更新python环境推荐使用python2.7及以上版本,这一版本相对稳定,python安装细节未更新java环境推荐使用JDK1.8及以上版本,具体安装细节未更新通过java-version和javac-version可以查看版本。Ope

  • 细粒度图像分类(FGVC)—综述[通俗易懂]

    细粒度图像分类(FGVC)—综述[通俗易懂]一、概述什么是细粒度图像分类细粒度图像分类问题是对大类下的子类进行识别。细粒度图像分析任务相对通用图像(General/GenericImages)任务的区别和难点在于其图像所属类别的粒度更为精细。以图1为例,通用图像分类其任务诉求是将“袋鼠”和“狗”这两个物体大类(蓝色框和红色框中物体)分开,可见无论从样貌、形态等方面,二者还是很容易被区分的;而细粒度图像的分类任务则要求对“狗”该类类别……

  • 用c语言编写的程序被称为 知识,第一章 C语言基本知识

    用c语言编写的程序被称为 知识,第一章 C语言基本知识C语言基本知识第一章C语言基本知识【考点1】C程序用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”。源程序经编译后生成后缀名为“.obj”的目标文件,再把目标文件与各种库函数连接起来,生成“.exe”可执行文件。C语言有三种基本结构:顺序结构、选择结构、循环结构。【考点2】main函数又称主函数,是C程序的入口。main后面跟一对小括号和一对花括号,花括号括起来的部分称为main…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号