Introducing Quilkin: open-source UDP proxies built for game server communication
Traditionally, dedicated game servers for real time multiplayer games have used bespoke UDP protocols for communication and synchronization of gameplay among the players within a game. This communication is most often bundled into monolithic game servers and clients, pairing the technical functionality of communication protocols, such as custom network physics synchronisation, security, access control, telemetry and metrics, with the extremely high computational requirements of physics simulations, AI computation and more.
Developed in collaboration with Embark Studios, Quilkin is a UDP proxy, tailor-made for high performance real-time multiplayer games. Its aim is twofold:
Pull common functionality, such as security, access control, telemetry and metrics out of monolithic dedicated game servers and clients.
Provide this common functionality in a composable and configurable way, such that it can be reused across a wide set of multiplayer games.
This reusable foundation then allows game developers to spend more of their time focusing on building the game-specific aspects of building their multiplayer communication protocols, rather than these common aspects.
Challenges with multiplayer Game Server communication
In fast-paced, multiplayer games, the full simulation of a session of gameplay generally occurs within the memory of a monolithic dedicated game server, whose responsibility covers everything from network physics and AI simulation to communications from client back to server and more.
Since the entire state of the game is memory resident, each client connects directly to the dedicated game server the player is playing on, which presents several challenges:
Each dedicated game server is a single point of failure. If it goes down, then the whole game session (or sometimes multiple sessions) fails. This makes it a target for malicious actors.
The IP and port of connection to the game server is public, and exposed to the game client, making it easy to discover and target.
Multiple aspects of game server simulation and network communication are tightly coupled in the same process, making reuse and modularity more difficult, and expanding risk of performance issues.
If we look at both web and mobile technologies over the past several years, some of these challenges start to look very familiar. Thankfully, one of the solutions to help drive dedicated server workloads to more redundant and distributed orchestration is the utilisation of traffic proxies!
By using a proxy for multiplayer UDP traffic, in front of our dedicated games servers within a low latency network such as what is available on Google Cloud, we can address these key challenges as follows:
Greater reliability. Proxies provide redundant points of communication entry. UDP packets can be sent to any number of proxies and routed to the dedicated game server. While a dedicated game server will still generally be a single point of failure, proxies improve redundancy and potential failover at the communication layer.
Greater security. The IP and port of the dedicated game server is no longer public. Game clients may only have visibility into a subset of the proxy pool, limiting a potential attack surface.
Greater scalability. We start to break apart the single process, as we can move aspects of the communication protocol, metrics, communication security and access control into the proxy. This removes the non-game specific computation out of your game server's processing loop.
As a result, the entire system is now more resilient as proxies can be scaled independently, not only for performance reasons but also to distribute load in case of malicious actors.
Introducing Quilkin: The UDP proxy for Game Servers
Embark Studios and Google Cloud came together and built Quilkin, to provide a standard, open source solution. Based out of Stockholm, Embark Studios is a (relatively) new studio made up of seasoned industry veterans. They were the perfect collaboration partner to create Quilkin with, given their team's experience with large scale real time multiplayer games.
Quilkin is an open-source, non-transparent UDP proxy specifically designed for use with large scale multiplayer dedicated game server deployments, to ensure security, access control, telemetry data, metrics and more.
Quilkin is designed to be used behind game clients as well as in front of dedicated game servers, and offers the following major benefits:
Obfuscation. Non-transparent proxying of UDP data, making the internal state of your game architecture less visible to bad actors.
Out of the box metrics. For UDP packet traffic and communication.
Visibility. A composable set of processing filters that can be applied for routing, access control, rate limiting, and more.
Flexibility. Ability to to be utilised as a standalone binary, with no client/server changes required or as a Rust library, depending on how deep an integration you wish for your system and/or custom processing Filters you wish to build.
Compatibility. Can be integrated with existing C/C++ code bases via Rust FFI, if required.
Onboarding. Multiple integration patterns, allowing you to choose the level of integration that makes sense for your architecture and existing platform.
Until now, these sorts of capabilities are only available to large game studios with resources to build their own proprietary technology.
We think leveling the playing field for everyone in the games industry is an important and worthy endeavor. That’s why we collaborated with Google Cloud and initiated this project together.
At Embark, we believe open source is the future of the games industry and that open, cross-company collaboration is the way forward, so that all studios, regardless of size, are able to achieve the same level of technical capabilities. —Luna Duclos, Tech Lead, Embark Studios
Google Cloud is excited to announce Quilkin as the latest entry in our portfolio of open-source solutions for gaming. Quilkin complements our existing OSS solutions including Agones for game servers, Open Match for matchmaking, and Open Saves for persistence. These are designed to work together as an open and integrated ecosystem for gaming. We’re proud to include Embark Studios as our latest open source collaborator for gaming along with Ubisoft, Unity, and 2K Games. Google Cloud will continue to work closely with our partners in industry and the community to offer planet-scale solutions to power the world’s largest games. —Rob Martin, Chief Architect, Google Cloud for Games
Getting started with Quilkin
While Quilkin can support more advanced deployment scenarios like above, the easiest way to get started with Quilkin is to deploy it as a sidecar to your existing dedicated game server. This may initially limit some of the benefits, but it’s an easy path to getting metrics and telemetry data about your UDP communication, with a very low barrier to entry and the ability to expand over time.
While Quilkin is released as both binaries and container images, and is not tied to any specific hosting platform, we’ll use Agones and Google Cloud Game Servers as our game server hosting platform for this example.
First we will create a ConfigMap to store the yaml for a static configuration for Quilkin that will accept connections on port 26001 and route then to the Xonotic (an open source, multiplayer FPS game) dedicated game server on port 26000:
quilkin.yaml: | # quilkin configuration
- address: 127.0.0.1:26000
Second, we’ll take the example container that Agones provides for the Xonotic dedicated game server, and run Quilkin alongside each dedicated game server as a sidecar, in an Agones Fleet of game servers like so:
- name: default
- name: xonotic
- name: quilkin # quilkin sidecar
- name: config
- name: config
Once applied, when we query the cluster for the running GameServers, everything looks the same as it would without Quilkin! Nothing else in our system needs to be aware that the traffic is being intercepted, and we can freely take advantage of the functionality of Quilkin without adjusting either client or server code.
$ kubectl get gameservers
NAME STATE ADDRESS PORT NODE AGE
xonotic-sidecar-gdpgn-2pfkc Ready 184.108.40.206 7929 gke-0f7d8adc 25m
xonotic-sidecar-gdpgn-c8bds Ready 220.127.116.11 7028 gke-0f7d8adc 25m
If this has piqued your interest, make sure to have a look at the walkthrough, where we step through this same scenario and then extend it to compress UDP packets from the game client to server, without having to change either programs.
What’s next for Quilkin
Quilkin is still in its early stages, with this 0.1.0 alpha release, but we’re very happy with the foundation that has been laid.
There are a variety of features in the roadmap, from enhanced metrics and telemetry, new filters and filter types, and more.
If you would like to try out this release, you can grab the binaries or container images from our releases page, step through our quickstarts and review different integration options with your dedicated game servers.
To get involved with the project, please:
Check out our Github repository
Join our Discord community
Join the quilkin-discuss mailing list
Follow us on Twitter
Embark Studios has also released their own announcement blog post, going deeper into the plans they have for their own production game backend infrastructure, and where Quilkin fits in.
Thanks to everyone who has been involved with this project across Google Cloud and Embark Studios, and we look forward to the future for Quilkin!