当前位置:网站首页>Golang死信队列的使用
Golang死信队列的使用
2022-08-03 19:46:00 【叶赫那拉 赫敏】
背景
GAOKAO
系统开发过程中涉及到任务执行超时的问题,大家都知道一旦任务执行超时,任务状态没法自动更新,任务状态没有更新用户就会一直等结果,这样既没法继续重复执行超时任务用户体验也不好,因此需要解决下超时任务的问题。
实现方案
问:RabbitMQ死信队列是什么?
答:死信,在官网中对应的单词为“Dead Letter”,可以看出翻译确实非常的简单粗暴。那么死信是个什么东西呢?“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况之一:
那么该消息将成为“死信”。
“死信”消息会被RabbitMQ进行特殊处理,如果配置了死信队列信息,那么该消息将会被丢进死信队列中,如果没有配置,则该消息将会被丢弃。

问:如何配置死信队列?
答:其实很简单,大概可以分为以下步骤:
第三步:发送消息到 queue.normal 中,消息过期之后流入 queue.dlx 队列中,然后进行消费


代码实现
package main
import (
"fmt"
"github.com/streadway/amqp"
"time"
)
func main() {
conn, _ := amqp.Dial("amqp://user:[email protected]:ip/vhost")
ch, _ := conn.Channel()
body := "Hello World " + time.Now().Format("2021-10-20 15:04:05")
fmt.Println(body)
//声明交换器
args := amqp.Table{"x-dead-letter-exchange": "exchange.dlx"}
// 声明一个queue.normal队列,并设置队列的死信交换机为"exchange.dlx"
q, _ := ch.QueueDeclare("queue.normal", true, false, false, false, args)
ch.Publish("", q.Name, false, false, amqp.Publishing{
Body: []byte(body),
Expiration: "5000", // 设置TTL为5秒
})
// defer 关键字
defer conn.Close() // 压栈 后进先出
defer ch.Close() // 压栈 后进先出
}
package main
import (
"fmt"
"github.com/streadway/amqp"
)
func main() {
conn, _ := amqp.Dial("amqp://xxx:[email protected]:ip/vhost")
ch, _ := conn.Channel()
//监听queue.dlx队列
msgs, _ := ch.Consume("queue.dlx", "", true, false, false, false, nil)
for d := range msgs {
fmt.Printf("receive: %s\n", d.Body) // 收到消息,业务处理
}
}
总结
延迟队列在现实业务场景中,还是有很多实际用途的,订单的超时取消、重试等,都可以借助此来完成,在 RabbitMQ 中的实现主要是根据 TTL + 死信队列来完成的,本文最后采用了Golang进行了实践,希望能帮助到你。
边栏推荐
- Detailed explanation of JWT
- 2022 CCF中国开源大会会议通知(第三轮)
- 小马智行起诉擎天智卡:索赔6000万 彭军称要斗争到底
- 面试突击:什么是粘包和半包?怎么解决?
- LeetCode 952. Calculate Maximum Component Size by Common Factor
- 线上一次JVM FullGC搞得整晚都没睡,彻底崩溃
- Shell programming loop statement
- 力扣刷题之移动零
- 【统计机器学习】线性回归模型
- Interview Blitz: What Are Sticky Packs and Half Packs?How to deal with it?
猜你喜欢

阿里巴巴政委体系-第六章、阿里政委体系运作

小马智行起诉擎天智卡:索赔6000万 彭军称要斗争到底

开源生态研究与实践| ChinaOSC

深入理解JVM-内存结构

花 30 美金请 AI 画家弄了个 logo,网友:画得非常好,下次别画了!

Network protocol-TCP, UDP difference and TCP three-way handshake, four wave

JMeter笔记5 |Badboy使用和录制

【夜莺监控方案】08-监控msyql集群(prometheuse+n9e+mysqld_exporter)

友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议

Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning
随机推荐
Teach you to locate online MySQL slow query problem hand by hand, package teaching package meeting
Force is brushed buckle problem for the sum of two Numbers
力扣刷题之有效的正方形(每日一题7/29)
从腾讯阿里等大厂出来创业搞 Web3、元宇宙的人在搞什么
Handler source code analysis
【leetcode】剑指 Offer II 007. 数组中和为 0 的三个数(双指针)
Radondb mysql installation problems
不要再用if-else
友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议
Matlab论文插图绘制模板第42期—气泡矩阵图(相关系数矩阵图)
Postgresql源码(64)查询执行——子模块Executor(2)执行前的数据结构和执行过程
Kettle 读取 Excel 数据输出到 Oracle 详解
【木马免杀】
告诉你0基础怎么学好游戏建模?
CentOS 7 安装mysql
Statistical machine learning 】 【 linear regression model
网络协议-TCP、UDP区别及TCP三次握手、四次挥手
Handler 源码解析
边缘盒子+时序数据库,美的数字化平台 iBuilding 背后的技术选型
力扣刷题之分数加减运算(每日一题7/27)