11/20/2012 8:26 AM, Andrei Alexandrescu пишет:
On 11/19/12 3:38 PM, Tyler Jameson Little wrote:
I'd like to see an HTTP module in Phobos, but I wanted to gauge interest
first and see if this has been discussed before.
I can say the following. We sorely need a server expert on board with
the time and inclination to write a good server-side networking
framework. We have a couple, but for various reasons I have been unable
to convince them (through newsgroup and private exchanges) to invest
time in such an endeavor. That's mostly because lack of time - speaking
for myself, I wish I found the time to learn about all that, which as
far as I understand gravitates around notions such as asynchronous I/O,
libevent/libevt, select(), and the such. I've never used them so I'd
need to start from scratch.
Having done quite some work on this before - both with frameworks and
barehanded. The recipe for scalable and fast server itself is not that hard:
asynchronous I/O
+ event-based notification
+ separate thread pool for user-defined handlers
Asynchronous I/O is well understood to have far less overhead then
thread per client/descriptor model. Both in terms of memory usage and
time spent on the context switching.
Event based notification can be traded for select() polling but then
you'd waste a lot of cycles (in kernel mode) walking through huge
descriptor sets when number of simultaneous clients is high enough.
A separate "worker" thread pool insures your event-loop is not ever
blocked thus insuring responsiveness w.r.t dispatching I/O requests.
Arguably this could be an opt-in.
If this combo is implemented even half-decently it should give us great
speed. The fine-tuning and topping the performance however is the other
70% of work and that makes the real difference. The devil is in the
details. Not to mention fiddling with socket options and imposing limits
on transfer rate/timeouts etc.
I currently had to work with Java (a painful journey after D) to create
a couple of server components and surprisingly found the Netty project
to be quite nice.
Though being overly Java-escue it has some great ideas (aside from the
above basic concepts):
- The composable pipeline abstraction that allows passing user data
through a series of transformations seamlessly. Think the stack of
TCP|HTTP|encryption/compression or TCP|framing|ProtocolBuffers etc.
- Flexible and zero-copy (quite hard for Java I guess) buffer
abstraction. It reminds the power of ranges but in a heck of a more
limited scale - it's more about chaining and slicing. These limitations
are mostly because of the way the OS works.
We really need an expert. Look at the Go programming language - it's not
remarkable, but it benefits of full-time dedication of experts in
server-side programming, so it has acquired excellent library support
for networking servers.
Can help with a proper asynchronous (network) I/O support on Windows. I
doubt I'll find time to flesh out the whole design though.
What it irks me that I haven't seen a good enough backend for Windows in
the open source (of those I've peeked at the source of). A lot of
event-based backends seem to just ignore this OS or fallback to
select-loop.
Meanwhile M$ introduced the new RIO socket API targeted at high-load
servers. Was planing to try it out since the day it was introduced.
And they milk that for all it's worth: any
discussion, article, or blog post about Go gravitates toward the
five-lines HTTP server with the same implacable reach as conversations
with ideologists, which inevitably converge towards their ideological
stronghold.
I see no reason we can't beat them in their favorite game.
--
Dmitry Olshansky