Network server design question

John Colvin john.loughran.colvin at gmail.com
Sun Aug 4 12:53:07 PDT 2013


On Sunday, 4 August 2013 at 19:37:40 UTC, Marek Janukowicz wrote:
> I'm writing a network server with some specific requirements:
> - 5-50 clients connected (almost) permanently (maybe a bit 
> more, but
> definitely not hundreds of them)
> - possibly thousands of requests per seconds
> - responses need to be returned within 5 seconds or the client 
> will
> disconnect and complain
>
> Currently I have a Master thread (which is basically the main 
> thread) which
> is handling connections/disconnections, socket operations, 
> sends parsed
> requests for processing to single Worker thread, sends 
> responses to clients.
> Interaction with Worker is done via message passing.
>
> The problem with my approach is that I read as much data as 
> possible from
> each ready client in order. As there are many requests this 
> read phase might
> take a few seconds making the clients disconnect. Now I see 2 
> possible
> solutions:
>
> 1. Stay with the design I have, but change the workflow 
> somewhat - instead
> of reading all the data from clients just read some requests 
> and then send
> responses that are ready and repeat; the downside is that it's 
> more
> complicated than current design, might be slower (more loop 
> iterations with
> less work done in each iteration) and might require quite a lot 
> of tweaking
> when it comes to how many requests/responses handle each time 
> etc.
>
> 2. Create separate thread per each client connection. I think 
> this could
> result in a nice, clean setup, but I see some problems:
> - I'm not sure how ~50 threads will do resource-wise (although 
> they will
> probably be mostly waiting on Socket.select)
> - I can't initialize threads created via std.concurrency.spawn 
> with a Socket
> object ("Aliases to mutable thread-local data not allowed.")
> - I already have problems with "interrupted system call" on 
> Socket.select
> due to GC kicking in; I'm restarting the call manually, but TBH 
> it sucks I
> have to do anything about that and would suck even more to do 
> that with 50
> or so threads
>
> If anyone has any idea how to handle the problems I mentioned 
> or has any
> idea for more suitable design I would be happy to hear it. It's 
> also
> possible I'm approaching the issue from completely wrong 
> direction, so you
> can correct me on that as well.

Take a look at how vibe.d approaches the problem: 
http://vibed.org/


More information about the Digitalmars-d mailing list