热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+RabbitMQ削峰入门

前言当大量的客户访问请求打到后端,去访问数据库等,瞬间会爆炸的。经过前端或者其他的方案进行限流外。还是有大量的请求,这个时候需要削峰了。简单的削峰例子先设置小一点,然后循环往队列里

前言

当大量的客户访问请求打到后端,去访问数据库等,瞬间会爆炸的。
经过前端或者其他的方案进行限流外。
还是有大量的请求,这个时候需要削峰了。

简单的削峰例子

先设置小一点,然后循环往队列里面放消息,消费的时候延迟2秒

spring:
rabbitmq:
host: 192.168.21.129
port: 5672
username: guest
password: guest
virtual-host: /
listener:
type: simple
simple:
prefetch: 1 # 消费者每次从队列获取的消息数量
concurrency: 1 # 消费者数量
max-concurrency: 1 # 启动消费者最大数量

调用生产者

for (int i=0;i<10;i++){
// 调用消息生产者
sender.sender(msg+i);
}

消费者

@RabbitListener(queues = MQConfig.QUEUE)
public void receiver(String msg) throws InterruptedException {
Thread.sleep(2000L); // 模拟处理需要2秒
log.info("消费者消费。。。。。。{}", msg);
}

页面访问:

http://localhost:8088/hello?msg=GMaya

此时消息会全部放到列队,但是会一条一条消费。简单的实现了削峰处理

《SpringBoot+RabbitMQ削峰入门》
调整消费者的数量

prefetch: 1 # 消费者每次从队列获取的消息数量
concurrency: 2 # 消费者数量
max-concurrency: 10 # 启动消费者最大数量

此时就会有两个消费者同时去消费队列中的消息。所以这个消费者数量需要根据实际的情况去设置所能承受的一个值,也就是峰值。

《SpringBoot+RabbitMQ削峰入门》

重试策略

如果说消费者在消费的过程中失败了,那么会一直消费,一直到成功为止。

但是也可以添加重试策略,比如失败三次就不在消费了。

listener:
type: simple
simple:
prefetch: 1 # 消费者每次从队列获取的消息数量
concurrency: 2 # 消费者数量
max-concurrency: 10 # 启动消费者最大数量
# 重试策略相关配置
retry:
enabled: true #开启消费者重试
max-attempts: 2 #最大重试次数
initial-interval: 2000 #重试间隔时间

模拟异常

@RabbitListener(queues = MQConfig.QUEUE)
public void receiver(String msg) throws InterruptedException {
Thread.sleep(2000L); // 模拟处理需要2秒
if("GMaya8".equals(msg)){
System.out.println(1/0);
}
log.info("消费者消费。。。。。。{}", msg);
}

此时的结果就是其他的消息被消费,但是这个GMaya8没了,失败三次之后就没了。队列中也消失了。

如何保证rabbitmq消息不丢失

丢失数据场景:

  1. 生产者没有生产成功,即生产者丢失
  2. rabbitmq丢失了
  3. 消费端丢失,即消费端没消费成功。

开启confirm回调,启动手动确定消息消费。

server:
port: 8088
spring:
rabbitmq:
host: 192.168.21.129
port: 5672
username: guest
password: guest
virtual-host: /
publisher-returns: true # 实现ReturnCallback接口,如果消息从交换器发送到对应队列失败时触发
publisher-confirm-type: correlated
listener:
type: simple
simple:
acknowledge-mode: manual # 消息消费确认,可以手动确认
prefetch: 1 # 消费者每次从队列获取的消息数量
concurrency: 2 # 消费者数量
max-concurrency: 10 # 启动消费者最大数量
# 重试策略相关配置
retry:
enabled: true #开启消费者重试
max-attempts: 3 #最大重试次数
initial-interval: 2000 #重试间隔时间
template:
#在消息没有被路由到合适队列情况下会将消息返还给消息发布者
#当mandatory标志位设置为true时,如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,
# 那么broker会调用basic.return方法将消息返还给生产者;当mandatory设置为false时,
# 出现上述情况broker会直接将消息丢弃;通俗的讲,mandatory标志告诉broker代理服务器至少将消息route到一个队列中,
# 否则就将消息return给发送者;
#: true # 启用强制信息
mandatory: true

使用交换机模式
生产者

@Component
@Slf4j
public class Sender implements RabbitTemplate.ConfirmCallback{
@Autowired
private RabbitTemplate rabbitTemplate;
public Sender(RabbitTemplate rabbitTemplate){
rabbitTemplate.setConfirmCallback(this);
}
/** * fanout 模式 * @param msg */
public void fanoutSender(String msg) {
log.info("fanout生产者生产消息。。。。。{}", msg);
// 会把消息发送给 所有绑定到此交换机的全部列队;routing_key会被忽略。
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
this.rabbitTemplate.convertAndSend(MQConfig.FANOUT_EXCHANGE, "", msg, correlationData);
}
@Override public void confirm(CorrelationData correlationData, boolean b, String s) {
if(b){
log.info("消息生产成功");
}else{
log.info("消息生产失败");
// 可以自己写重新发送消息
}
}
}

消费者

@RabbitListener(queues = MQConfig.QUEUE_A)
public void receiverA(String msg,Message message, Channel channel) throws IOException {
log.info("QUEUE_A消费者消费。。。。。。{}", msg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
@RabbitListener(queues = MQConfig.QUEUE_B)
public void receiverB(String msg,Message message, Channel channel) throws IOException {
log.info("QUEUE_B消费者消费。。。。。。{}", msg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}

这个时候已经解决出现问题,倒是消息消失的情况。当处理好问题之后,重启就会重新消费


推荐阅读
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 本文深入探讨了Python线程池的内部实现机制,作为对Apshceduler调度器研究的延伸。在先前关于Apshceduler源码分析的文章中,我们提到调度器通过`def_do_submit_`函数将任务提交到线程池。本文将进一步解析线程池的工作原理,包括任务分配、线程管理及性能优化等方面,为读者提供更全面的技术理解。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 抖音AI特效风靡网络,真人瞬间变身动漫角色,吴亦凡、PDD和戚薇纷纷沉迷其中
    近期,抖音推出的一款名为“变身漫画”的AI特效在社交媒体上迅速走红,吸引了大量用户尝试。不仅普通网友积极参与,连吴亦凡、PDD和戚薇等明星也纷纷加入,体验将真人瞬间转化为动漫角色的神奇效果。这一特效凭借其高度的趣味性和创新性,迅速成为网络热议的话题。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
author-avatar
M-pp威_703
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有