client scalling handling

alpha
alex 2023-02-27 22:48:39 +01:00
parent 959aa6c5ba
commit 64a1fede71
6 changed files with 53 additions and 55 deletions

View File

@ -21,7 +21,7 @@ func init() {
cfg := config.Cfg cfg := config.Cfg
gocnjhelper.InitLogger(config.Cfg.Debug, gocnjhelper.InitLogger(cfg.Debug,
true, true,
true, true,
gocnjhelper.GetConnectionString(cfg.RabbitMq.Username, cfg.RabbitMq.Password, cfg.RabbitMq.Host), gocnjhelper.GetConnectionString(cfg.RabbitMq.Username, cfg.RabbitMq.Password, cfg.RabbitMq.Host),

View File

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"clickandjoin.app/websocketserver/modules/cache"
"clickandjoin.app/websocketserver/modules/structs" "clickandjoin.app/websocketserver/modules/structs"
"clickandjoin.app/websocketserver/modules/utils" "clickandjoin.app/websocketserver/modules/utils"
"clickandjoin.app/websocketserver/socketclients" "clickandjoin.app/websocketserver/socketclients"
@ -74,23 +75,24 @@ func CreateWSClientBinding(socketClient *structs.SocketClient, id string) (err e
case msg := <-msgs: case msg := <-msgs:
var receivedMessage structs.ReceivedMessage var receivedMessage structs.ReceivedMessage
err = utils.UnmarshalReceivedMessage(msg.Body, &receivedMessage) gocnjhelper.LogDebugf("RABBITMQ RECEIVED MESSAGE: %s", msg.Body)
if err != nil { if err = utils.UnmarshalReceivedMessage(msg.Body, &receivedMessage); err != nil {
gocnjhelper.LogErrorf("Failed to unmarshal received msg, err: %s", err) break
} }
gocnjhelper.LogDebugf("RABBITMQ RECEIVED MESSAGE: %s", receivedMessage)
if receivedMessage.Cmd == utils.RabbitMqWsCmdInternalDeleteWebSocketSession { if receivedMessage.Cmd == utils.RabbitMqWsCmdInternalDeleteWebSocketSession {
gocnjhelper.LogDebugf("here %s", fmt.Sprintf("%v", receivedMessage.Body)) gocnjhelper.LogDebugf("rabbitmq here %s", fmt.Sprintf("%v", receivedMessage.Body))
/*
if socketClient, ok := cache.GetSocketClient(fmt.Sprintf("%v", receivedMessage.Body)); ok { if socketClient, ok := cache.GetSocketClient(fmt.Sprintf("%v", receivedMessage.Body)); ok {
logrus.Println("here deleted", socketClient) gocnjhelper.LogDebugf("rabbitmq del socketClient %s", socketClient)
socketClient.SendCloseMessage() cache.DeleteClient(fmt.Sprintf("%v", receivedMessage.Body))
socketClient.CancelFunc() socketClient.SendCloseMessage()
DeleteWSClient(socketClient.RabbitMqConsumerId, socketClient.RabbitMqQueueName) socketClient.CancelFunc()
} */ DeleteWSClient(socketClient.RabbitMqConsumerId, socketClient.RabbitMqQueueName)
} else {
gocnjhelper.LogDebug("rabbitmq del socketclient else not found")
}
} else { } else {
err = socketClient.SendMessage(structs.SendSocketMessage{Cmd: receivedMessage.Cmd, Body: receivedMessage.Body}) err = socketClient.SendMessage(structs.SendSocketMessage{Cmd: receivedMessage.Cmd, Body: receivedMessage.Body})
@ -98,13 +100,6 @@ func CreateWSClientBinding(socketClient *structs.SocketClient, id string) (err e
gocnjhelper.LogErrorf("Failed to send message to client, err: %s", err) gocnjhelper.LogErrorf("Failed to send message to client, err: %s", err)
} }
} }
/*
err = socketClient.SendMessage(structs.SendSocketMessage{Cmd: receivedMessage.Cmd, Body: receivedMessage.Body})
if err != nil {
logrus.Errorln("Failed to send message to client, err:", err)
}*/
} }
} }
}() }()

View File

@ -24,40 +24,46 @@ func Init() {
} }
} }
func AddUserWebSocketSessionId(userId string, wsSessionId string) { func AddUserWebSocketSessionId(userId string, wsSessionId string) (sessionAlreadyConnected bool) {
cmd := rdb.LPush(ctx, userId, wsSessionId) res, err := rdb.SAdd(ctx, userId, wsSessionId).Result()
gocnjhelper.LogDebugf("b %s", cmd) if err != nil {
gocnjhelper.LogErrorf("Failed to add key, err: %s", err.Error())
}
gocnjhelper.LogDebugf("redis SAdd %v", res, userId, wsSessionId)
return res == 0
} }
func RemoveUserWebSocketSessionId(userId string, wsSessionId string) { func RemoveUserWebSocketSessionId(userId string, wsSessionId string) {
cmd := rdb.LRem(ctx, userId, -1, wsSessionId) res, err := rdb.SRem(ctx, userId, wsSessionId).Result()
gocnjhelper.LogDebugf("rem %s", cmd) if err != nil {
gocnjhelper.LogErrorf("Failed to rem key, err: %s", err.Error())
}
gocnjhelper.LogDebugf("redis rem key %v", res)
} }
func IsUserConnectedToAnyWebSocketServer(userId string) bool { func IsUserConnectedToAnyWebSocketServer(userId string) bool {
cmd := rdb.Exists(ctx, userId) sessions, err := rdb.SMembers(ctx, userId).Result()
gocnjhelper.LogDebugf("exists b %s", cmd) if err != nil {
gocnjhelper.LogErrorf("SMembers, err: %s", err.Error())
return false
}
return cmd.Val() == 1 return len(sessions) > 0
} }
func ExistsUserWebSocketSessionId(userId string, wsSessionId string) bool { func ExistsUserWebSocketSessionId(userId string, wsSessionId string) bool {
wsSessions := rdb.LRange(ctx, userId, 0, -1) res, err := rdb.SIsMember(ctx, userId, wsSessionId).Result()
gocnjhelper.LogDebugf("found ws %s", wsSessions.Val()) if err != nil {
gocnjhelper.LogErrorf("SIsMember, err: %s", err.Error())
return isWsSessionIdInList(wsSessions.Val(), wsSessionId) return false
}
func isWsSessionIdInList(wsSessions []string, wsSessionId string) bool {
for _, item := range wsSessions {
if item == wsSessionId {
return true
}
} }
return false return res
} }

View File

@ -22,7 +22,7 @@ func UnmarshalReceivedMessage(body []byte, message any) error {
err := json.Unmarshal(body, &message) err := json.Unmarshal(body, &message)
if err != nil { if err != nil {
gocnjhelper.LogDebugf("Failed to unmarshal received message, err: %s", err) gocnjhelper.LogErrorf("Failed to unmarshal received message, err: %s", err)
return err return err
} }

View File

@ -32,7 +32,3 @@ func getAllSocketClientsByUserId(userId string) []*structs.SocketClient {
return connectedSocketClients return connectedSocketClients
} }
func GetSocketClientByWsSessionId(wsSessionId string) (socketClient *structs.SocketClient, ok bool) {
return cache.GetSocketClient(wsSessionId)
}

View File

@ -26,27 +26,27 @@ func RunHub() {
newSocketClient.UserId = userId newSocketClient.UserId = userId
gocnjhelper.LogDebugf("clients: %d %s", len(cache.GetSocketClients()), cache.GetSocketClients()) gocnjhelper.LogDebugf("clients: %d", len(cache.GetSocketClients()))
if redis.ExistsUserWebSocketSessionId(userId, wsSessionId) { // kick out the other connected socket connections with this session if sessionAlreadyConnected := redis.AddUserWebSocketSessionId(userId, wsSessionId); sessionAlreadyConnected {
gocnjhelper.LogDebug("ws id already in list") gocnjhelper.LogDebug("sessionAlreadyConnected")
if socketClient, ok := socketclients.GetSocketClientByWsSessionId(wsSessionId); ok { if socketClient, ok := cache.GetSocketClient(wsSessionId); ok {
gocnjhelper.LogDebugf("sc %s %s", socketClient, ok) gocnjhelper.LogDebugf("sc %s %s", socketClient, ok)
// a socket client with this session is connected to this server // a socket client with this session is connected to this server
socketClient.SendCloseMessage() socketClient.SendCloseMessage()
socketClient.CancelFunc() socketClient.CancelFunc()
rabbitmq.DeleteWSClient(socketClient.RabbitMqConsumerId, socketClient.RabbitMqQueueName) rabbitmq.DeleteWSClient(socketClient.RabbitMqConsumerId, socketClient.RabbitMqQueueName)
} else { // a socket client with this session is connected to any other server } else {
/*logrus.Println("else", newSocketClient.UserId) // a socket client with this session is connected to any other server
gocnjhelper.LogDebug("socket client with this session is connected to any other server")
rabbitmq.PublishClientMessage(structs.RabbitMqMessage{ rabbitmq.PublishClientMessage(structs.RabbitMqMessage{
Cmd: utils.RabbitMqWsCmdInternalDeleteWebSocketSession, Cmd: utils.RabbitMqWsCmdInternalDeleteWebSocketSession,
Rec: newSocketClient.UserId, Rec: newSocketClient.UserId,
Body: wsSessionId}) */ Body: wsSessionId})
} }
} else {
redis.AddUserWebSocketSessionId(userId, wsSessionId)
} }
err := rabbitmq.CreateWSClientBinding(newSocketClient, userId) err := rabbitmq.CreateWSClientBinding(newSocketClient, userId)
@ -58,6 +58,7 @@ func RunHub() {
cache.AddSocketClient(wsSessionId, newSocketClient) cache.AddSocketClient(wsSessionId, newSocketClient)
gocnjhelper.LogDebugf("clients: %d", len(cache.GetSocketClients()))
gocnjhelper.LogDebugf("REGISTER CLIENT: %s", wsSessionId) gocnjhelper.LogDebugf("REGISTER CLIENT: %s", wsSessionId)
// for testing // for testing