|
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]
|