[In this reprinted #altdevblogaday in-depth piece, freelance senior programmer Noel Austin, shares his results after testing the performance of Channel API with Google App Engine.]
I'm sure you've heard of Google App Engine – it's a web hosting service that allows you to write server software in Java, Python or Go. Overall I think it's a great piece of technology that helped me understand the concept of writing scalable services.
It was also a useful reason to finally learn Python. Anyway I'm currently interested in the suitability of it for real-time applications like games.
The traditional web model is request/response based. The client requests a resource from the server, the server responds with some data. That's the end of the transaction. In this model, there is no way for the server to update the client without first receiving a request from that client. If you want to build a multiplayer game, then this is likely to be very important.
It can be simulated either by regular polling from the client (does not scale well), by some fairly hacky techniques falling under the umbrella of Comet, or by the new WebSockets technology available recently. Google App Engine does not support WebSockets, but it does support Comet under the guise of the Channel API.
Test App Here!
I was interested in the performance of the Channel API, so I wrote a small test app. I'm a bit of a noob when it comes to Python and HTML/Javascript, but if you want to take a look I uploaded my code here.
Overall I was disappointed with the results, and it indicates to me that if you want any kind of fast response game, then you may have to look elsewhere.
- Very unpredictable latency (200-1000ms)
- Big packet overhead of HTTP headers etc
- No peer to peer support at all (limitation of current web technologies)
- No support for broadcast messages (server must send to each client in separate call)
- Sending several messages at once often results in a massive increase in latency
- Reliable – in all my tests, all messages eventually arrived
- Out of order – messages are not guaranteed to be in sequence, so if this is important you need to handle your own sequence checks
- Multiple instances – don't forget the service may spin up multiple instances to handle the requests
- Development server is much worse than the live server (on Windows at least) – it seems to serialize all messages sent with approximately 600ms between each one