mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-04-28 06:19:20 +08:00
ce33b79915
* statistics user register
* refactor: router change
* minio init
* UserRegisterCount
* push use local conn
* refactor: user pb update
* remove online push close grpc conn
* refactor: user pb update
* refactor:pb file
* msgs statistics
* msgs statistics
* revoke userID
* refactor: errcode update
* active user
* active user
* active user
* refactor: errcode update
* feat: conn update token
* active user
* active user
* feat: conn update token
* active user
* feat: conn update token
* feat: conn update token
* feat: conn update token
* add tx_oss cos
* active user
* active user
* group create
* group create
* feat: group notification show to conversation
* feat: group notification show to conversation
* group active
* user active
* sendNotificationWithName
* withname
* privateChat
* a2r call option
* grpc with detail return error
* change log error
* chain unary interceptor
* api nil slice map
* fix sync has read
* fix: text update
* fix: update add model
* set conversations update
* set privateChat
* fix: content update
* remove unuse rpc
* msgDestruct
* cron use rpc mw
* set IsMsgDestruct
* msg destruct
* msgDestruct
* s3 minio, cos, oss support
* feat: add implement of GetUsersOnlineStatus, #472 (#477)
* s3 minio, cos, oss support
* s3 route
* remove extendMsg code
* s3 route
* remove unuse code
* s3 pb
* s3 pb
* s3 pb
* s3 presigned put
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* s3 presigned test
* Update .gitignore (#482)
* s3 debug log
* s3 debug log
* cron add log and fix cron
* add log
* cron
* s3 config
* fix kick user bug
* s3 cos
* add kick log
* s3 cos test
* s3 cos test
* s3 cos test
* kick user log
* kickuserlog
* s3 cos copy
* s3 cos copy
* s3 url
* s3 url
* s3 AccessURL
* log
* s3 InitiateMultipartUpload add ExpireTime
* feat: regenerate pb file
* feat: regenerate pb file
* Revert "feat: regenerate pb file"
This reverts commit 434f22564a.
* Delete .idea directory
* feat: regenerate pb file
* fix: remove import C
* fix: add msg transfer main file
* fix: get user online status fix
---------
Co-authored-by: withchao <993506633@qq.com>
Co-authored-by: wangchuxiao <wangchuxiao97@outlook.com>
Co-authored-by: BanTanger <88583317+BanTanger@users.noreply.github.com>
Co-authored-by: withchao <48119764+withchao@users.noreply.github.com>
Co-authored-by: Alan <68671759+hanzhixiao@users.noreply.github.com>
107 lines
4.5 KiB
Go
107 lines
4.5 KiB
Go
package msgtransfer
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation"
|
|
relationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
|
|
openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper"
|
|
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials/insecure"
|
|
)
|
|
|
|
type MsgTransfer struct {
|
|
persistentCH *PersistentConsumerHandler // 聊天记录持久化到mysql的消费者 订阅的topic: ws2ms_chat
|
|
historyCH *OnlineHistoryRedisConsumerHandler // 这个消费者聚合消息, 订阅的topic:ws2ms_chat, 修改通知发往msg_to_modify topic, 消息存入redis后Incr Redis, 再发消息到ms2pschat topic推送, 发消息到msg_to_mongo topic持久化
|
|
historyMongoCH *OnlineHistoryMongoConsumerHandler // mongoDB批量插入, 成功后删除redis中消息,以及处理删除通知消息删除的 订阅的topic: msg_to_mongo
|
|
// modifyCH *ModifyMsgConsumerHandler // 负责消费修改消息通知的consumer, 订阅的topic: msg_to_modify
|
|
}
|
|
|
|
func StartTransfer(prometheusPort int) error {
|
|
db, err := relation.NewGormDB()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := db.AutoMigrate(&relationTb.ChatLogModel{}); err != nil {
|
|
fmt.Printf("gorm: AutoMigrate ChatLogModel err: %v\n", err)
|
|
}
|
|
rdb, err := cache.NewRedis()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mongo, err := unrelation.NewMongo()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := mongo.CreateMsgIndex(); err != nil {
|
|
return err
|
|
}
|
|
client, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema,
|
|
openKeeper.WithFreq(time.Hour), openKeeper.WithRoundRobin(), openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username,
|
|
config.Config.Zookeeper.Password), openKeeper.WithTimeout(10), openKeeper.WithLogger(log.NewZkLogger()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if client.CreateRpcRootNodes(config.GetServiceNames()); err != nil {
|
|
return err
|
|
}
|
|
client.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials()))
|
|
msgModel := cache.NewMsgCacheModel(rdb)
|
|
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
|
|
chatLogDatabase := controller.NewChatLogDatabase(relation.NewChatLogGorm(db))
|
|
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel)
|
|
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
|
|
groupRpcClient := rpcclient.NewGroupRpcClient(client)
|
|
msgTransfer := NewMsgTransfer(chatLogDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient)
|
|
msgTransfer.initPrometheus()
|
|
return msgTransfer.Start(prometheusPort)
|
|
}
|
|
|
|
func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase,
|
|
msgDatabase controller.CommonMsgDatabase,
|
|
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *MsgTransfer {
|
|
return &MsgTransfer{persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient),
|
|
historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase)}
|
|
}
|
|
|
|
func (m *MsgTransfer) initPrometheus() {
|
|
prome.NewSeqGetSuccessCounter()
|
|
prome.NewSeqGetFailedCounter()
|
|
prome.NewSeqSetSuccessCounter()
|
|
prome.NewSeqSetFailedCounter()
|
|
prome.NewMsgInsertRedisSuccessCounter()
|
|
prome.NewMsgInsertRedisFailedCounter()
|
|
prome.NewMsgInsertMongoSuccessCounter()
|
|
prome.NewMsgInsertMongoFailedCounter()
|
|
}
|
|
|
|
func (m *MsgTransfer) Start(prometheusPort int) error {
|
|
var wg sync.WaitGroup
|
|
wg.Add(1)
|
|
fmt.Println("start msg transfer", "prometheusPort:", prometheusPort)
|
|
if config.Config.ChatPersistenceMysql {
|
|
// go m.persistentCH.persistentConsumerGroup.RegisterHandleAndConsumer(m.persistentCH)
|
|
} else {
|
|
fmt.Println("msg transfer not start mysql consumer")
|
|
}
|
|
go m.historyCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyCH)
|
|
go m.historyMongoCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyMongoCH)
|
|
// go m.modifyCH.modifyMsgConsumerGroup.RegisterHandleAndConsumer(m.modifyCH)
|
|
err := prome.StartPrometheusSrv(prometheusPort)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
wg.Wait()
|
|
return nil
|
|
}
|