Nginx 0mq transport layer for communicating with upstream servers
github.com
github.com
Wasn't Mongrel2 created solely because NGINX didn't support ZeroMQ.
@ZedShaw, thoughts - comments?
ZeroMQ I/O threads are still being used with REQ/REP, so this doesn't change anything in that matter.
Also, exclusive use of REQ/REP pair isn't restriction, but current limitation of the module ;)
I'm also blogging about mongrel2 lately: http://daltonmatos.wordpress.com
In my opinion, this is great. I think Mongrel2 is an excellent proof-of-concept, and if it provided the impetus for a much more widely used project like nginx to go down a similar path (though it's just a module right now), then everyone wins.
That said, this certainly isn't in nginx mainline, and it's very feature poor as compared to Mongrel2. One could not simply swap in nginx with this module for an existing Mongrel2 installation.
That's because this is _transport_module_ and what Zed did with Mongrel2 is build a level 7 protocol on top of ZeroMQ messages.
Even if this would support PUSH/PULL + PUB/SUB sockets right now, you would still need an _upstream_module_ that understands Mongrel2's level 7 protocol.
- PUSH/PULL + PUB/SUB support for ngx_zeromq (transport module),
- ngx_mongrel2 (upstream module).
Should be ready sometime next week.
Say you want to map /chat to a handler. Mongrel2 opens a PUSH socket, and a SUB socket connecting to one or more chat handlers. The handlers open a PULL and PUB socket. Mongrel2 will spread requests to /chat across the available handlers, and receive all published responses. It's a pretty smart way to handle multiple handlers receiving requests at the same time. It's been a while since I looked at Mongrel2, so it's very possible I have some of the details wrong...
It has nothing in common with Mongrel2 other than the fact that both use ZeroMQ transport instead of TCP.
Also, the fact that ZMQ is message, not stream, oriented makes it non-ideal here. You get the whole response in one big chunk. Across an internal network, this may not be a huge deal, but it's not a desirable property.
It's conceivable that a variant that broke responses up into discrete messages might be better, but this would have more complication in implementation, and I wonder how much it'd have to offer over straight HTTP.
Also, I wonder if the true ideal protocol for this is SPDY without SSL. It just seems like a no-brainer.
SPDY does not exist without SSL, nor will it.
Also, SSL does not add anywhere near enough overhead to matter for this kind of application, especially when you just leave the connection established. SPDY would work quite well as a protocol for this purpose.
Can you elaborate on this, or provide a link with more context? Almost all TLS/NPN references are missing from the current SPDY draft spec. (I've found webpages that repeat the SSL requirement assertion, but none that source it or explain why.)
As far as I know, SPDY's protocol always builds on an SSL session, not a raw socket connection. Opportunistic SPDY connections to HTTP servers rely entirely on SSL "next protocol negotiation" (NPN); a SPDY server will indicate that it supports SPDY to an HTTPS client via NPN. SPDY also uses SSL to avoid interference from proxies that would otherwise break attempts to use SPDY on what started out looking like an HTTP connection.
Because this is just proof-of-concept hacked over 2 days (+ README file). It probably wouldn't be even released at this point, if I didn't promise it to @igrigorik.
I'll look into adding other socket types sooner or later.
ZMQ and ngx_zeromq support multipart messages, so this is only true if your backend sends it as one big chunk.
thanks!