Initialize Redis-backed RoomRegistry for room-to-pod assignment and add Pod-specific game.join handling logic with NATS subscriptions. Update cache-busting version for client assets.
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 2m30s
All checks were successful
Dynamic Branch Deploy / build-and-deploy (push) Successful in 2m30s
This commit is contained in:
@@ -21,7 +21,8 @@ var (
|
||||
playerSessions = make(map[string]*server.Room)
|
||||
mu sync.RWMutex
|
||||
globalWorld *game.World
|
||||
serverID string // Eindeutige Server-ID für diesen Pod
|
||||
serverID string // Eindeutige Server-ID für diesen Pod
|
||||
roomRegistry *RoomRegistry // Redis-basierte Room-Registry
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -46,7 +47,14 @@ func main() {
|
||||
if err := server.InitLeaderboard(redisAddr); err != nil {
|
||||
log.Fatal("❌ Konnte nicht zu Redis verbinden: ", err)
|
||||
}
|
||||
log.Printf("✅ Verbunden mit Redis: %s", redisAddr)
|
||||
log.Printf("✅ Verbunden mit Redis (Leaderboard): %s", redisAddr)
|
||||
|
||||
// 1c. Room-Registry initialisieren
|
||||
var err error
|
||||
roomRegistry, err = NewRoomRegistry(redisAddr, serverID)
|
||||
if err != nil {
|
||||
log.Fatal("❌ Konnte Room-Registry nicht initialisieren: ", err)
|
||||
}
|
||||
|
||||
// 2. NATS VERBINDUNG mit Reconnect-Logik
|
||||
natsURL := getEnv("NATS_URL", "nats://localhost:4222")
|
||||
@@ -125,10 +133,25 @@ func main() {
|
||||
|
||||
log.Printf("📥 JOIN empfangen: Name=%s, RoomID=%s (Pod: %s)", req.Name, roomID, serverID)
|
||||
|
||||
// Prüfe Room-Registry: Welcher Pod soll diesen Raum hosten?
|
||||
claimed, assignedPod, err := roomRegistry.ClaimRoom(roomID)
|
||||
if err != nil {
|
||||
log.Printf("❌ Room-Registry Fehler: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Wenn Raum einem anderen Pod zugewiesen ist, ignoriere den JOIN
|
||||
if !claimed && assignedPod != serverID {
|
||||
log.Printf("⏩ Raum '%s' gehört zu Pod %s, ignoriere JOIN auf Pod %s", roomID, assignedPod, serverID)
|
||||
// Republish JOIN an den richtigen Pod (spezifischer Channel)
|
||||
ec.Publish("game.join."+assignedPod, req)
|
||||
return
|
||||
}
|
||||
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// Raum finden oder erstellen
|
||||
// Raum finden oder erstellen (nur wenn wir der Owner sind)
|
||||
room, exists := rooms[roomID]
|
||||
if !exists {
|
||||
log.Printf("🆕 Erstelle neuen Raum: '%s' auf Pod %s", roomID, serverID)
|
||||
@@ -158,7 +181,45 @@ func main() {
|
||||
if err != nil {
|
||||
log.Fatal("❌ Fehler beim Subscribe auf game.join:", err)
|
||||
}
|
||||
log.Printf("👂 Lausche auf 'game.join' in Queue Group 'game-servers'... (Sub Valid: %v)", sub.IsValid())
|
||||
log.Printf("👂 Lausche auf 'game.join' in Queue Group 'room-handlers'... (Sub Valid: %v)", sub.IsValid())
|
||||
|
||||
// 3b. HANDLER: Pod-spezifische JOINs (für Weiterleitung)
|
||||
podJoinChannel := "game.join." + serverID
|
||||
_, err = ec.Subscribe(podJoinChannel, func(req *game.JoinRequest) {
|
||||
playerID := req.Name
|
||||
if playerID == "" {
|
||||
playerID = "Unknown"
|
||||
}
|
||||
|
||||
roomID := req.RoomID
|
||||
if roomID == "" {
|
||||
roomID = "lobby"
|
||||
}
|
||||
|
||||
log.Printf("📥 Pod-spezifischer JOIN empfangen: Name=%s, RoomID=%s (Pod: %s)", req.Name, roomID, serverID)
|
||||
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// Raum muss bereits existieren
|
||||
room, exists := rooms[roomID]
|
||||
if !exists {
|
||||
log.Printf("⚠️ Raum '%s' existiert nicht auf Pod %s", roomID, serverID)
|
||||
return
|
||||
}
|
||||
|
||||
// Spieler hinzufügen
|
||||
room.AddPlayer(playerID, req.Name)
|
||||
|
||||
// Session speichern
|
||||
playerSessions[playerID] = room
|
||||
log.Printf("✅ Spieler '%s' ist Raum '%s' beigetreten (weitergeleitet zu Pod: %s).", playerID, roomID, serverID)
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Fatal("❌ Fehler beim Subscribe auf "+podJoinChannel+":", err)
|
||||
}
|
||||
log.Printf("👂 Lausche auf pod-spezifische JOINs: %s", podJoinChannel)
|
||||
|
||||
// 4. HANDLER: GAME START (broadcast - alle Pods empfangen, nur der mit dem Raum reagiert)
|
||||
_, _ = ec.Subscribe("game.start", func(req *game.StartRequest) {
|
||||
|
||||
Reference in New Issue
Block a user