• Brion Vibber's avatar
    Major refactoring of queue handlers to support running multiple sites in one daemon. · ec145b73
    Brion Vibber authored
    Key changes:
    * Initialization code moved from common.php to StatusNet class;
      can now switch configurations during runtime.
    * As a consequence, configuration files must now be idempotent...
      Be careful with constant, function or class definitions.
    * Control structure for daemons/QueueManager/QueueHandler has been refactored;
      the run loop is now managed by IoMaster run via scripts/queuedaemon.php
      IoManager subclasses are woken to handle socket input or polling, and may
      cover multiple sites.
    * Plugins can implement notice queue handlers more easily by registering a
      QueueHandler class; no more need to add a daemon.
    
    The new QueueDaemon runs from scripts/queuedaemon.php:
    
    * This replaces most of the old *handler.php scripts; they've been refactored
      to the bare handler classes.
    * Spawns multiple child processes to spread load; defaults to CPU count on
      Linux and Mac OS X systems, or override with --threads=N
    * When multithreaded, child processes are automatically respawned on failure.
    * Threads gracefully shut down and restart when passing a soft memory limit
      (defaults to 90% of memory_limit), limiting damage from memory leaks.
    * Support for UDP-based monitoring: http://www.gitorious.org/snqmon
    
    Rough control flow diagram:
    QueueDaemon -> IoMaster -> IoManager
                               QueueManager [listen or poll] -> QueueHandler
                               XmppManager [ping & keepalive]
                               XmppConfirmManager [poll updates]
    
    Todo:
    
    * Respawning features not currently available running single-threaded.
    * When running single-site, configuration changes aren't picked up.
    * New sites or config changes affecting queue subscriptions are not yet
      handled without a daemon restart.
    * SNMP monitoring output to integrate with general tools (nagios, ganglia)
    * Convert XMPP confirmation message sends to use stomp queue instead of polling
    * Convert xmppdaemon.php to IoManager?
    * Convert Twitter status, friends import polling daemons to IoManager
    * Clean up some error reporting and failure modes
    * May need to adjust queue priorities for best perf in backlog/flood cases
    
    Detailed code history available in my daemon-work branch:
    http://www.gitorious.org/~brion/statusnet/brion-fixes/commits/daemon-work
    ec145b73
pluginqueuehandler.php 1.61 KB