Go实现RabbitMQ 死信队列、优化

news2024/11/18 9:46:48
  1. 死信队列是什么?

  2. 如何配置死信队列?

  3. go实现死信队列

  4. go使用发布订阅模式改造批量发送消息

【教学内容】

1. 死信队列是什么?

注意:业务队列与死信交换机的绑定是在构建业务队列时,通过参数(x-dead-letter-exchange和x-dead-letter-routing-key)的形式进行指定。

通俗来讲,无法被正常消费的消息,我们可以称之为死信。我们将其放入死信队列,单独处理这部分“异常”消息。

“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况之一:

(1)消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。

(2)消息在队列的存活时间超过设置的TTL时间。

(3)消息队列的消息数量已经超过最大队列长度。 那么该消息将成为“死信”。

“死信”消息会被RabbitMQ进行特殊处理,如果配置了死信队列信息,那么该消息将会被丢进死信队列中,如果没有配置,则该消息将会被丢弃。

2.如何配置死信队列?


如何配置死信队列呢?大概可以分为以下步骤:

配置业务队列,绑定到业务交换机上

为业务队列配置死信交换机和路由key

为死信交换机配置死信队列

注意,并不是直接声明一个公共的死信队列,然后所以死信消息就自己跑到死信队列里去了。而是为每个需要使用死信的业务队列配置一个死信交换机,这里同一个项目的死信交换机可以共用一个,然后为每个业务队列分配一个单独的路由key。

有了死信交换机和路由key后,接下来,就像配置业务队列一样,配置死信队列,然后绑定在死信交换机上。也就是说,死信队列并不是什么特殊的队列,只不过是绑定在死信交换机上的队列。死信交换机也不是什么特殊的交换机,只不过是用来接受死信的交换机,所以可以为任何类型【Direct、Fanout、Topic】。一般来说,会为每个业务队列分配一个独有的路由key,并对应的配置一个死信队列进行监听,也就是说,一般会为每个重要的业务队列配置一个死信队列。

Golang 实现 RabbitMQ 的死信队列 https://segmentfault.com/a/1190000041358981

队列、交换机、routing-key 放到消费者一方来实现。所以消费者者一共需要做这几件事

  1. 创建连接

  2. 设置队列(队列、交换机、绑定)

  3. 设置死信队列(队列、交换机、绑定)

  4. 发布消息

设置队列(队列、交换机、绑定)

核心操作就是设置队列阶段。

声明普通队列,并指定死信交换机、指定死信routing-key。后续死信队列创建后会与死信交换机、指定死信routing-key进行绑定

//创建一个queue,指定消息过期时间,并且绑定过期以后发送到那个交换机
queueA, err := channel.QueueDeclare(
    queueAName, // name
    true,       // durable
    false,      // delete when usused
    false,      // exclusive
    false,      // no-wait
    amqp.Table{
        // 当消息过期时把消息发送到 exchangeB
        "x-dead-letter-exchange": exchangeB,
        "x-message-ttl":          ttl,
        //"x-dead-letter-queue" : queueBName,
        //"x-dead-letter-routing-key" :
        },
    )
if err != nil {
    fmt.Println(err)
    return
}

声明交换机

err = channel.ExchangeDeclare(
        exchangeA, // name
        "fanout",  // type
        true,      // durable
        false,     // auto-deleted
        false,     // internal
        false,     // no-wait
        nil,       // arguments
    )
    if err != nil {
        fmt.Println(err)
        return
    }

目前,普通队列和交换机都已经创建,但它们都是独立存在,没有关联。

通过 QueueBind 将队列、routing-key、交换机三者绑定到一起。


err = channel.QueueBind(
    queueA.Name, // queue name
    "",          // routing key
    exchangeA,   // exchange
    false,
    nil,
)
if err != nil {
    fmt.Println(err)
    return
}

设置死信队列(队列、交换机、绑定)

同样死信队列,也需要创建队列、创建交换机和绑定。

// 声明死信队列
// args 为 nil。切记不要给死信队列设置消息过期时间,否则失效的消息进入死信队列后会再次过期。
queueB, err := channel.QueueDeclare(
   queueBName, // name
   true,       // durable
   false,      // delete when usused
   false,      // exclusive
   false,      // no-wait
   nil,        // arguments
)
if err != nil {
   fmt.Println(err)
   return
}

// 声明交换机

err = channel.ExchangeDeclare(
   exchangeB, // name
   "fanout",  // type
   true,      // durable
   false,     // auto-deleted
   false,     // internal
   false,     // no-wait
   nil,       // arguments
)
if err != nil {
   fmt.Println(err)
   return
}

// 队列绑定(将队列、routing-key、交换机三者绑定到一起)

err = channel.QueueBind(
   queueB.Name, // queue name
   "",          // routing key
   exchangeB,   // exchange
   false,
   nil,
)
if err != nil {
   fmt.Println(err)
   return
}

当死信队列建立完毕,普通队列通过 x-dead-letter-exchange 和 x-dead-letter-routing-key 参数的指定,便可生效,死信队列便与普通队列连通。

3. go实现死信队列

实现路由访问

编写生产者

方便测试,开启两个生产者

一个生产者,执行死信队列生产消息

另一个生产者,创建绑定的队列(死信队列中绑定的队列)生产消息

实现消费者

创建mq/dlx/main.go,实现消费

效果:

执行两个生产者

查看RabbitMQ客户端

点击交换机查看详细情况

点击queues,查看队列情况

启动消费者:

查看消费情况

死信队列转发给了b队列

4. go使用发布订阅模式改造批量发送消息

修改批量发送消息逻辑

编写入队列逻辑

执行批量发送接口

查看RabbitMQ客户端,检查交换机状态

启动消费者

注:当执行消费者时,因为是main.go执行,所以不会共享连接数据库,导致数据库连接default连接不上

重新连接数据库配置

系统默认参数

beego 中带有很多可配置的参数,我们来一一认识一下它们,这样有利于我们在接下来的 beego 开发中可以充分的发挥他们的作用(你可以通过在 conf/app.conf 中设置对应的值,不区分大小写):

基础配置
  • BConfig
    保存了所有 beego 里面的系统默认参数,你可以通过 web.BConfig 来访问和修改底下的所有配置信息.

配置文件路径,默认是应用程序对应的目录下的 conf/app.conf,用户可以在程序代码中加载自己的配置文件
beego.LoadAppConfig("ini", "conf/app2.conf")
也可以加载多个文件,只要你调用多次就可以了,如果后面的文件和前面的 key 冲突,那么以最新加载的为最新值

消费者实现业务逻辑(消息入库)

消费者执行成功

navicat查看结果

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

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

相关文章

计算机网络基础--认识协议

目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示:这里可以添加本文要记录的大概内容: 计算机网络涉及非常广泛,这篇文章主要对计算机网络有个认识 提示:以下是本篇文章正文内容&#x…

SNMP和Syslog有啥区别

在网络管理的世界中,SNMP(简单网络管理协议)和 Syslog(系统日志)是两种关键技术,它们分别在监控和管理网络设备方面发挥着重要作用。选择合适的工具对于确保网络的高效运行、优化性能和增强安全性至关重要。…

【易上手快捷开发新框架技术】nicegui组件button用法庖丁解牛深度解读源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 前言一、button 组件基本用法1. 最基本用法示例2. 创建带图标按钮 二、button按钮组件样式定制1. 按钮的尺寸调整2. 改变颜色示例3. 按钮的自定义字体大小4. 圆角形状示例5. 自定义边框6. 添加阴影7. 复合按钮8. 浮动按钮9. 可扩展浮动操作按钮QFAB10. 按…

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…

echarts实现3D柱状图(视觉层面)根据博主改编

https://blog.csdn.net/weixin_57798646/article/details/131067725 这是原贴 在这个基础上我需要实现 一根柱子 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf8"> </hea…

【中间件学习】Nginx快速入门(为了配置一个项目)

-----------------------------本文章借鉴遇见狂神说--------------------------- 一、一个产品出现瓶颈&#xff1f;&#xff1f; 在一个产品刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应该就够…

Anaconda虚拟环境默认路径在C盘怎么更改

笔者已经新建好了虚拟环境并且安装了对应库&#xff0c;输入conda env list查询发现虚拟环境竟然安装到了C盘(&#xff61;•́︿•̀&#xff61;)&#xff0c;为避免下一次创建虚拟环境出错&#xff0c;笔者现在修改默认路径置D盘&#xff08;软件安装盘&#xff09; 参考两…

SSH连接Vscode

1.安装扩展包ssh 2-1.获取ssh登录命令 输入连接命令 2-2.获取虚拟机秘钥给vscode 查看远程主机的信息 打开工作目录 打开远程终端 3.RSA免密登录 打开power shell输入命令,获取秘钥 添加公钥到虚拟机 名字会自动更新&#xff0c;下一次进入虚拟机就不需要输入密码了

使用apipost工具导入通过swag生成的golang接口文档步骤

1.通过swag init 生成docs接口文档 见使用swag init --parseDependency生成api文档报错解决办法 2.导入操作 ok,操作完成

数据结构双链表和循环链表

目录 一、循环链表二、双向链表三、循环双向链表 一、循环链表 循环链表就是首尾相接的的链表&#xff0c;就是尾节点的指针域指向头节点使整个链表形成一个循环&#xff0c;这就弥补了以前单链表无法在后面某个节点找到前面的节点&#xff0c;可以从任意一个节点找到目标节点…

Windows11安装Docker Desktop教程

目录 一.安装前置步骤 ▐ 开启虚拟化 ▐ 安装WSL2 ▐ 安装Linux环境 二.Windows上安装Docker 一.安装前置步骤 ▐ 开启虚拟化 首先确保虚拟化的开启&#xff0c;打开任务管理器后查看&#xff1a; 确保图中的虚拟化是已启用&#xff0c;没有开启的需要通过BIOS进行开启&…

vmware 操作系统安装

下面选择你要装入的iso镜像 下面选择要装入的磁盘&#xff0c;建议别装c盘. 之后等待安装即可。

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务&#xff0c; 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod&#xff0c;pod由控制器自动部署&#xff0c;自动维护 那么问题是service的可用…

MySQL-MySQL访问

文章目录 前言一、使用步骤1.MYSQL *mysql_init(MYSQL *mysql);2.MYSQL *mysql_real_connectint mysql_query(MYSQL *mysql, const char *q);MYSQL_RES *mysql_store_result(MYSQL *mysql);my_ulonglong mysql_num_rows(MYSQL_RES *res);unsigned int mysql_num_fields(MYSQL_R…

秋招内推2025--招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

CRC循环校验的功能

CRC (Cyclic Redundancy Check&#xff0c;循环冗余校验) 是一种常用的错误检测码&#xff0c;用于检测数据传输或存储过程中发生的错误。它通过在数据末尾添加一个校验码&#xff08;CRC码&#xff09;来实现。接收方通过同样的算法计算接收数据的CRC码&#xff0c;并将结果与…

DC00022基于ssm高校社团管理系统web社团管理系统java web+MySQL项目web程序设计

1、项目功能演示 DC00022基于ssm高校社团管理系统web社团管理系统java web项目MySQL 2、项目功能描述 社团管理系统分为普通用户、管理员 2.1 普通用户功能 01 系统登录、系统注册 02 系统首页、新闻公告、规章制度、社团活动、互动交流 03 修改密码 04 个人信息修改 05 我的…

Tair简介

概述 Tair是淘宝团队开源的高可用分布式KV存储引擎&#xff0c;采用服务端自动负载均衡方式&#xff0c;使客户端逻辑简单。Tair&#xff0c;即TaoBao Pair缩写&#xff0c;Pair表示一对、一双等意思&#xff0c;即Key-Value数据对。 Tair分为持久化和非持久化两种方式。非持…

C++ 发布包问题汇总

C 发布包问题汇总 1、64位系统 拷贝 C:\Windows\SysWOW64 文件夹下面的DLL 2、32位系统 拷贝C:\Windows\System32文件夹下面的DLL 3、 程序所需dll问题 使用vs调试&#xff0c;在调试界面会打印出加载的dll 4、拷贝dll问题 64位拷贝了32位的dll就会出现加载失败的问题&a…

Java语言之数据类型与变量

Java的数据类型主要分为两类 基本数据类型&#xff1a;整形&#xff08;包括&#xff1a;字节型&#xff1a;byte、1个字节,短整型&#xff1a;short、两个字节&#xff0c;整形&#xff1a;int、4个字节&#xff0c;长整型&#xff1a;long、8个字节&#xff09;&#xff0c;…