From my experience, the hard part (or badly written part) for the handover is: - not having to share the account database with the game database - not having the account server knows all game servers (and needing to be refreshed when one game server changes) - not leaking the database IDs (or having a too deterministic login) - not having a weak token that can be spoofed - having the proper flow for full/busy states per game servers ----- On my current in-progress source, I'm using a pub-sub pattern (with MQTT) to do the Auth <-> Game Server communications. The Auth Server is a MQTT hub, and Game Servers connect to it so it lazily discover them (no need to have configs about Game Servers). Then, the Game Servers create a topic that the Auth Server is subscribed to with a wildcard (using a local MQTT client), and it periodically broadcasts its status (name, IP endpoint, number of players online, max number of players, degraded state). This gives info about whether it is full, and what to return to the players that try to connect. Tokens are randomly generated, and sent to the right Game Server by publishing on a per-Game Server topic. The token is accompanied with the account ID and the expiration, so that info does not leak to the clients. And then, it is only a matter of having a memory cache to track all recently received tokens. It must be noted that there can be race conditions, and the player may connect to the Game Server too early. So I have a MsgConnectDelayed (custom message) that I enqueue if that happens with the original MsgConnect data, plus a timeout. And will try to re-process it until it expires (at which point, I assume that I'll never receive the token from the Auth Server). Nice, that's a good way to do it! Guess using a messaging queue you can make it easy to apply back pressure. The occasional broadcasting of the stats is a nice idea. Can then reject connections on the auth server if the game server is busy, without needing to fetch that info on every client connection. I'm working on the same part of my server at the moment lol. I'm using Netflix Eureka as a service discovery layer. Then my auth and game server both register with it allowing them to know about each other. I'm just doing the auth-game "handover" using a rest call for now to keep it simple for now. I just have some throttling enabled + retry logic in place. So far I'm really enjoying using Spring Boot + Kotlin for the server. I'm designing it to be work reactively using stuff like channels, coroutines, etc... Once I finish up this handover part, I'm going to figure out how to design the game server. Very excited for that part :)