StianSøiland
stian at soiland.no
Tue Oct 28 00:44:38 EST 2003
On 2003-10-27 22:58:34, Gregory (Grisha) Trubetskoy wrote: > > Upon creation of a new "session" I want to open a socket to a remote > > server and be able to access this socket throughout the users session > > until he logs our or the session is timed out. > Given the multi-process nature of httpd, doing something like this would > be very difficult. I actually discussed this matter with my colleague tonight, if you can't go multithreading, one solution is to have a middleware server running on it's one. The middleserver could use the asyncore module from Python to manage multiple connections from a singlethreaded process. While containing sockets to "the world" mod_python connects to the program by a local UNIX socket or a longstanding TCP connection (to say, localhost) The connection between mod_python processes, say one pr. process (ie. in a module somewhere) - could last between different users and just say some "Switch user"-command to the middleware. A simple approach would be to associate those user socket sessions (like a telnet session?) with the user by using his session ID. The mod_python framework would only care about the session ID and formatting/passing commands through in the right format. The middleware could be smart or dumb - my suggestion is to make a simple xml-rpc API on the middleware proxy, not just bypass the socket communication. (why? To get short intervals to let other requests to the single threaded proxy come through) Problems -------- * Middleware complexity increases risk of anything failing - severel connections could get lost - the middleware could get trapped in a large respons/request * Scalabillity - the single-threaded middleware proxy could become the one thing slowing everything down in some situations - and unless you've already thought of it, it could become difficult to scale up. simple workaround: - several middleware instances - on the same or other machines - users are distributed to the most idle proxy Suggestions ----------- * Go for threading and mod_python - it would make tasks much simpler. Just remember to have some locks (and timeouts) so two requests don't use the socket at once! (the double-reload syndrome) * If your environment requires a forking apache, why not use another apache installment on a local port? the "outer" apache could proxy requests down - just like wrapping away zope. -- Stian Søiland Work toward win-win situation. Win-lose Trondheim, Norway is where you win and the other lose. http://www.soiland.no/ Lose-lose and lose-win are left as an exercise to the reader. [Limoncelli/Hogan]
|