Appendix: Spyglass
If you want to know even more about Unix processes then your next stop should be the included Spyglass project. Why? Because it was written specifically to showcase Unix programming concepts.
If you have a copy of this book but didn't get the included code project, send me an email and I'll hook you up: jesse@jstorimer.com.
The case studies you read are meant to showcase the same thing, but at times they can be dense and hard to read when you’re new to Unix programming. Spyglass is meant to bridge that gap.
Spyglass' Architecture
Spyglass is a web server. It opens a socket to the outside world and handles web requests. Spyglass parses HTTP, is Rack-compliant, and is awesome.
Here’s a brief summary of how to start a Spyglass server and what happens when it receives an HTTP request.
Booting Spyglass
$ spyglass
$ spyglass -p other_port
$ spyglass -h # for help
Before a Request Arrives
After it boots, control is passed to Spyglass::Lookout
. This class DOES NOT preload the Rack application and knows nothing about HTTP, it just waits for a connection. At this point in time Spyglass
is extremely lightweight, it’s nothing more than just an open socket.
Connection is Made
When Spyglass::Lookout
is notified that a connection has been made it forks a Spyglass::Master
to actually handle the connection. Spyglass::Lookout
uses Process.wait
after forking the master process, so it remains idle until the master exits.
Spyglass::Master
is responsible for preloading the Rack application and forking/babysitting worker processes. The master process itself doesn’t know anything about HTTP parsing or request handling.
The real work is done in Spyglass::Worker
. It accepts connections using the method outlined in the chapter on preforking, leaning on the kernel for load balancing. Once it has a connection it parses the HTTP request, calls the Rack app, and writes the response to the client.
Things Get Quiet
So long as there is a steady flow of incoming traffic Spyglass continues to act as a preforking server. If its internal timeout is able to expire without receiving any more incoming requests then the master process, and all its worker processes, exit. Control is returned to Spyglass::Lookout
and the workflow begins again.
Getting Started
Spyglass is not a production-ready server, so don’t rush to start using it for your projects! It’s a codebase that’s meant to be read. It’s heavily commented and formatted documentation is generated with rocco.
The best thing to do at this point is enter the code
directory that comes with this book in your terminal, find the Spyglass codebase, and run rake read
. This will open up the formatted documentation in your browser for your reading pleasure.
Now go forth and read the code! And may the fork(2) be with you!