(1) Shut Down All Servers
I have personally used this without any issues for 3 different games, for a combined total of 200+ shutdowns across around 1.7bn play sessions. It seems very reliable and I haven’t had issues with players being able to join old servers.
As well as the gameplay interruption problem, the “Reconnect” button is not as effective here because it is not guaranteed that there will be new servers immediately ready for joining at the moment the old server shuts down.
(2) Migrate To Latest Update
I haven’t personally used this one more than a few times yet because (a) old habits, and (b) probably-irrational worries about it not working. However, this should, in theory, solve the reconnection speed issue that Shut Down All Servers has because new servers are opened in advance of shutdowns.
You mentioned concerns of player data corruption in relation to this option. This shouldn’t be an issue with Migrate To Latest Update because old servers are marked as unjoinable - players simply will not be able to join them once you trigger a migration (source).
Something you didn’t mention is that this option has a targeted 6-minute window for shutdowns. This implies that Shut Down All Servers probably tries to do it more quickly. Perhaps a faster, but slightly more arduous reconnection process (Shutdown All Servers), is preferable to receiving the update 6 minutes after other players (Migrate).
(3) Let Old Servers Die
I think a good general principle is that this option should be avoided unless:
- The update is very minor, for example a small patch, correcting a typo, etc.
- The game can robustly handle players joining older servers with ‘new’ content, e.g. a new pet that the old server doesn’t recognise.
It might be non-trivial to support arbitrary content being added to the game and being present in old servers that are not aware of it. Even if you do manage that, I’d generally advise against using this option for content / non-minor updates, because these kind of updates are something that players are keen on seeing as soon as they are available. Having to hop around until you find a new server with the update is a terrible experience.
(4) Soft Shutdown via TeleportService
I have never used this method - although I am aware that there is a popular piece of code that supposedly accomplishes it.
The use cases for this should be entirely covered by Migrate To Latest Update. As well as that, the method may be outdated and I haven’t seen any data on whether it works at scale. I would also be interested to hear from others here specifically about using this option at scale and how they handle TeleportService outages.
A note on -Service solutions
As a general principle, in relation to handling shutdowns etc I am cautious about using:
- DataStoreService (e.g. some kind of versioning for data / session lock),
- MessagingService (e.g. informing other servers of my server status/version),
- TeleportService (e.g. soft shutdown),
- MarketplaceService (e.g. check latest version string, compare to my own).
This is because these services do experience (sometimes severe) outages and I am not keen on adding large amounts of extra complexity in order to handle the various potential things that can go wrong. DataStoreService is pretty much a necessary evil, but I’d rather avoid extra calls where possible.
It’s also especially difficult to handle failures from these APIs because there isn’t a consistent and reliable way to differentiate failures. You have to use pcall and then attempt to parse the error message to get any meaningful information - but there are no guarantees about the content of the error messages.
The closest you can get to specific-case handling of errors with these services is with the TeleportInitFailed event which supplies a TeleportResult Enum, but not all teleport-related failures will fire this event (failures can occur after Init stage of teleports).