Horizontal Scalability ?

Added by Nicotz over 4 years ago

Hi there !

Is it possible with Ryzom server part to connect multiple servers, so that they work as a single logical unit ? I think its about clustering and load balancing but I'm not sure...


Replies (1)

RE: Horizontal Scalability ? - Added by sfb over 4 years ago

Nicotz,

The answer is yes and no. Underlying Ryzom Core's shard services is a set of core NeLNS services that facilitate essentially what you're talking about. NeL provides a high-level system it refers to as "unified networking" in which NeL services can refer to each other by name and/or service ID (SID) regardless of physical or logical location so long as the services all have TCP access to the Naming Service.

In Ryzom Core we use this high-level unified network to allow the myriad of services to be distributed across as few as one physical server or as distributed as one service per physical server. The reality of matters is that the GPMS, EGS, and AIS do the vast majority of the work. In a production environment you may only need 1-4 physical servers based upon your user load. If your user base is small enough you could probably get away with as little as one.

Some services can have multiple instances executed and some cannot. For example you can run multiple frontend services (the services which clients connect directly to) and you can run multiple AI services so long as each AIS hosts a different continents AI. Other services such as EGS can only have one instance per shard running at a given time.

Underlying all of this there's a service in NeLNS (which stands for NeL Network Services) called Naming Service or NS. NS acts as a high-level router for NeL-based services (any NeL process that executes using the IService class as its basis.) Any application that launches using IService by default attempts to register itself with an NS. Other services registered with this NS can then refer to this service or any other service by name. It makes passing information between services as simple as this:

1std::string msgChannel = "universe";
2std::string msgChat = "hey nicotz, whats up?";
3NLNET::CMessage msgout("CHAT");
4msgout.serial(msgChannel);
5msgout.serial(msgChat);
6NLNET::CUnifiedNetwork::getInstance()->send("ChatService", msgout);

There are even more clever mechanisms for transmission of data between services build directly into NLNET such as CTransportClass which is a means of sending a shared class across the wire in which both implementations do not necessarily share the same underlying class definition, i.e. the actual header definition of the class is not in a common library or shared at compile time.

There is a tremendous wealth of technology available to facilitate this within NeL - which is the underlying low-level library behind the Ryzom Core tools, services and client.

Thanks!
sfb
/s

(1-1/1)