Will there be a way to make old servers stale?
As in existing players in old servers do not get kicked,
but there is no way for more players to join said servers?
It would help reduce frustration with players doing an activity - say currently in a match or a boss fight - getting interrupted, but the issue I see is integration with other features like the Follow/Join system, as in how it would work if you tried to join a friend in a “stale” server.
If not this, then perhaps a “schedule” system for the new Restart servers feature that actively displays a countdown until the servers get migrated, of which we can customise and schedule for a time we see fit?
Upload that module as a model. Use a script in all 20 places that inserts this model on run time. This way the only thing you need to update is the model which effectively also automatically updates all your 20 places.
The worst case scenario here is having to update the injector script whenever necessary, but usually this will never be required once it has been property set up.
Good news that someone is looking actively at these problems.
In our game we use a custom soft shutdown system. We don’t want to kick players while they are playing, but we want to do it immediately after. Right now we open private servers and send players there when they finish a game. The problem is that the old servers stay up until all of the players have finished their game (max 5-10 mins). New players can still join these, but are insta teleported which results in worse UX.
What we need is a method to stop considering old versions for matchmaking but without the shutdown feature. This would allow us to send players to new public servers instead of private ones. It would also stop the old servers from being populated while we are soft-shutting them down.
You are mostly correct. We don’t want “shutdown all servers” to disappear since it’s incredibly helpful and it would be difficult to release an update if we had to shut down each server individually.
In addition, I believe that when a game is made private, all players get kicked from the game.
Could we have an updating method where it doesn’t kick anyone, but instead locks outdated servers?
With this, joining players would only join new and updated servers, where as the old server can continue until every player has eventually left. This works especially great in experiences that use multiple places.
Alternatively, could we get API that allows us to lock a server with a script and prevent joining? I would actually like this API regardless of the previous question.
This can technically be implemented with MessagingService APIs. You would need to have every server listen to an update message. When you update the game, just send the update message to all servers. When a server relieves the message, you can then just connect an event to auto-kick any new players attempting to join.
Yes, but that’s not ideal. Also, you’d want to use MemoryStoreService as MessagingService is extremely limited (due to having experience wide limits, which appears to be the only service that has such a limitation). The issue with that though is that players can still attempt to connect to a server that’s meant to be closing or locked, and this is especially true if it’s a player trying to join their friend or a specific server.
I’m fully aware that it’s possible to create a custom system, and an even better one using ReservedServers, however I am looking for an official built-in system. This is something I know Roblox would consider as they’re already implementing an official built-in banning system, despite there already being custom ways of doing that.
I think this implementation of prewarming is awesome; Players being able to rejoin the same server with the same people is really cool. Although I do think it would be good to warn players with a coregui that their server is about to be closed.
Thank goodness! I never saw a reason to have both “shut down all servers” and the ability to private your game at the same time. Looks like I don’t have to use a system like SoftShutdown anymore and use the migrate to new update button instead.
@heedicalking Your ideal method sounds like exactly what Migrate (renamed to Restart Servers for Updates) does. Can you read the newly updated docs and let me know what’s different from your ideal method?
@Mimi_Dev You have up to 30 seconds for your BindToClose callbacks to complete before we shut down the server - are there cases where that’s not enough time to save some datastore values before teleporting players or letting them auto-reconnect? For the teleport data - you’d have to do your own teleport to pass it along rather than relying on auto-reconnect. Doing a regular matchmade teleport will be enough to keep players together post-update - we’re keeping them together behind the scenes
@BillB1ox the documentation has already been updated! Take a look and let us know if the difference is still not clear
@KadenBloxYT Privating a game kicks all players. However, can you clarify why you want to do that? It will severely harm your player count on your game compared to just kicking players that are on the old version
@Waccars You don’t need to shutdown servers individually. That’s what Migrate to Latest Update / Restart Servers for Update is for
@heedicalking@KepIar@Redridge@MightyDantheman
Thanks for all the feedback! Looks like the ability to stop allowing joins to an existing server is the most requested improvement. We chatted within the team and added this to our roadmap for 2024!
“Restart servers for updates” doesn’t seem to account for the fact that each server in my game is running a match that may last anywhere from 10-30 minutes. If players are currently fighting, I don’t want to eject them all mid-round. They don’t get end-of-round bonuses or the satisfaction of winning. I don’t want to mass end every server at once, I only want to end/update them once they’re ready. Nothing is more frustrating for a player than getting kicked in the middle of having fun.
How my current system works is that the server ‘shut downs’ only after the match ends. (it doesnt actually shut down just kicks everyone and autokicks new joiners because there is no actual shutdown API). They are then teleported to a ‘waiting zone’ place and then teleported back at the mercy of teleportservice.
Both issues would be easily resolved with being able to shutdown/disable joins (through an API) and reserve a new public server
We aren’t worried about BindToClose not being complete when the server shuts down. The main issue is that when the new server starts up, if we fetch the player’s datastore and it isn’t done being saved (large datastores can take several minutes), we’ll fetch out of date information and then overwrite the datastore with it. We had this issue when teleporting players between servers in our game. We actually had to prevent them from leaving the server until their data was done being saved.
I would love to see an additional option where we can prevent the joining of old servers and have players join the new servers when they press the play button WITHOUT shutting down the servers. This could be useful for bug fixes and small improvements.
It seems like there may be a potential bug with the migration feature? I just launched an update in my multi-place game and used the “Restart servers for updates” button to migrate the whole experience. Upon starting up again, some servers were on the latest version but appeared to be stuck in a “shutting down” state. These servers’ ages all aligned with the time I pressed “Restart servers for updates”.
My best guess is that game:BindToClose() functions may have been run on the brand new servers, but these new servers stayed alive. I have a BindToClose function which marks the server as shutting down and prevents any more new rounds from starting. There were absolutely no errors, so that’s the only explanation I can think of.
When I instead did “Shut Down All Servers” shortly after that, all the servers were back in working order, and the game’s metrics recovered.
Concurrent players for one of the game’s sub-places - after the update launched and I restarted servers for updates, concurrents went way down for an extended time because rounds weren’t starting on these servers, and I was trying to figure out the root cause. After I fully shut down all servers again ~30 minutes later, you can see the player count immediately recover.
Normally there is an intermission timer for the next round, but the server has just ceased to run any more rounds, leading me to believe it’s in the “shutting down” state.
Sorry I don’t have a smaller-scale repro, since this happened just now and I was of course rushing to just get the servers working again.