As I write this comment I just know that in 5 years I will look at it and chuckle at myself but... it boggles my mind to consider a pure-RAM system that relies on at least one copy of the dataset being available forever in some system's "memory grid".
I thought of this idea the other day and got stuck on how to best push messages to hanging clients in a generic way instead of the simple requestNumber request-response correlation here. I ended up just making it app specific and either generating a unique client ID per hanging connection (a UUID) or using the username of the logged-in human using the hanging client.
Anyway, this is a nice architecture indeed.
However, as a pure proxy, I would think nginx would be more appropriate for its (albeit poor but swappable) load balancing, rate limiting (a 3rd-party module), caching (memcache, redis), and general volume of usage.
In fact, there's the beginnings of a nginx upstream based redis module that supports redis' GET that could be made to RPUSH and BLPOP the result.
FWIW, I'm the author of redis-node-client. It should be noted that Promises were removed in favor of continuations in the latest Node.js on Github and I've updated redis-node-client appropriately. Thus, the sample code in the article is outdated by 2 days or so.
Using LPOP in a polling loop to wait for the response is not that great of an idea. It would be better to use BLPOP or "blocking left pop" which blocks the client connection (think "long polling") until there's something in the given list to pop. It does not waste resources and the results are returned in much less than the worst case (e.g. 100ms here). I haven't added BLPOP to redis-node-client yet though but it should be simple to patch.
To scale this beyond a single frontend, popFromQueue could potentially put the response back via LPUSH when the queuedRes[requestNumber] is nil... "Oops, this wasn't for me, let me put that back." Or, it could/should use something more formal.
Why does the Ruby worker shell out to redis-cli instead of using Ezra's client library?
Finally, "The previous spike..." What does "spike" mean here?
FWIW I am an INFP and I could have written the same comment as the OP. Last I looked I have over 50 unfinished projects in my personal repository. I tend to be ever watchful of new technologies that might help me finish any one of the projects but all I end up with is a pile of bookmarks and 600+ notes in EverNote. sigh
I have been working on my latest project for over a year, part-time. I tend to fall into the research trap as mentioned by some other posters. That is, once I learn how some giant puzzle of a project would come together I lose interest in the project. I suppose I like figuring out things instead of doing things. I am tired of this.
Have you tried stressing the server with thousands of clients? I'm curious how Node.js holds up and how much RAM it uses per connection without (or with?) major TCP/IP tuning of buffer sizes, Nagle, etc.
I ask because you have no scale-out capability given that all the users are stored in a simple JS object (great for a demo of course). Any plans on this front?