client scalling handling
parent
959aa6c5ba
commit
64a1fede71
2
main.go
2
main.go
|
@ -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),
|
||||||
|
|
|
@ -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)
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue