diff options
| author | Owen Jacobson <owen.jacobson@grimoire.ca> | 2014-03-14 13:43:08 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen.jacobson@grimoire.ca> | 2014-03-14 13:43:08 -0400 |
| commit | 21e30fe9e7add5012e1023009d81c19ab581c372 (patch) | |
| tree | 9076da4550b7b8dffdf076d5978bb6c8bd1d8bb1 /wiki/dev | |
| parent | b9e1c88d652f2b321cc76eaf5e327f884864cd31 (diff) | |
Stop that. Seriously.
Diffstat (limited to 'wiki/dev')
| -rw-r--r-- | wiki/dev/stop-building-synchronous-web-containers.md | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/wiki/dev/stop-building-synchronous-web-containers.md b/wiki/dev/stop-building-synchronous-web-containers.md new file mode 100644 index 0000000..bd0bd80 --- /dev/null +++ b/wiki/dev/stop-building-synchronous-web-containers.md @@ -0,0 +1,39 @@ +# Stop Building Synchronous Web Containers + +Seriously, stop it. It's surreally difficult to build a sane ansynchronous service on top of a synchronous API, but building a synchronous service on top of an asynchronous API is easy. + +* WSGI: container calls the application as a function, and uses the return + value for the response body. Asynchronous apps generally use a non-WSGI + base (see for example [Bottle](http://bottlepy.org/docs/dev/async.html)). + +* Rack: container calls the application as a method, and uses the return + value for the complete response. Asynchronous apps generally use a non-Rack + base (see [this Github ticket](https://github.com/rkh/async-rack/issues/5)). + +* Java Servlets: container calls the application as a method, passing a + callback-bearing object as a parameter. The container commits and closes + the response as soon as the application method returns. Asynchronous apps + can use a standard API that operates by _re-invoking_ the servlet method as + needed. + +* What does .Net do? + +vs + +* ExpressJS: container calls the application as a function, passing a + callback-bearing object as a parameter. The application is responsible for + indicating that the response is complete. + +## Synchronous web containers are bad API design + +* Make the easy parts easy (this works) + +* Make the hard parts possible (OH SHIT) + +## Writing synchronous adapters for async APIs is easy + + def adapter(request, response_callback): + synchronous_response = synchronous_entry_point(request) + return response_callback(synchronous_response) + +Going the other way is more or less impossible. |
