Thanks, I think we're on the same page. 

I was considering something outside of the Racket web server handling the 
affinity. For example, the nginx web server / load balancer being responsible 
to send subsequent requests from a client to the same server process that 
handled the initial request.

On Jul 17, 2014, at 10:38 AM, Jay McCarthy wrote:

> Hi Brian,
> 
> Stateful continuations have to be invoked from the process that
> capture them. That's like session affinity. The reason I said it
> doesn't make a lot of sense is that continuations don't really have a
> "parent" and aren't really in a "session". There's not necessarily a
> connection between one continuation and another.
> 
> Jay
> 
> On Thu, Jul 17, 2014 at 10:33 AM, Brian Adkins <racketus...@lojic.com> wrote:
>> Jay:
>> 
>> Can you clarify your statement, "Session affinity doesn't really make a lot 
>> of sense in the continuation context, fwiw." ?
>> 
>> I haven't really dug into the web server yet, so I may simply be 
>> misunderstanding how it works, but at least in the case of stateful 
>> continuations, I thought it was important for all of a user's subsequent 
>> requests to go to the same process that served the first request since there 
>> would be state stored in the memory of the web server process.
>> 
>> Is that not the case? Or are all continuations serialized to disk so that 
>> any Racket web server process (assuming there are multiple instances 
>> running) could serve a subsequent request for any continuation?
>> 
>> To be clear, the scenario I'm envisioning is that of an nginx web server 
>> handling all incoming http requests, serving static files itself and 
>> proxying all other requests to a set of Racket web server instances using 
>> some sort of load balancing such as round robin. I assumed that if I begin 
>> my session with process-1 and then the next request was served by process-2, 
>> it would fail.
>> 
>> Thanks,
>> Brian
>> 
>> On Jul 16, 2014, at 10:17 PM, Jay McCarthy wrote:
>> 
>>> It wouldn't have a big impact on the server. The big question is how
>>> to effectively use multi-core in Racket programs generally.
>>> 
>>> Futures are really only good for numerical codes that stay in the JIT,
>>> which doesn't sound like most Web programs. That said, it is trivial
>>> to implement:
>>> 
>>> #lang racket/base
>>> (require racket/future
>>>        web-server/servlet-env
>>>        web-server/http)
>>> 
>>> (define (fib n)
>>> (if (< n 2)
>>>   1
>>>   (+ (fib (- n 1))
>>>      (fib (- n 2)))))
>>> 
>>> (define (start req)
>>> (touch
>>>  (future
>>>   (λ ()
>>>     (response/xexpr
>>>      `(html
>>>        (body
>>>         (p "It's "
>>>            ,(number->string
>>>              (fib (random 20)))))))))))
>>> 
>>> (serve/servlet start)
>>> 
>>> Boom! That's a servlet that uses multi-core to handle every request...
>>> of course, it probably doesn't pay in this or most other programs.
>>> 
>>> Places are for more coarse-grained things and you can pass file
>>> descriptors, so it's feasible to have a TCP accepter that feeds work
>>> to a group of places servicing the requests. However, places must not
>>> use mutation to communicate higher-order values (they can communicate
>>> flat values like numbers with mutation), so they couldn't share
>>> continuations. It would be trivial to use serializable continuations
>>> or to implement a continuation manager that stored all the
>>> continuations in a single place. Session affinity doesn't really make
>>> a lot of sense in the continuation context, fwiw.
>>> 
>>> My guess is that you could spend less than 100 lines to implement the
>>> continuation manager and the place-based worker setup. (This is based
>>> on the normal server setup just being 127 lines and the manager
>>> interface being implemented in as little as 40 lines.) This might be
>>> worth it.
>>> 
>>> Jay
>>> 
>>> 
>>> On Wed, Jul 16, 2014 at 4:09 PM, Brian Adkins <racketus...@lojic.com> wrote:
>>>> I haven't looked into the Racket web server much yet, so I'd like to 
>>>> understand the implications of this.
>>>> 
>>>> My experience is with stateless http app servers (primarily with Unicorn 
>>>> Ruby servers at the moment), so firing up a number of worker processes and 
>>>> having something like nginx proxy to them works well to fully utilize all 
>>>> cores.
>>>> 
>>>> I think I read that the Racket web server makes use of continuations, so I 
>>>> expect some sort of process affinity would be necessary, where a given 
>>>> user's requests are always proxied to the same worker process - is that 
>>>> right? Is it common to use multiple web server processes in Racket web 
>>>> apps?
>>>> 
>>>> In your estimation, what is the feasibility of adding multi-core support 
>>>> to the Racket web server? For example, is it reasonably feasible and on 
>>>> the current roadmap, or would it require massive changes to the web server?
>>>> 
>>>> Thanks,
>>>> Brian
>>>> 
>>>> On Jul 16, 2014, at 8:42 AM, Jay McCarthy wrote:
>>>> 
>>>>> It does not use multiple cores if they are available.
>>>>> 
>>>>> Jay
>>>>> 
>>>>> On Wed, Jul 16, 2014 at 7:02 AM, Sean Kemplay <sean.kemp...@gmail.com> 
>>>>> wrote:
>>>>>> Hello,
>>>>>> 
>>>>>> I am interested in the racket web server for some micro services. Just
>>>>>> wondering if by default it runs across multiple cores or if it is 
>>>>>> restricted
>>>>>> to one due to threads in racket.
>>>>>> 
>>>>>> Regards,
>>>>>> Sean
>>>>>> 
>>>>>> 
>>>>>> ____________________
>>>>>> Racket Users list:
>>>>>> http://lists.racket-lang.org/users
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> Jay McCarthy
>>>>> http://jeapostrophe.github.io
>>>>> 
>>>>>         "Wherefore, be not weary in well-doing,
>>>>>    for ye are laying the foundation of a great work.
>>>>> And out of small things proceedeth that which is great."
>>>>>                        - D&C 64:33
>>>>> ____________________
>>>>> Racket Users list:
>>>>> http://lists.racket-lang.org/users
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> Jay McCarthy
>>> http://jeapostrophe.github.io
>>> 
>>>          "Wherefore, be not weary in well-doing,
>>>     for ye are laying the foundation of a great work.
>>> And out of small things proceedeth that which is great."
>>>                         - D&C 64:33
>> 
> 
> 
> 
> -- 
> Jay McCarthy
> http://jeapostrophe.github.io
> 
>           "Wherefore, be not weary in well-doing,
>      for ye are laying the foundation of a great work.
> And out of small things proceedeth that which is great."
>                          - D&C 64:33


____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to