使用RabbitMQ实现异步上传
mq异步模式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K6OZdxl1-1660465839237)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814094215320.png)]](https://i-blog.csdnimg.cn/blog_migrate/d82fadfd48184e7f9d83d0cc18883d5c.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1S5Tg0v3-1660465839238)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814094522497.png)]](https://i-blog.csdnimg.cn/blog_migrate/c5900246ed9f192a0c516ff0a099efa6.png)
rabbitmq介绍
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oj77y9EN-1660465839239)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814095447187.png)]](https://i-blog.csdnimg.cn/blog_migrate/508ac66dc6069c7d9bd541f9c43a9ffd.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0PpDvSV-1660465839239)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814100132774.png)]](https://i-blog.csdnimg.cn/blog_migrate/3b54c78108ebff83cb0a2bd15f57fdd5.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g1wnqEWu-1660465839239)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814100153389.png)]](https://i-blog.csdnimg.cn/blog_migrate/24a390604637534b686c4cb2d85e5f64.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpmMdDcj-1660465839240)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814100400422.png)]](https://i-blog.csdnimg.cn/blog_migrate/217287521926e395498a71333cf800c6.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y1ZNciU4-1660465839240)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220814100415737.png)]](https://i-blog.csdnimg.cn/blog_migrate/4f16967b37655bba4bfc842290c170e1.png)
安装rabbitmq
mkdir /data/rabbitmq
docker run -d --hostname rabbit-svr --name rabbit -p 5672:5672 -p 15672:15672 -p 25672:25672 -v /data/rabbitmq:/var/lib/rabbitmq rabbitmq:management
打开管理后台
http://ip:15672
账号: guest
密码: guest
代码演示
package mq
import "github.com/jyyds/filestore/common"
type TransferData struct {
FileHash string
CurLocation string
DestLocation string
DestStoreType common.StoreType
}
生产者
package mq
import (
"log"
"github.com/jyyds/filestore/config"
"github.com/streadway/amqp"
)
var conn *amqp.Connection
var channel *amqp.Channel
func initChannel() bool {
if channel != nil {
return true
}
conn, err := amqp.Dial(config.RabbitURL)
if err != nil {
log.Println(err.Error())
return false
}
channel, err = conn.Channel()
if err != nil {
log.Println(err.Error())
return false
}
return true
}
func Puublish(exchange, routingKey string, msg []byte) bool {
if !initChannel() {
return false
}
err := channel.Publish(
exchange,
routingKey,
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: msg,
},
)
if err != nil {
log.Println(err.Error())
return false
}
return true
}
data := mq.TransferData{
FileHash: fileMeta.FileSha1,
CurLocation: fileMeta.Location,
DestLocation: ossPath,
DestStoreType: cmn.StoreOSS,
}
pubData, _ := json.Marshal(data)
suc := mq.Puublish(
cfg.TransExchangeName,
cfg.TransOSSRoutingKey,
pubData,
)
消费者
package mq
import "log"
var done chan bool
func StartConsume(qName, cName string, callBack func(msg []byte) bool) {
msgs, err := channel.Consume(
qName,
cName,
true,
false,
false,
false,
nil,
)
if err != nil {
log.Println(err.Error())
return
}
go func() {
for msg := range msgs {
procssSuc := callBack(msg.Body)
if !procssSuc {
}
}
}()
<-done
channel.Close()
}
package main
import (
"bufio"
"encoding/json"
"log"
"os"
"github.com/jyyds/filestore/config"
dblayer "github.com/jyyds/filestore/db"
"github.com/jyyds/filestore/mq"
"github.com/jyyds/filestore/store/oss"
)
func ProcessTransfer(msg []byte) bool {
pubData := mq.TransferData{}
err := json.Unmarshal(msg, pubData)
if err != nil {
log.Println(err.Error())
return false
}
filed, err := os.Open(pubData.CurLocation)
if err != nil {
log.Println(err.Error())
return false
}
err = oss.Bucket().PutObject(
pubData.DestLocation,
bufio.NewReader(filed),
)
if err != nil {
log.Println(err.Error())
return false
}
suc := dblayer.UpdateFileLocation(
pubData.FileHash,
pubData.DestLocation,
)
if !suc {
log.Println(err.Error())
return false
}
return true
}
func main() {
log.Println("开始监听转移任务队列...")
mq.StartConsume(
config.TransOSSQueueName,
"transfer_oss",
ProcessTransfer,
)
}