If we host our own unity3d unet servers how are rooms implemented, are there any pre-built solutions or do we just need many headless instances? If so do they just run on different ports or is there any other way to implement load balancing.
There is no official solution for this; a server library for UNET in the works, but a release date and the exact set of features it will provide are still unknown. In the meantime, you can write your own custom matchmaking system via the low-level API; this is what I do in Master Server Kit. The idea is to have a master server in charge (which you can think of as a lobby); once players are connected to it, they can create new games or join existing ones. The master server is responsible for dynamically spawning and destroying game server instances (which you can think of as rooms) as appropriate. Functionally, this is pretty similar to the matchmaking provided by Unity Services but running on a dedicated server setup instead. Additionally, player authentication and data storage facilities are also provided.
With this approach, all the servers (master server, game server instances) are actually independent Unity instances which you can run as headless. And you are right, each of them is using a different port, so you can have several running on a single server (i.e., as many as the server can handle).
Thank you for the reply and I will look at Master Server Kit as a possible server solution.