The second generation of the server is a natural evolution of the first. Most of the core components remain, but are rearranged into a more flexible and manageable model. This new model is designed to be easier to administrate, operate in a "server farm", and add new functionality. (closer to a typical component architecture)
The architecture consists of an intelligent "jabberd" process, which just manages the config file and a packet delivery tree, and loads base modules which implement the packet handler functionality, and hook into the delivery tree to receive packets. Base modules include:
Below is a simple high-level graphic showing the Jabber II architecture:
Example simple config file
The development of Jabber II will be staged over at least three stable releases, 1.2, 1.4, and 2.0: 1.2 will be the base architecture shift with the socket scaling and farming enhancements, 1.4 will be moving to a better threading model (native, pthreads, mpm), 2.0 will be general stability and updates.
Details(ignore for now, just notes):
- extend jpackets, 4 types of routing
-- normal (from/to)
-- xdb:get="user", set, result
-- sid="jid" (use to route before to/from)
-- error logging requests
- each host/component
-- (tcp, other io) queueing, timeout, pings
-- xdb for config
- distrib
-- smart routing
-- broadcast to all (small scale)
- session manager
-- init for each host (for vhosting dso)
-- pass id tokens on calls
Delivery tree logic:
1: packet
|
2: xdb / log / session / normal
|
3: foo.org / isp.net / *
|
4: id="a" / id="b"
|
5: base_filter() / base_socket() / base_thread()
1: packet to deliver
2: branch based on type of packet
3: branch based on specific hostname or * catchs any
4: copy to each configured service for that hostname branch
5: call registered functions to handle or modify the packet until one does
examples:
incoming packet from a user for their session:
session >>> foo.org >>> id="foo.org" >>> base_thread()
incoming packet to a new server:
normal >>> * >>> id="server2server" >>> base_socket()
xdb request for a users roster:
xdb >>> isp.net >>> id="ldap" >>> base_thread()
error log entry from a service:
log >>> * >>> id="filelog" >>> base_file()
for many of the examples, there may have been multiple id="" (representing configured sections from the config file) matching that host entry, each would get a copy of the packet. after getting the packet, the section may have had further filters or restrictions based on something other than the name, which the registered functions handle.