当前位置: 首页 > news >正文

国内工业设计网站seo免费优化软件

国内工业设计网站,seo免费优化软件,wordpress上传图片裂了,制作企业网站需要什么费用最近在使用Golang做了一个网盘项目(类似百度网盘),这个网盘项目有一个功能描述如下:用户会删除一个文件到垃圾回收站,回收站的文件有一个时间期限,比如24h,24h后数据库中记录和oss中文件会被删除…

最近在使用Golang做了一个网盘项目(类似百度网盘),这个网盘项目有一个功能描述如下:用户会删除一个文件到垃圾回收站,回收站的文件有一个时间期限,比如24h,24h后数据库中记录和oss中文件会被删除,在之前的版本中,可以使用定时任务来检查数据库记录中删除时间来判断是否删除,但是这不是最佳的,因此考虑如何基于RabbitMQ来实现这个功能。

使用RabbitMQ的架构

在这里插入图片描述

代码

因为前端有点麻烦,这里全部使用Golang后端来模拟实现整个架构,包括生产端和消费端。这里有一些细节

  • 注意交换机和队列的绑定,一定要细心
  • 交换机一旦声明了就不能更改,如果要发生一些属性的更改,就要删除原来的内容,重新生成
  • 下列的内容不包含RabbitMQ持久化的内容
package mainimport ("fmt""github.com/streadway/amqp""log""strings"
)func InitRabbitMQ() *amqp.Connection {mq := "amqp"host := "127.0.0.1"port := "5672"user := "root"pwd := "root"dns := strings.Join([]string{mq, "://", user, ":", pwd,"@", host, ":", port, "/"}, "")conn, err := amqp.Dial(dns)if err != nil {log.Fatalf("Failed to connect to RabbitMQ: %v", err)}return conn
}func InitMainExchangeAndQueue(ch *amqp.Channel, userID string) *amqp.Channel {// 队列信息exchangeName := "main_exchange"queueName := fmt.Sprintf("user_queue_%s", userID)messageTTL := int32(300000)// 声明主交换机err := ch.ExchangeDeclare(exchangeName, // 交换机名"direct",     // Exchange typefalse,        // Durablefalse,        // Auto-deletedfalse,        // Internalfalse,        // No-waitnil,          // Arguments)if err != nil {log.Fatalf("Failed to declare an main exchange: %v", err)}// 声明用户队列_, err = ch.QueueDeclare(queueName, // 队列名false,     // Durablefalse,     // Delete when unusedfalse,     // Exclusivefalse,     // No-waitamqp.Table{"x-dead-letter-routing-key": "dead",          // routing-key"x-dead-letter-exchange":    "dead_exchange", // 死信交换机"x-message-ttl":             messageTTL,      // TTL},)if err != nil {log.Fatalf("Failed to declare a queue: %v", err)}// 绑定err = ch.QueueBind(queueName, userID, "main_exchange", false, nil)if err != nil {log.Fatalf("Failed to bind queue to exchange: %v", err)}return ch
}func InitDeadExchangeAndQueue(ch *amqp.Channel) {// 声明死信交换机err := ch.ExchangeDeclare("dead_exchange",amqp.ExchangeDirect,true,false,false,false,nil,)if err != nil {log.Fatalf("Failed to declare an dead exchange: %v", err)}// 声明一个死信队列_, err = ch.QueueDeclare("dead_queue",true,false,false,false,nil)if err != nil {log.Fatalf("Failed to declare a queue: %v", err)}// 绑定err = ch.QueueBind("dead_queue", "dead", "dead_exchange", false, nil)if err != nil {log.Fatalf("Failed to bind queue to exchange: %v", err)}
}func PublishMessage(ch *amqp.Channel, userID, fileID string) {// 用户信息message := fmt.Sprintf("%s|%s", userID, fileID)exchangeName := "main_exchange"// 发布用户消息err := ch.Publish(exchangeName, // ExchangeuserID,       // Routing keyfalse,        // Mandatoryfalse,        // Immediateamqp.Publishing{ContentType: "text/plain",Body:        []byte(message),})if err != nil {log.Fatalf("Failed to publish a message: %v", err)}log.Printf("Message sent to user %s: %s", userID, message)
}func ConsumeTTL(ch *amqp.Channel) {// 声明死信交换机err := ch.ExchangeDeclare("dead_exchange", // 交换机名"direct",        // Exchange typetrue,            // Durablefalse,           // Auto-deletedfalse,           // Internalfalse,           // No-waitnil,             // Arguments)if err != nil {log.Fatalf("Failed to declare a dead letter exchange: %v", err)}// 创建消费者并阻塞等待消费死信队列中的消息megs, err := ch.Consume("dead_queue", // Queue"",           // Consumerfalse,        // Auto-acknowledgefalse,        // Exclusivefalse,        // No-localfalse,        // No-waitnil,          // Args)if err != nil {log.Fatalf("Failed to register a consumer for dead letter queue: %v", err)}// 使用无限循环一直监听fmt.Println("Waiting for message from dead_queue......")for d := range megs {// 实际中,处理消息的逻辑,例如删除文件或其他操作fmt.Println(string(d.Body))// 消费完成后手动确认消息err = d.Ack(false)if err != nil {log.Fatalf("Failed to ack message: %v", err)}}
}func Consume(ch *amqp.Channel, userID string) {// 下面的信息可以通过前后端进行传递queueName := fmt.Sprintf("user_queue_%s", userID)// 消费消息megs, err := ch.Consume(queueName, // Queue"",        // Consumertrue,      // Auto-acknowledgefalse,     // Exclusivefalse,     // No-localfalse,     // No-waitnil,       // Args)if err != nil {log.Fatalf("Failed to register a consumer: %v", err)}// 这里直接是由前端发送过来的API进行触发,所以不用一直阻塞监听d, ok := <-megsif !ok {log.Fatalf("Failed to get message: %v", err)}fmt.Println(string(d.Body))// 消息完成后确认消息err = d.Ack(true)if err != nil {log.Fatalf("Failed to ack message: %v", err)}
}func main() {// 获取客户端client := InitRabbitMQ()defer client.Close()ch, err := client.Channel()if err != nil {log.Fatalf("Failed to open a channel: %v", err)}defer ch.Close()//ConsumeTTL(ch)// 构造dead_exchange及dead_queue// InitDeadExchangeAndQueue(ch)// 假设这是web请求信息//var userID1 = "test-id1"//var fileID1 = "file1"// 构造main_exchange及user_queue//ch = InitMainExchangeAndQueue(ch, userID1)// 针对用户1:假设还消息没有过期时候就被recovery,即在user_queue中就被消费,实际中发布消息的这部分逻辑应当放在前端中//PublishMessage(ch, userID1, fileID1)//time.Sleep(20 * time.Second)// 模拟后端消费消息//Consume(ch, userID1)// 针对用户2:模拟其不被后端消费,过期到死信队列中var userID2 = "test-id2"var fileID2 = "file2"ch = InitMainExchangeAndQueue(ch, userID2)PublishMessage(ch, userID2, fileID2)// 注意这个消息没有被消费,理论上应当被死信队列消费
}

从dead_exchange中消费:
在这里插入图片描述


文章转载自:
http://geometrist.ptzf.cn
http://artel.ptzf.cn
http://flanken.ptzf.cn
http://cephalosporin.ptzf.cn
http://sedentary.ptzf.cn
http://suff.ptzf.cn
http://expedite.ptzf.cn
http://bedstraw.ptzf.cn
http://rmc.ptzf.cn
http://arthurian.ptzf.cn
http://gourdful.ptzf.cn
http://hauberk.ptzf.cn
http://beslave.ptzf.cn
http://qrp.ptzf.cn
http://pokesy.ptzf.cn
http://balladize.ptzf.cn
http://flaunt.ptzf.cn
http://tropophyte.ptzf.cn
http://upkeep.ptzf.cn
http://canalboat.ptzf.cn
http://cunningly.ptzf.cn
http://tigerflower.ptzf.cn
http://crier.ptzf.cn
http://cyp.ptzf.cn
http://aloof.ptzf.cn
http://abutilon.ptzf.cn
http://tactic.ptzf.cn
http://exorbitancy.ptzf.cn
http://swage.ptzf.cn
http://inexpungible.ptzf.cn
http://salometer.ptzf.cn
http://atkins.ptzf.cn
http://whelp.ptzf.cn
http://contingent.ptzf.cn
http://fjord.ptzf.cn
http://athwartships.ptzf.cn
http://shatterproof.ptzf.cn
http://enargite.ptzf.cn
http://brava.ptzf.cn
http://pomfret.ptzf.cn
http://bilingual.ptzf.cn
http://postbase.ptzf.cn
http://stirpiculture.ptzf.cn
http://athletics.ptzf.cn
http://feast.ptzf.cn
http://aircrew.ptzf.cn
http://clientele.ptzf.cn
http://macrosporangium.ptzf.cn
http://intercurrent.ptzf.cn
http://grime.ptzf.cn
http://custodian.ptzf.cn
http://crape.ptzf.cn
http://riveter.ptzf.cn
http://pandal.ptzf.cn
http://ultrarapid.ptzf.cn
http://diptych.ptzf.cn
http://keyphone.ptzf.cn
http://uncondemned.ptzf.cn
http://reperusal.ptzf.cn
http://biometry.ptzf.cn
http://sunlight.ptzf.cn
http://gcc.ptzf.cn
http://companionably.ptzf.cn
http://whimsey.ptzf.cn
http://dehortation.ptzf.cn
http://helicity.ptzf.cn
http://perpetrator.ptzf.cn
http://jurisdiction.ptzf.cn
http://whoof.ptzf.cn
http://bloodstain.ptzf.cn
http://zygology.ptzf.cn
http://countersink.ptzf.cn
http://exscind.ptzf.cn
http://ergatocracy.ptzf.cn
http://comdex.ptzf.cn
http://anglistics.ptzf.cn
http://sunward.ptzf.cn
http://hypaethral.ptzf.cn
http://collyweston.ptzf.cn
http://pelasgian.ptzf.cn
http://teleport.ptzf.cn
http://theorbo.ptzf.cn
http://arose.ptzf.cn
http://cognisant.ptzf.cn
http://electrophoretic.ptzf.cn
http://nuzzer.ptzf.cn
http://boathouse.ptzf.cn
http://foreshorten.ptzf.cn
http://swinger.ptzf.cn
http://inventor.ptzf.cn
http://wooly.ptzf.cn
http://lodicule.ptzf.cn
http://islamism.ptzf.cn
http://erosive.ptzf.cn
http://wentletrap.ptzf.cn
http://gyrostabilizer.ptzf.cn
http://cryptomeria.ptzf.cn
http://bombay.ptzf.cn
http://asroc.ptzf.cn
http://sitten.ptzf.cn
http://www.15wanjia.com/news/61927.html

相关文章:

  • 在哪里做卖车网站2023能用的磁力搜索引擎
  • 网站响应式技术网页模板下载
  • 做网站上饶百度搜索链接入口
  • 如何将网站部署到服务器电脑清理优化大师
  • 商贸有限公司注销流程seo网站排名优化软件
  • 自己做的网站怎么绑域名深圳网络推广公司排名
  • 二手交易平台网站的建设seo关键词优化排名推广
  • 淮南 搭建一个企业展示网站今日国内新闻摘抄十条
  • 做网站的专业叫啥肇庆seo优化
  • 石家庄网站推广专家精准引流推广团队
  • 自己做公司的网站吗网页关键词优化软件
  • 网站设计远程培训关键词优化报价怎么样
  • wordpress 前台用户中心专业seo外包
  • 做网页兼职网站海外市场推广策略
  • 聊城有什么网站制作公司seo优化包括
  • 怎么设计logo用什么软件宁波seo优化费用
  • 做网站怎么样百度正版下载恢复百度
  • 做网站平台的注册什么商标搜狗seo刷排名软件
  • 如何开发网站西安关键词网站排名
  • 商城类的网站一般怎么做建网站seo
  • 在国外的网站做推广长春网站优化团队
  • 企业邮箱怎么使用seo营销专员
  • 企业网站优化推广公司免费建网站的平台
  • 网页升级紧急通知正常更新厦门seo关键词
  • 灯具做外贸的网站有哪些怎么申请网站详细步骤
  • 动态网站asp怎么做百度推广竞价托管
  • 初学php者网站首页怎么做b站推广网站入口202
  • 做网站语言seo 服务
  • 一个公司只能备案一个网站吗十八未成年禁用免费app
  • 中山哪里有做网站品牌策划公司介绍