主流消息队列RocketMq,RabbitMq比对使用

news2024/11/15 13:50:13

首先整理这个文章是因为我正好有机会实战了一下rocketmq,阿里巴巴的一个开源消息中间件。所以就与以往中rabbitmq进行小小的比较一下。这里主线的根据常见面试问题进行整理。

1.消息队列常用的场景

1.1.削峰

例如我们做得考试系统中,用户通过人脸识别登录系统,考虑到考试系统的特殊性,三万名考生参加考试,需要记录人脸识别登录照片。从考试完结果上看,用户最大并发数在4000,于是我们采用rocketMq来进行异步消费用户人脸识别图片,当时统计rocketMq每秒1000消费消息。及时反馈了考生人脸识别登录成功,对数据库写操作也起到很大的缓冲功能。

1.2.解耦

如常用ABCD系统中,BCD系统都需要从A系统中调用接口返回数据,这时候突然来了E系统,也需要A系统数,又或者C系统不想要用这个接口数据了,而且A系统还得考虑,如果BCD接收不到数据,接收失败咋整之类的问题。

如果基于消息队列,这些问题就迎刃而解了。

A系统直接把数据扔到Mq中,BCDE系统直接从Mq中消费,如果消费失败,则重试消费。

1.3.异步

比如下订单系统中,会调用库存系统,会调用仓库系统,积分系统等,用户订单操作会直接返回给用户信息,提示订单完成,至于库存减少,或者仓库发货又或者积分的增加等,都是异步完成。极大的提高用户响应速度。

2.各种消息队列优缺点

1.1.rabbitMq

rabbitMq 几万级数据量,基于erlang语言开发,因此响应速度快些,并且社区活跃度比较活跃,可视化界面。缺点就是数据吞吐量相对与小一些,并且是基于erlang语言开发,比较重的问题难以维护。

1.2.rocketMq

rocketMq几十万级别数据量,基于Java开发,应对了淘宝双十一考验,并且文档十分的完善,拥有一些其他消息队列不具备的高级特性,如定时推送,其他消息队列是延迟推送,如rabbitMq通过设置expire字段设置延迟推送时间。又比如rocketmq实现分布式事务,比较可靠的。

1.3.kafka

kafka真正的大规模分布式消息队列,提供的核心功能比较少。基于zookeeper实现的分布式消息订阅。

3.消息队列常使用的注意事项或者面试时候经常问道的功能点

3.1.如何保证系统的高可用

就rabbitMq而言,有镜像模式概念,就是用户在发送数据时候,发送到mq机器上,并且持久化磁盘,然后通过设置镜像的queue,把数的持久化地址对应表同步到另外mq机器上。这种就有效防止一台mq挂了以后,另外的mq可以直接对外提供消费功能。

就rocketMq而言,分为多主集群结构,多主多备异步复制结构,多主多备同步复制结构。

3.2.如何保证消息不会丢失

就rabbitmq而言,从生产者,消费者,消息队列角度分析。生产者而言,发送消息如果失败,则定义重试次数,一般设置成五次。两种解决方式1.通过设置事务,进行事务回滚重试。2.通过发送者确认模式开启。

方式一:channel.waitForConfirms()普通发送方确认模式;

  方式二:channel.waitForConfirmsOrDie()批量确认模式;

  方式三:channel.addConfirmListener()异步监听发送方确认模式;

    // ======== 批量确认模式 end ======
    // 发送消息
    while(num-- > 0) {
        // 发送一个持久化消息到特定的交换机
        channel.basicPublish(EXCHANGE_NAME, routingkey, MessageProperties,PERSISTENT_TEXT_PLAIN, message.getBates());
        System.out.println(" [SimpleConfirmSend] Sent " + message);
    }
    // 批量等待确认: 返回true: 如果所有的消息都收到有确认应答,没有消息被拒绝
    if(!channel.waitForConfirms()){
        System.out.println("Not all message have arrived broker" );
        // 实际应用中,需要在这是添加发送消息失败的处理逻辑: 如重发等等
        // 在这种的模式中,如果发送N条消息,如果有一条失败,则所有的消息都需要重新推送
    }

就mq本身而言,需要做队列的持久化到磁盘的操作。1.queque队列的持久化,通过channel.queue_declare(queue='hello', durable=True);设置

3.3.设置消息的持久化,通过delivery_mode=2来进行设置。

mq消费者而言,开启手动ACK模式,也就是需要真正的消费者入库成功,才会进行消费成功的确认。

总结就是一句话:发送者确认模式开启,消息持久化默认开启,消费者消费开启手动ack

rocketMq而言,生产者发送消息,生产者默认模式

  rocketMq持久化方式中,消息持久化通过如下配置。

#Broker 的角色
#- ASYNC MASTER 异步复制Master
#- SYNC MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC MASTER
#刷盘方式
#- ASYNC ELUSH 异步刷盘
#- SYNC ELUSH 同步刷盘
flushDiskType=ASYNC FLUSH
#checkTransactionMessageEnable=false#发消息线程池数量
#sendMessageThreadPoolNums=12 8
#拉消息线程池数量
#pul1MessageThreadPoolNums=128

3.4.消费者幂等消费问题

感觉rabbitmq和rocketmq出现重复消费场景差不多

3.4.1.发送时消息重复

当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同并且 Message ID 也相同的消息。

3.4.2.投递时消息重复

消息消费的场景下,消息已投递到消费者并完成业务处理,当客户端给服务端反馈应答的时候网络闪断。 为了保证消息至少被消费一次,消息队列 RocketMQ 的服务端将在网络恢复后再次尝试投递之前已被处理过的消息,消费者后续会收到两条内容相同并且 Message ID 也相同的消息。

3.4.3.负载均衡时消息重复(包括但不限于网络抖动、Broker 重启以及订阅方应用重启)

当消息队列 RocketMQ 的 Broker 或客户端重启、扩容或缩容时,会触发 Rebalance,此时消费者可能会收到重复消息。

解决方式的话,通过messageId,作为数据库业务主键,重复插入会报错主键冲突问题。

或者通过redis唯一性,messageId作为key存入,去重重复的数据,在从redis中刷到数据库里面。

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

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

相关文章

Java查漏补缺(16)网络编程概述、网络通信要素、谈传输层协议:TCP与UDP协议、网络编程API、TCP网络编程、UDP网络编程、URL编程

Java查漏补缺(16)网络编程概述、网络通信要素、谈传输层协议:TCP与UDP协议、网络编程API、TCP网络编程、UDP网络编程、URL编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通…

【全网最细PAT题解】【PAT乙】1024 科学计数法

题目链接 1024 科学计数法 题目描述 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [-][1-9].[0-9]E[-][0-9],即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对…

Linux下安装Redis(云服务器)

一、选择自己需要下载的版本后,右击选择复制链接,然后利用命令进行下载,进入Xshell控制台,输入wget将复制的链接粘帖上 命令如下: wget https://download.redis.io/releases/redis-6.0.5.tar.gz 解压安装Redis解压 将下…

Pure Admin - 基于 Vue3 / Vite / Pinia 等主流技术栈打造的免费开源中后台管理系统,包含前后端源码

有一段时间没有推荐 admin 管理系统了,今天推荐一个完整度很高,教程详细,很容易上手的 admin 框架。 关于 Pure Admin Pure Admin 是一款开源免费且开箱即用的中后台管理系统模版,内置超多页面模板以及基于 node.js 的后端开发源…

金融信创步入快车道,应“需”而生的监控易运维方案为国产化助力

在我国“28N”信创三步走战略中,金融信创赫然名列其中,成为最早践行信创理论与实操的行业之一。截止到目前,金融信创渗透率业已仅次于党政部门,位列“8”大重点行业之首。超快的发展速度,让金融信创较早的步入“买方市…

Android 应用启动速度优化问题分析

在移动端程序中,用户希望的是应用能够快速打开。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。轻则鄙视你,重则直接卸载你的应用。因此,App打开的速度的快慢是影响用户体验的重要因素之一。本篇文章主要为大家分享&…

电信网上营业厅用户自服务系统的设计与实现

技术:Java、JSP等摘要:本文在对目前各种网上营业厅的功能原理进行了分析后,在山西省移动公司实习期间,为保证电信网上营业厅系统中心数据库的安全,设计了一个具有三层结构的网上营业厅,以web页面方式实现了…

设计模式(十三)----结构型模式之桥接模式

1 概述 现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系: 我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。 试…

linux_实操篇

linux_实操篇]六、Linux远程登录6.1为什么linux要远程登录6.2远程登录linux-Xshell76.3远程上传下载文件-Xftp76.3.1解决中文乱码七、vi与vim编辑器7.1vim快速入门7.1.1基本介绍7.1.2 vi与vim常用三种模式7.1.3vi和vim基本使用7.2vi和vim快捷键7.2.1 快捷键练习八、linux的开机…

Linux MISC 驱动实验

目录 一、MISC 设备驱动简介 misc_deregister 函数 二、MISC驱动编写 1、编写框架 2、platform结构体对应的函数 2、宏定义和miscbeep设备结构体 3、定义miscdevice结构体 字符设备操作集 4、probe函数 5、remove函数​编辑 验证 6、添加开关 三、总代码 APP mis…

MySQL-锁

MySQL-4-锁概述锁的分类全局锁基本语法:特点表级锁介绍分类表锁读锁测试写锁测试写锁测试元数据锁意向锁分类行级锁介绍行锁间隙锁/临键锁概述 锁是计算机协调多个进程或者线程并发访问某一资源的机制,在数据库中,除传统的计算资源&#xff…

PCB第六道主流程之AOI,你都知道吗

衔接上文,继续为朋友们分享普通单双面板的生产工艺流程。 如图,第六道主流程为AOI。 AOI的目的为: 利用光学原理,比对资料,进行检验,并附带相应的维修与报废处理。 其子流程,主要为3个。 【…

面试必刷101 Java题解 -- part 3

part1 – https://blog.csdn.net/qq_41080854/article/details/129204480 part2 – https://blog.csdn.net/qq_41080854/article/details/129224785 面试必刷101 Java题解 -- part 3动规五部曲71、斐波那契数列72、跳台阶73、最小花费爬楼梯74、最长公共子序列(二)75、最长公共…

比特数据结构与算法(第四章_中_续②)堆解决Topk问题(最小的k个数)

TopK问题介绍:在N个数中找出最大/小的前K个 (比如在1000个数中找出最大/小的前10个)以前的方法:冒泡排序。时间复杂度: O(N^2)现在找最大的k个数的方法:方法1:堆排序降序,前N个就是最…

提高香港数据中心安全性的 5 种方法

在说明如何有效提高香港数据中心安全性之前,让我们快速了解什么是香港数据中心,以及为什么它对任何企业都很重要。 什么是香港数据中心? 无需深入研究复杂的术语和过多的细节,香港数据中心只是负责保存公司大量敏感或专有信息的设施&#xf…

使用gitee搭建图床,并解决防盗链问题

使用gitee搭建图床,并解决防盗链问题 一、搭建图床(图床—般是指储存图片的服务器) 1、有gitee账号,并搭建一个gitee仓库 点击新建仓库: 填写信息: 新建完就是这个模样了,点击管理&#xff1…

RFID射频卡写入手机NFC心路小记

声明: 本文仅是作者学习探索的心里路程日记,如果您看完以后,从中获得了一些知识,作者不胜荣幸。科技是一把双刃剑,利用好了,可以方便生活,利用不当也肯能扰乱公共管理秩序,造成不必要…

【软件测试】测试老鸟的迷途,进军高级自动化测试测试......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 很多从业几年的选手…

如何在没有任何额外包的情况下使用 NodeJS 下载文件

如何在没有任何额外包的情况下使用 NodeJS 下载文件 您可以下载文件(图像、文本或任何类型的文件)并使用 NodeJS 内置 https和 fs模块将其保存到您的文件系统。 该 https模块允许您使用 NodeJS 创建 HTTPS 请求,同时该 fs模块授予您访问文件…

VR全景的普及还将会带来什么新的风口?

5G技术的普及让VR全景在诸多行业中逐渐融合应用,VR全景展示可以更加真实、更加直观地让用户自主观看现场真实场景,基于身临其境的效果,VR全景展示已经被广泛的应用于各行各业,那么VR全景的普及还将会带来什么新的风口呢&#xff1…