当前位置:网站首页>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进行了实践,希望能帮助到你。
边栏推荐
猜你喜欢

从文本匹配到语义相关——新闻相似度计算的一般思路

简易电子琴设计(c语言)

深入理解JVM-内存结构

Statistical machine learning 】 【 linear regression model

安装anaconda并创建虚拟环境

阿里巴巴政委体系-第五章、阿里政委体系建设

开源教育论坛| ChinaOSC

149. The largest number on a straight line, and check the set

Solution for no navigation bar after Word is saved as PDF

Reveal how the five operational management level of hundreds of millions of easily flow system
随机推荐
阿里巴巴政委体系-第五章、阿里政委体系建设
Detailed explanation of JWT
ECCV 2022 Oral | 满分论文!视频实例分割新SOTA: IDOL
傅里叶变换(深入浅出)
告诉你0基础怎么学好游戏建模?
Postgresql source code (64) Query execution - data structure and execution process before submodule Executor (2) execution
2022 CCF中国开源大会会议通知(第三轮)
揭秘5名运维如何轻松管理数亿级流量系统
Internet Download Manager简介及下载安装包,IDM序列号注册问题解决方法
dpkg强制安装软件
「游戏建模干货」建模大师几步操作,学习经典,赶紧脑补一下吧
Reveal how the five operational management level of hundreds of millions of easily flow system
Kettle 读取 Excel 数据输出到 Oracle 详解
Introduction to Cosine Distance
Radondb mysql installation problems
Unity gets the actual coordinates of the ui on the screen under the canvas
matplotlib画polygon, circle
Unity获取canvas 下ui 在屏幕中的实际坐标
Use ControlTemplate or Style from resource file in WPF .cs and find the control
高位套牢机构,用友网络的信任危机是如何产生的?