消息队列相关汇总

目录

一、什么是消息队列

二、Kafka怎么避免重复消费

三、RabbitMQ 的消息如何实现路由

四、如何保证RabbitMQ的消息可靠传输

五、如何进⾏消息队列选型


一、什么是消息队列

        消息队列 Message Queue,简称 MQ。是一种应用间的通信方式,主要由三个部分组成

生产者:Producer

消息的产生者与调用端,主要负责消息所承载的业务信息的实例化,是一个队列的发起方

代理:Broker

主要的处理单元,负责消息的存储、投递、及各种队列附加功能的实现,是消息队列最核心的组成部分

消费者:Consumer

一个消息队列的终端,也是消息的调用端 具体是根据消息承载的信息,处理各种业务逻辑。 消息队列的应用场景较多,常用的可以分为三种:

异步处理

主要应用于对实时性要求不严格的场景, 比如:用户注册发送验证码、下单通知、发送优惠券等等。 服务方只需要把协商好的消息发送到消息队列, 剩下的由消费消息的服务去处理, 不用等待消费服务返回结果。

应用解耦

应用解耦可以看作是把相关但耦合度不高的系统联系起来。 比如订单系统与 WMS、EHR 系统,有关联但不哪么紧密 ,每个系统之间只需要把约定的消息发送到 MQ,另外的系统去消费即可。 解决了各个系统可以采用不同的架构、语言来实现,从而大大增加了系统的灵活 性。

流量削峰

流量削峰一般应用在大流量入口且短时间内业务需求处理不完的服务中心, 为了权衡高可用,把大量的并行任务发送到 MQ 中, 依据 MQ 的存储及分发功能,平稳的处理后续的业务,起到一个大流量缓冲的作用。

目前市面上常见的消息队列中间件主要有:ActiveMQ、RabbitMQ、Kafka、RocketMQ 

二、Kafka怎么避免重复消费

        首先,Kafka Broker 上存储的消息,都有一个 Offset 标记。然后kafka 的消费者是通过 offSet 标记来维护当前已经消费的数据,每消费一批数据,Kafka Broker 就会更新 OffSet 的值,避免重复消费。

重复消费出现的情况:

1、程序被强制 kill 掉或者宕机

默认情况下,消息消费完以后,会自动提交 Offset 的值,避免重复消费。Kafka 消费端的自动提交逻辑有一个默认的 5 秒间隔,也就是说在 5 秒之后的下一次向 Broker 拉取消息的时候提交。 所以在 Consumer 消费的过程中,应用程序被强制 kill 掉或者宕机,可能会导致 Offset 没提交,从而产生重复提交的问题。

2、消息处理不及时

除此之外,还有另外一种情况也会出现重复消费。在 Kafka 里面有一个 Partition Balance 机制,就是把多个 Partition 均衡的分配 给多个消费者。Consumer 端会从分配的 Partition 里面去消费消息,如果 Consumer 在默认的 5 分钟内没办法处理完这一批消息。就会触发Kafka的 Rebalance机制,从而导致Offset自动提交失败。 而在重新Rebalance之后,Consumer还是会从之前没提交的Offset位置开始 消费,也会导致消息重复消费的问题。

解决办法:

基于这样的背景下,解决重复消费消息问题的方法有几个

1、提高消费端的处理性能避免触发 Balance

比如可以用异步的方式来处理消息,缩短单个消息消费的时间,或者还可以调整消息处理的超时时间,还可以减少一次性从 Broker 上拉取数据的条数

2、利用幂等性

可以针对消息生成 md5 然后保存到mysql或者redis 里面,在处理消息之前先去mysql或者 redis里面判断是否已经消费过

三、RabbitMQ 的消息如何实现路由

        RabbitMQ 是一个基于 AMQP 协议实现的分布式消息中间件。

        AMQP 的具体工作机制是,生产者把消息发送到 RabbitMQ Broker 上的 Exchange 交换机上。 Exchange 交换机把收到的消息根据路由规则发给绑定的队列(Queue)。 最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

        其中,Exchange 是一个消息交换机,它里面定义了消息路由的规则,也就是这 个消息路由到那个队列。 然后 Queue 表示消息的载体,每个消息可以根据路由规则路由到一个或者多个 队列里面。 而关于消息的路由机制,核心的组件是 Exchange。 它负责接收生产者的消息然后把消息路由到消息队列,而消息的路由规则由 ExchangeType 和 Binding 决定。 Binding 表示建立 Queue 和 Exchange 之间的绑定关系,每一个绑定关系会存在 一个 BindingKey。 通过这种方式相当于在 Exchange 中建立了一个路由关系表。

        生产者发送消息的时候,需要声明一个 routingKey(路由键),Exchange 拿到 routingKey 之后,根据 RoutingKey 和路由表里面的 BindingKey 进行匹配,而 匹配的规则是通过 ExchangeType 来决定的。

        在 RabbitMQ 中,有三种类型的 Exchange:direct ,fanout 、topic。

direct: 完整匹配方式,也就是Routing key 和Binding Key 完全一致,相当于 点对点的发送。

fanout: 广播机制,这种方式不会基于Routing key来匹配,而是把消息广播给 绑定到当前 Exchange上的所有队列上。

topic: 正则表达式匹配,根据Routing Key 使用正则表达式进行匹配,符合匹 配规则的 Queue都会收到这个消息

四、如何保证RabbitMQ的消息可靠传输

        在 RabbitMQ 的整个消息传递过程中,有三种情况会存在丢失。

1、生产者把消息发送到 RabbitMQ Server 的过程中丢失

2、RabbitMQ Server 收到消息后在持久化之前宕机导致数据丢失

3、消费端收到消息还没来得及处理宕机,导致 RabbitMQ Server 认为这个消息已签收。

        所以,只需要从这三个纬度去保证消息的可靠性传输就行了。

1、从生产者发送消息的角度来说,RabbitMQ 提供了一个 Confirm(消息确认)机 制,生产者发送消息到 Server 端以后,如果消息处理成功,Server 端会返回一 个 ack 消息。 客户端可以根据消息的处理结果来决定是否要做消息的重新发送,从而确保消息 一定到达 RabbitMQ Server 上。

2、从 RabbitMQ Server 端来说,可以开启消息的持久化机制,也就是收到消息之 后持久化到磁盘里面。 设置消息的持久化有两个步骤。 创建 Queue 的时候设置为持久化 发送消息的时候,把消息投递模式设置为持久化投递,不过虽然设置了持久化消息,但是有可能会出现,消息刷新到磁盘之前,RabbitMQ Server 宕机导致消息丢失的问题。 所以为了确保万无一失,需要结合 Confirm 消息确认机制一起使用。

3、 从消费端的角度来说,我们可以把消息的自动确认机制修改成手动确认,也就是说消费端只有手动调用消息确认方法才表示消息已经被签收。 这种方式可能会造成重复消费问题,所以这里需要考虑到幂等性的设计。

五、如何进⾏消息队列选型

Kafka:

优点: 吞吐量⾮常⼤,性能⾮常好,集群⾼可⽤。

缺点:会丢数据,功能⽐较单⼀。

使⽤场景:⽇志分析、⼤数据采集

RabbitMQ:

优点: 消息可靠性⾼,功能全⾯。

缺点:吞吐量⽐较低,消息积累会严重影响性能。erlang语⾔不好定制。

使⽤场景:⼩规模场景。

RocketMQ:

优点:⾼吞吐、⾼性能、⾼可⽤,功能⾮常全⾯。

缺点:开源版功能不如云上商业版。官⽅⽂档和周边⽣态还不够成熟。客户端只⽀持java。 使⽤场景:⼏乎是全场景。

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

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

相关文章

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展,并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

AI发展势头强劲,或许会催生这些职业!

AI(人工智能)的发展正在并将继续催生多种新的职业,这些职业通常与AI的设计、开发、测试、部署、监管、维护以及与其互动和应用相关。 按照现在AI发展的趋势来看,可预测的一些新兴职业大概有下面这些: 当然以上只是一些…

初识Electron,创建桌面应用

历史小剧场 呜呼!古有匈奴犯汉,晋室不纲,铁木夺宋,虏清入关,神舟陆沉二百年有余,中国之见灭于满清初非满人能灭之,能有之也因有汉奸以作虎怅,残同胞媚异种,始有吴三桂洪承…

中职数字化校园网络建设

中职(职校)数字化校园的校园网建设立足于职业教育、职业学校的特点,充分注意到信息技术的飞速发展、通信成本的迅速降低的特点。在规划和建设校园网时,遵循以下原则: 采用通用和成熟的技术:采用通用的、成熟…

Android面试题(持续更新中)

一、抽象类与接口的区别? 1、抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法; 2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的; 3、接口中不能含有…

【国产NI替代】NI-9235 10 kS/s/ch,120 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch,120 Ω四分之一桥应变计,8通道C系列应变/桥输入模块 NI‑9235可同步测量所有通道的动态应变,从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用(例如冲击测试)非常重要。\n\nNI…

Windows Server 2019/2022 开启

我的环境是Windows Serve 2022 Datacenter, 21H2, 需要使用Hyper-V 与 VMWare Workstation共存,但是在服务器管理器中找不到Windows Hypervisor Platform安装选项。在Win10中是启动关闭Windows功能中,而server中找不到。 解决方法: 以管理员…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂,貌似毫无用处!后来的后来,终于渐渐明白搞懂算法背后的核心思想,能让你写出更加优雅的代码。就像一首歌唱的那样:后来,我总算学会了如何去爱,可惜你早已远…

【漏洞复现】若依druid 未授权访问漏洞

0x01 产品简介 若依(Ruoyi)框架是一款基于Spring Boot、Spring Cloud、OAuth2与JWT鉴权等核心技术的快速开发平台。它支持多种安全框架和持久化框架,并采用前后端分离的模式进行开发,具备高度的灵活性和可扩展性。若依框架提供了…

C语言指针和数组的一些笔试题

文章目录 前言一、一维数组二、字符数组-1三、字符数组-2总结 前言 C语言指针和数组的一些笔试题 一、一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a 0));printf("%d\n…

经典网络解读——Efficientnet

论文&#xff1a;EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks&#xff08;2019.5&#xff09; 作者&#xff1a;Mingxing Tan, Quoc V. Le 链接&#xff1a;https://arxiv.org/abs/1905.11946 代码&#xff1a;https://github.com/tensorflow/t…

【笔试训练】day15

1.平方数 水题直接看代码 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; int main() {ll x;cin >> x;ll a sqrt(x);if (abs(a * a -…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…

Laravel11 路由

基本路由 use Illuminate\Support\Facades\Route;Route::get(/greeting, function () {return Hello World; }); 项目初始自带分组&#xff0c;routes文件夹里有api、auth、console、web四个文件。 api项目是php artisan install:api&#xff0c;routes里没有api.php可以执行…

2024抖音AI图文带货班:在这个赛道上 乘风破浪 拿到好效果

课程目录 1-1.1 AI图文学习指南 1.mp4 2-1.2 图文带货的新机会 1.mp4 3-1.3 2024年优质图文新标准 1.mp4 4-1.4 图文如何避免违规 1.mp4 5-1.5 优质图文模板解析 1.mp4 6-2.1 老号重启 快速破局 1.mp4 7-2.2 新号起号 不走弯路 1.mp4 8-2.3 找准对标 弯道超车 1.mp4 9…

JMeter 请求头信息配置详解

在进行 Web 测试和 API 测试时&#xff0c;正确配置 HTTP 请求头是关键步骤之一&#xff0c;尤其当使用诸如 JMeter 这样的强大工具时。在本文中&#xff0c;我将详细介绍如何在 JMeter 中有效地配置和管理HTTP请求头。 在 JMeter 中添加和配置 HTTP 请求头 步骤 1: 打开 HTT…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习&#xff0c;不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明&#xff1a;&#xff08;书本中sy9”第3.实验内容“大家还是要做下。&#xff09; 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)

1. 文件分块 将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这些分片。这种方法可以提高上传的稳定性&#xff0c;因为如果某个分片上传失败&#xff0c;只需要重新上传该分片而不需要重新上传整个文件。同时&#xff0c;分片上传…

21.哀家要长脑子了!

1.21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 我做过啊&#xff0c;为什么还是不能独立做出来&#xff0c;为什么为什么啊啊啊 嘻嘻奔向五一 是这样的&#xff1a; 要按升序连接&#xff0c;以链表2头结点作为开端&#xff0c;哪个小就先连接哪个&#xff…

CarEye 智能叉车管理系统

CarEye 团队在智能车辆管理平台基础上&#xff0c;专门针对叉车管理特殊性开发了叉车管理系统。以下是叉车管理系统的一些主要介绍&#xff1a;