使用RabbitMQ实现异步上传
mq异步模式
rabbitmq介绍
安装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,
)
}