This commit is contained in:
laodaming 2023-08-07 10:48:14 +08:00
parent 624b90260f
commit a106082364
5 changed files with 55 additions and 79 deletions

View File

@ -3,7 +3,6 @@ package logic
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"fusenapi/constants" "fusenapi/constants"
"fusenapi/initalize" "fusenapi/initalize"
"fusenapi/server/websocket/internal/types" "fusenapi/server/websocket/internal/types"
@ -108,7 +107,7 @@ func (l *DataTransferLogic) DataTransfer(svcCtx *svc.ServiceContext, w http.Resp
inChan: make(chan []byte, 1000), inChan: make(chan []byte, 1000),
outChan: make(chan []byte, 1000), outChan: make(chan []byte, 1000),
renderProperty: renderProperty{ renderProperty: renderProperty{
renderImageTask: make(map[string]struct{}), renderImageTask: make(map[string]string),
renderImageTaskCtlChan: make(chan renderImageControlChanItem, 100), renderImageTaskCtlChan: make(chan renderImageControlChanItem, 100),
}, },
} }
@ -250,11 +249,6 @@ func (w *wsConnectItem) sendToOutChan(data []byte) {
} }
} }
// 获取需要渲染图片的map key
func (w *wsConnectItem) getRenderImageMapKey(productId, templateTagId, logoId int64, algorithmVersion string) string {
return fmt.Sprintf("%d-%d-%d-%s", productId, templateTagId, logoId, algorithmVersion)
}
// 格式化返回数据 // 格式化返回数据
func (w *wsConnectItem) respondDataFormat(msgType string, data interface{}) []byte { func (w *wsConnectItem) respondDataFormat(msgType string, data interface{}) []byte {
d := types.DataTransferData{ d := types.DataTransferData{

View File

@ -61,21 +61,20 @@ func (l *RenderNotifyLogic) RenderNotify(req *types.RenderNotifyReq) (resp *basi
if ws.isClose { if ws.isClose {
return true return true
} }
renderKey := ws.getRenderImageMapKey(req.Info.ProductId, req.Info.TemplateTagId, req.Info.LogoId, req.Info.AlgorithmVersion)
//查询有无该渲染任务 //查询有无该渲染任务
_, ok = ws.renderProperty.renderImageTask[renderKey] renderId, ok := ws.renderProperty.renderImageTask[req.Info.TaskId]
if !ok { if !ok {
return true return true
} }
b := ws.respondDataFormat(constants.WEBSOCKET_RENDER_IMAGE, types.RenderImageRspMsg{ b := ws.respondDataFormat(constants.WEBSOCKET_RENDER_IMAGE, types.RenderImageRspMsg{
ProductId: req.Info.ProductId, RenderId: renderId,
TemplateTagId: req.Info.TemplateTagId, Image: req.Info.Image,
Image: req.Info.Image,
}) })
//删除对应的需要渲染的图片map //删除对应的需要渲染的图片map
ws.renderProperty.renderImageTaskCtlChan <- renderImageControlChanItem{ ws.renderProperty.renderImageTaskCtlChan <- renderImageControlChanItem{
Option: 0, //0删除 1添加 Option: 0, //0删除 1添加
Key: renderKey, TaskId: req.Info.TaskId,
RenderId: renderId,
} }
//发送数据到out chan //发送数据到out chan
ws.sendToOutChan(b) ws.sendToOutChan(b)

View File

@ -4,38 +4,21 @@ import (
"encoding/json" "encoding/json"
"fusenapi/constants" "fusenapi/constants"
"fusenapi/server/websocket/internal/types" "fusenapi/server/websocket/internal/types"
"fusenapi/utils/hash"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
) )
// 云渲染属性 // 云渲染属性
type renderProperty struct { type renderProperty struct {
renderImageTask map[string]struct{} //需要渲染的图片任务 renderImageTask map[string]string //需要渲染的图片任务 key是taskId val 是renderId
renderImageTaskCtlChan chan renderImageControlChanItem //渲染任务新增移除的控制通道 renderImageTaskCtlChan chan renderImageControlChanItem //渲染任务新增移除的控制通道
} }
// 渲染任务新增移除的控制通道的数据 // 渲染任务新增移除的控制通道的数据
type renderImageControlChanItem struct { type renderImageControlChanItem struct {
Option int // 0删除 1添加 Option int // 0删除 1添加
Key string //map的key TaskId string //map的key
} RenderId string // map的val
// 操作连接中渲染任务的增加/删除
func (w *wsConnectItem) operationRenderTask() {
for {
select {
case <-w.closeChan:
return
case data := <-w.renderProperty.renderImageTaskCtlChan:
switch data.Option {
case 0: //删除任务
delete(w.renderProperty.renderImageTask, data.Key)
case 1: //新增任务
w.renderProperty.renderImageTask[data.Key] = struct{}{}
default:
}
}
}
} }
// 渲染请求数据处理发送云渲染服务处理 // 渲染请求数据处理发送云渲染服务处理
@ -48,23 +31,39 @@ func (w *wsConnectItem) SendToCloudRender(data []byte) {
} }
logx.Info("收到请求云渲染图片数据:", renderImageData) logx.Info("收到请求云渲染图片数据:", renderImageData)
//把需要渲染的图片任务加进去 //把需要渲染的图片任务加进去
for _, productId := range renderImageData.ProductIds { select {
select { case <-w.closeChan: //连接关闭了
case <-w.closeChan: //连接关闭了 return
default:
//加入渲染任务
taskId := hash.JsonHashKey(renderImageData.RenderData)
w.renderProperty.renderImageTaskCtlChan <- renderImageControlChanItem{
Option: 1, //0删除 1添加
TaskId: taskId,
RenderId: renderImageData.RenderId,
}
//发送给对应的流水线组装数据
if err := w.rabbitMq.SendMsg(constants.RABBIT_MQ_ASSEMBLE_RENDER_DATA, data); err != nil {
logx.Error("发送渲染任务数据到MQ失败:", string(data), "err:", err)
return return
default: }
//加入渲染任务 logx.Info("发送渲染数据到rabbitmq成功:", string(data))
key := w.getRenderImageMapKey(productId, renderImageData.TemplateTagId, renderImageData.LogoId, renderImageData.AlgorithmVersion) }
w.renderProperty.renderImageTaskCtlChan <- renderImageControlChanItem{ }
Option: 1, //0删除 1添加
Key: key, // 操作连接中渲染任务的增加/删除
func (w *wsConnectItem) operationRenderTask() {
for {
select {
case <-w.closeChan:
return
case data := <-w.renderProperty.renderImageTaskCtlChan:
switch data.Option {
case 0: //删除任务
delete(w.renderProperty.renderImageTask, data.TaskId)
case 1: //新增任务
w.renderProperty.renderImageTask[data.TaskId] = data.RenderId
} }
//发送给对应的流水线组装数据
if err := w.rabbitMq.SendMsg(constants.RABBIT_MQ_ASSEMBLE_RENDER_DATA, data); err != nil {
logx.Error("发送渲染任务数据到MQ失败:", string(data), "err:", err)
continue
}
logx.Info("发送渲染数据到rabbitmq成功:", string(data))
} }
} }
} }

View File

@ -11,18 +11,13 @@ type DataTransferData struct {
} }
type RenderImageReqMsg struct { type RenderImageReqMsg struct {
ProductIds []int64 `json:"product_ids"` //产品 id RenderId string `json:"render_id"` //渲染id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id RenderData interface{} `json:"render_data"` //参数数据
LogoId int64 `json:"logo_id"` //logoid
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
} }
type RenderImageRspMsg struct { type RenderImageRspMsg struct {
ProductId int64 `json:"product_id"` //产品 id RenderId string `json:"render_id"` //渲染id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id Image string `json:"image"` //渲染结果图片
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
LogoId int64 `json:"logo_id"` //logoid
Image string `json:"image"` //渲染后的图片
} }
type ThirdPartyLoginRspMsg struct { type ThirdPartyLoginRspMsg struct {
@ -36,11 +31,8 @@ type RenderNotifyReq struct {
} }
type NotifyInfo struct { type NotifyInfo struct {
ProductId int64 `json:"product_id"` //产品id TaskId string `json:"task_id"` //任务id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id Image string `json:"image"`
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
LogoId int64 `json:"logo_id"` //logoid
Image string `json:"image"`
} }
type ThirdPartyLoginNotifyReq struct { type ThirdPartyLoginNotifyReq struct {

View File

@ -26,17 +26,12 @@ type DataTransferData {
D interface{} `json:"d"` //传递的消息 D interface{} `json:"d"` //传递的消息
} }
type RenderImageReqMsg { //websocket接受要云渲染处理的数据 type RenderImageReqMsg { //websocket接受要云渲染处理的数据
ProductIds []int64 `json:"product_ids"` //产品 id RenderId string `json:"render_id"` //渲染id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id RenderData interface{} `json:"render_data"` //参数数据
LogoId int64 `json:"logo_id"` //logoid
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
} }
type RenderImageRspMsg { //websocket发送渲染完的数据 type RenderImageRspMsg { //websocket发送渲染完的数据
ProductId int64 `json:"product_id"` //产品 id RenderId string `json:"render_id"` //渲染id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id Image string `json:"image"` //渲染结果图片
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
LogoId int64 `json:"logo_id"` //logoid
Image string `json:"image"` //渲染后的图片
} }
type ThirdPartyLoginRspMsg { //websocket三方登录的通知数据 type ThirdPartyLoginRspMsg { //websocket三方登录的通知数据
Token string `json:"token"` Token string `json:"token"`
@ -48,11 +43,8 @@ type RenderNotifyReq {
Info NotifyInfo `json:"info"` Info NotifyInfo `json:"info"`
} }
type NotifyInfo { type NotifyInfo {
ProductId int64 `json:"product_id"` //产品id TaskId string `json:"task_id"` //任务id
TemplateTagId int64 `json:"template_tag_id"` //模板标签id Image string `json:"image"`
AlgorithmVersion string `json:"algorithm_version,optional"` //算法版本
LogoId int64 `json:"logo_id"` //logoid
Image string `json:"image"`
} }
//第三方登录通知接口 //第三方登录通知接口
type ThirdPartyLoginNotifyReq { type ThirdPartyLoginNotifyReq {