当前位置:网站首页>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进行了实践,希望能帮助到你。
边栏推荐
- Handler 源码解析
- NNLM、RNNLM等语言模型 实现 下一单词预测(next-word prediction)
- 京东云发布新一代分布式数据库StarDB 5.0
- 阿里巴巴政委体系-第五章、阿里政委体系建设
- 揭秘5名运维如何轻松管理数亿级流量系统
- FreeRTOS Intermediate
- Solution for no navigation bar after Word is saved as PDF
- 怎么将自己新文章自动推送给自己的粉丝(巨简单,学不会来打我)
- 【leetcode】剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口,双指针)
- Use ControlTemplate or Style from resource file in WPF .cs and find the control
猜你喜欢
随机推荐
WPF .cs中使用资源文件中的ControlTemplate或Style并找到控件
node版本切换工具NVM以及npm源管理器nrm
X86 function call model analysis
The sword refers to Offer II 044. The maximum value of each level of the binary tree-dfs method
Unity获取canvas 下ui 在屏幕中的实际坐标
php根据两点经纬度计算距离
力扣解法汇总899-有序队列
ADS 2023 Download Link
Shell programming loop statement
Use ControlTemplate or Style from resource file in WPF .cs and find the control
【leetcode】剑指 Offer II 007. 数组中和为 0 的三个数(双指针)
Solidity智能合约开发 — 4.1-合约创建和函数修饰器
In-depth understanding of JVM-memory structure
「学习笔记」高斯消元
The ecological environmental protection management system based on mobile GIS
CS免杀姿势
Postgresql snapshot optimization Globalvis new system analysis (performance greatly enhanced)
Kettle 读取 Excel 数据输出到 Oracle 详解
ctfshow php特性
线上一次JVM FullGC搞得整晚都没睡,彻底崩溃