Hi Jay,

On 2/3/2015 8:10 AM, Jay McCarthy wrote:
On Mon, Feb 2, 2015 at 5:06 PM, George Neuner <gneun...@comcast.net> <mailto:gneun...@comcast.net> wrote:
there are 43 servlets and counting, plus several auxiliary threads and a large(ish) connection pool. Probably the number of servlets will double before I'm done.
That sounds like a lot of servlets. I think I would try to consolidate.

Are you thinking that there might be problems with having many servlets? The only issue I've seen was a one time situation where the application clearly was running background tasks but stopped responding to http requests.

No, I don't think there's a problem. It just seems mentally exhausting to my feeble mind :)

<gripe>
In general I don't like browser interfaces - particularly for database applications which often have complex 2-way communication patterns with the server. Although there are exceptions, in general browser apps are unwieldy and inefficient, and they require added middleware components to get anything done. Even if the middleware does nothing else but relay communication to/from the database, it still is needed to protect the database against (simple) hacking of the browser application code.

I'd always prefer to deliver a proper (compiled) desktop client for a database app, but platform independence is an issue. Java is a non-starter in many businesses, and Racket is mostly unknown :-( (I use it wherever I can), and thus I'm writing server middleware to support a (cooperatively developed) browser application.
</gripe>


     Does switching to the web language impact using serve/servlet
and dispatch-rules?
    You can still use those, although there is only a benefit when
    you are using continuations via send/suspend and
    send/suspend/dispatch.

    I'm sorry, but I'm not following.


The Web language only makes using the functions send/suspend and send/suspend/dispatch different. If you don't use those two functions, there is no reason to use the Web language.

Got it! I misunderstood you to mean that serve/servlet and dispatch were only useful if you use continuations ... which, naturally, didn't make any sense.


I think what I would do is write one server that is started with serve/servlet where the servlet function (NB: An annoying thing about the web-server is that in the old days a "servlet" was a file that provided a (-> request response) function but now I think of it as just the function because things like serve/servlet allow those to come from anywhere) that implemented a simple dispatching to the other logical servlets. Something like this:

(require
 (prefix-in servlet1: "servlet1.rkt")
 (prefix-in servlet2: "servlet2.rkt"))

(define (meta-servlet req)
  (match (request-uri req)
   [(list "servlet1" _ ...) (servlet1:start req)]
   [(list "servlet2" _ ...) (servlet2:start req)]))

(module+ main
 (serve/servlet meta-servlet))

This would mean that from the WS's perspective there is exactly one servlet, so you would never have multiple instances, namespaces, or anything like that.

Perhaps I'm missing something - maybe a terminology problem: perhaps what I'm calling "servlets" you are thinking of simply as "threads" in the server? Your example looks very similar to what I'm doing now with dispatch-rules per some program example you pointed me to several months ago.

   (define-values (main-dispatch main-url)
     (dispatch-rules
       :
       <lots of rules>
       :
     ))
    :
   (serve/servlet main-dispatch... )

I know that this permits overlapped handling of multiple requests and so multiple instances of any given dispatched function can be running concurrently (in separate threads). Which is what I want. I certainly don't want to do anything that would jeopardize concurrent request handling. If anything, I'll need to go to multiple cores at some point.

George

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

Reply via email to