One issue I can see is when an actor crosses a zone boundary, and you need to transfer it from one simulation node to another, since there usually is a lot of time-dependent state associated with an actor, for example cooldowns on spells in an RPG. The way I see it going down is this:
- Currently owning node packs the whole actor state into a binary format
- It gets sent to the node that is to take ownership of the actor
- The new node unpacks the state and continues the simulation
One way I envisioned to solve the time/step issue is to have a "master" server which pulses all simulation nodes for each simulation step, and with the pulse sends the current "game time" (which this server also controls). Then when one actor gets packed together to get transferred to another simulation node you could pack the latest step/game time that actor ran a simulation step, then when it gets unpacked on the other side and the next simulation step happens you can calculate an actor-specific delta time (since both nodes get their "game time" from the master/time/step server) for the first step, and the actor can compensate for the potentially "lost time".
Another solution would be to put all the "time related" stuff like say buff timers or cooldowns on a specific server, and some how calculate everything there and pull the time dependent state from the server down to the actor, no matter on what node it is currently running.
Someone with more insight into how to solve this probably has a way better solution, but this is how I would envision it to work. Or maybe an actor never should switch simulation node/server? But I don't see that working seeing as a world might be very big and for one node to be able to hold data for any point of the world (pathfinding, spawn points, etc.) and synchronizing a zone would be a nightmare if all the actors are spread over too many simulation nodes.