Hidden limitations of Google App Engine
stackoverflow.com
stackoverflow.com
My prototyping platform is essentially: tornado.web with the tornado request, response, escape, auth and locale. OpenID from web.py. My own WSGIApplication that inherits from the built-in so that it uses my Controller class (which has a plugin arch), Django for templates, JSON, BeautifulSoup, Markdown, a generic 'asset' module implementing something akin to ActiveRecord on the standard DB with memcache support, a generic HTML5 getting started template, a CSS toolkit (can't recall the name) then jQuery and backbone.js with some of my own JS glue code that maps the server models to client models.
Using this stack, I can prototype form-driven web apps in hours.
I wrote a relevance view for Twitter (with Twitter oauth support) in half a day. I don't think I will use the RDBMS even when they release it - BigTable is excellent (it will be confusing if you schema the same way you schema with an RDBMS).
It is great to be able to have an idea for a quick app, register an AppEngine app, fire the code up, commit and deploy and have the app live for others to try out within hours.
The admin interface allows you to spot errors and choke points in production and fix them quickly. The pricing is better than AWS or any of the others and the platform includes hidden gems such as the MapReduce lib, multitenancy, xmpp and Google data libs (including auth)
The only real limitations that I have bumped into are:
* The max request time is around 20 seconds, so you can't have open Ajax requests
* No HTTPS support as yet (coming soon, apparently)
* Limits on the number and size of files. It isn't ideal for serving a large number of static files, but it does have zipimport support for libs
* For best performance, you need to define the indexes yourself rather than relying on the defaults that the lib generates
* There are a lot of sys calls blocked, so you can't run Tornado or any cpython modules
That said, I did create a generic sketch.template wrapper for Django templates, and I have managed to swap in web.py, tornado and cheetah (sketch being the name of the framework). I have never used Jinja in production, but have been meaning to go back to it, your comment will prompt me to do just that (I assume by asking about it, it is your pref).
I will eventually push the entire framework public once I clean up some parts - it is simple and has a narrow scope/purpose but it is working really well for me
It is just a collection of libs for GAE with my own glue code for the app, controller, a templating wrapper and some JS glue to get the models from the server into the client. You define the models and it auto generates scaffolding which you can re-arrange with the JS. Super-easy to create form based apps, I will push it to github next week and post it here on HN (I haven't had this much fun coding in a while, especially with being able to whip up mini-projects from idea to prototype really quickly - for eg. I did a simple todo list in a few hours, and a simple crm in a day (both auth with google), the actual code is just the models, over-riding the controllers where needed and placing form/record elements
The last two months have seen the platform mature a lot as well. The latest 1.4 release has some amazing features: async datastore queries, app keep-alive, longer timeouts for background tasks, etc.
If you insist on using SQL, then use a company like Heroku, but realize that if your app gets popular you will be paying Heroku a lot of money for the same level of performance you could get for a few bucks a month using app engine.
After I wrote my first toy app a few years ago, App Engine doesn't really feel like it has any significant limitations other than the absence of naked domains and SSL. The recent reliability problems have been a nightmare, but as of Nov 6, I feel like they have been resolved.
I should add that I love app engine and use it whenever I don't need naked domains or SSL. (SSL is only available via .appspot.com domains)
And yeah, app engine is great for entry-level prototipes, since you can forget about sysadmin tasks.
From http://code.google.com/appengine/articles/life_of_write.html
There is an expected failure rate on writes as Bigtable tablets are sometimes unavailable, for example, when they are being moved or split. The presence of more indexes increases the probability of hitting an unavailable tablet as an exception will be raised if a write fails for any of the indexes. In those situations, your application will need to decide how to handle the exception. One option is to add a task to the task queue to retry the write at a later point in time. Another idea would be to respond with an error from the app and have the client retry. This tends to work with things like AJAX requests where there is client side logic which can handle an error message from the server.
http://googleappengine.blogspot.com/2010/02/app-engine-sdk-1...
See the section "Reduced error rate with Automatic Datastore Retries".
I haven't kept a close watch on what's changed since then though.
Edit: Here's the link that shows the improvement: http://code.google.com/status/appengine/detail/datastore/201...
http://code.google.com/p/googleappengine/issues/detail?id=17...
http://code.google.com/p/googleappengine/issues/detail?id=14...
you need to trap DeadlineExceededError for long-running queries, CapabilityDisabledError (from google.appengine.runtime.apiproxy_errors) for when the datastore is in maintenance mode and other misc errors. If it is a deadline error, you can re-submit it (but prob advisable to only re-sub once), on CapabilityDisabledError, return a server error page or load from memcache
Not that there's anything wrong with these particular languages, but I'd prefer more choice. It would be cool if they supported C++, PHP, Javascript (V8), Ruby, Erlang.