From ab3a3c83ed04fc479e608e3c285af6b9d9c693d4 Mon Sep 17 00:00:00 2001 From: derekwin Date: Tue, 21 Feb 2023 11:33:12 +0800 Subject: [PATCH] =?UTF-8?q?add=20relation=E5=8D=8F=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kitex_server/relationservice.go | 63 +++++++++++++++++++++++++++++++-- kitex_server/userservice.go | 26 +++++++++++--- kitex_server/videoservice.go | 8 ++--- 3 files changed, 85 insertions(+), 12 deletions(-) diff --git a/kitex_server/relationservice.go b/kitex_server/relationservice.go index b91e433..823a103 100755 --- a/kitex_server/relationservice.go +++ b/kitex_server/relationservice.go @@ -4,6 +4,8 @@ import ( "context" "errors" "fmt" + "sync" + "github.com/ClubWeGo/douyin/biz/model/core" "github.com/ClubWeGo/douyin/biz/model/relation" relationserver "github.com/ClubWeGo/relationmicro/kitex_gen/relation" @@ -177,7 +179,62 @@ func VerifyFollowParam(myUid int64, targetUid int64, actionType int32) *string { return nil } -// TODO : .GetIsFollowSetByUserIdSet -func GetIsFollowSetByUserIdSet(idSet []int64) (isFollowSet []int64, err error) { - return []int64{}, nil +// 协程接口 + +type FollowInfoWithId struct { + Id int64 + followInfo relationserver.FollowInfo +} + +// 通过GetFollowInfoMethod批量获取FollowInfo,包装为Map +func GetRelationMap(idSet []int64, currentUser int64, respRelationMap chan map[int64]FollowInfoWithId, wg *sync.WaitGroup, errChan chan error) { + defer wg.Done() + + wgRelation := &sync.WaitGroup{} + insideResultChan := make(chan FollowInfoWithId, len(idSet)) + insideErrChan := make(chan error, len(idSet)) + for _, id := range idSet { + wgRelation.Add(1) + go func(userid int64) { + defer wgRelation.Done() + r, err := Relationclient.GetFollowInfoMethod(context.Background(), &relationserver.GetFollowInfoReq{ + MyUid: ¤tUser, + TargetUid: userid, + }) + if err != nil { + insideResultChan <- FollowInfoWithId{} // 出错,传回一个空值 + insideErrChan <- err + return + } + if r.StatusCode == 1 { // 0 error, 1 success, 2 参数不通过 + followInfoWithId := FollowInfoWithId{ + Id: userid, + followInfo: *r.FollowInfo, + } + insideResultChan <- followInfoWithId + insideErrChan <- nil + return // 成功 + } + insideResultChan <- FollowInfoWithId{} //没有显式出错,但是没有值 + insideErrChan <- nil + }(id) + } + wgRelation.Wait() + for range idSet { + err := <-insideErrChan + if err != nil { + respRelationMap <- map[int64]FollowInfoWithId{} + errChan <- err + return // 有协程查数据错误,直接报错返回 + } + } + // 封装数据 + result := make(map[int64]FollowInfoWithId, len(idSet)) + for range idSet { + data := <-insideResultChan + result[data.Id] = data + } + + respRelationMap <- result //没有显式出错,但是没有值 + errChan <- errors.New("relation server GetFollowInfoMethod error: 微服务调用成功,但是没有查到值") } diff --git a/kitex_server/userservice.go b/kitex_server/userservice.go index d39f5d2..a2b2fbe 100755 --- a/kitex_server/userservice.go +++ b/kitex_server/userservice.go @@ -3,12 +3,13 @@ package kitex_server import ( "context" "errors" - "github.com/prometheus/common/log" "strconv" "sync" + "github.com/ClubWeGo/douyin/biz/model/core" "github.com/ClubWeGo/usermicro/kitex_gen/usermicro" "github.com/ClubWeGo/videomicro/kitex_gen/videomicro" + "github.com/prometheus/common/log" ) // 工具函数 @@ -90,6 +91,17 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int wgUser.Add(1) go GetVideoCountMap(idSet, respVideoCountMap, wgUser, respVideoCountMapError) + // 批量查询FollowCount, FollowerCount,Is_follow 从relation服务 + // Videoclient.GetVideoCountSetByIdUserSetMethod(context.Background(), &videomicro.GetVideoCountSetByIdUserSetReq{}) + respRelationMap := make(chan map[int64]FollowInfoWithId, 1) + defer close(respRelationMap) + respRelationMapError := make(chan error, 1) + defer close(respRelationMapError) + wgUser.Add(1) + go GetRelationMap(idSet, currentUser, respRelationMap, wgUser, respRelationMapError) + + // TODO : TotalFavourited, FavoriteCount,传入查询的userId切片,查对应这两个字段的切片,(结果需要携带UserId):从favorite服务 + // 等待数据 wgUser.Wait() @@ -106,6 +118,12 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int if err != nil { errSlice = append(errSlice, err) } + + RelationMap := <-respRelationMap + err = <-respRelationMapError + if err != nil { + errSlice = append(errSlice, err) + } // TODO: 其他协程的错误处理 errChan <- errSlice // 错误切片 @@ -115,9 +133,9 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int AuthorMap[id] = core.User{ ID: user.ID, Name: user.Name, - FollowCount: 0, // TODO: 从获取的数据中拿 - FollowerCount: 0, // TODO: 从获取的数据中拿 - IsFollow: false, // TODO: 从获取的数据中拿 + FollowCount: RelationMap[id].followInfo.FollowCount, // Relation服务 最新的followCount + FollowerCount: RelationMap[id].followInfo.FollowerCount, // Relation服务 最新的followerCount + IsFollow: RelationMap[id].followInfo.IsFollow, // Relation服务 最新的isFollow Avatar: user.Avatar, BackgroundImage: user.BackgroundImage, Signature: user.Signature, diff --git a/kitex_server/videoservice.go b/kitex_server/videoservice.go index c3aa653..839d370 100755 --- a/kitex_server/videoservice.go +++ b/kitex_server/videoservice.go @@ -51,13 +51,11 @@ func GetVideoLatestMap(idSet []int64, currentUser int64, respVideoMap chan map[i wgVideo := &sync.WaitGroup{} // 本函数子协程的wg - // 批量查询视频的 被喜欢数 ,Favorite 从Favorite服务 - // 批量查询 favorite_count, total_favourited 从favorite服务: kitex_server.FavoriteClient.UserFavoriteCountMethod() - // TODO: 结果要 videoId与对应的数据 map + // 批量查询视频的 被喜欢数 ,传入视频id的切片,返回对应的FavoriteCount的切片(需携带对应视频id) 从Favorite服务 - // 批量查询 is_follow, 从relation服务; 传入目标userID和currentUser + // 批量查询视频的评论数,传入视频id的切片,返回对应的评论数(需携带对应视频id),从comment服务 - // 批量查询 follow_count, follower_cout 从relation服务 + // 批量查询 is_favorite, 传入目标视频id切片和currentUser查is_favorite的切片(结果需要携带视频id,douyin里后续需要转成map):从favorite; // 等待数据 wgVideo.Wait()