// -*- IDL -*- //============================================================================= /** * @file CosLoadBalancing.idl * * $Id$ * * @author Object Management Group */ //============================================================================= #ifndef COSLOADBALANCING_IDL #define COSLOADBALANCING_IDL #include "PortableGroup.idl" #include "orb.idl" /** * @class CosLoadBalancing * * @brief This module defines the interfaces and data types used in * TAO's Load Balancing service. * @par * TAO's Load Balancer manages distribution of requests to replicas of * a given Object in an effort to ensure that the applications/hosts * pointed to by the Object reference are as equally loaded as * possible, i.e. load balanced. * @par * The definition of 'load' is application specific, for example, some * applications may choose to load balance access to multiple * dedicated lines, or separate network interfaces, as well as more * traditional load balancing metrics, such as CPU or power load. */ module CosLoadBalancing { typeprefix CosLoadBalancing "tao.lb"; const IOP::ServiceId LOAD_MANAGED = 123456; // @todo TBA by OMG typedef PortableGroup::Location Location; typedef PortableGroup::Properties Properties; // Types used for obtaining and/or reporting loads typedef unsigned long LoadId; // OMG defined LoadId constants. const LoadId LoadAverage = 0; const LoadId Disk = 1; const LoadId Memory = 2; const LoadId Network = 3; const LoadId RequestsPerSecond = 4; struct Load { LoadId id; float value; }; typedef sequence LoadList; exception MonitorAlreadyPresent {}; exception LocationNotFound {}; exception LoadAlertNotFound {}; exception LoadAlertAlreadyPresent {}; exception LoadAlertNotAdded {}; exception StrategyNotAdaptive {}; interface LoadManager; interface Strategy { readonly attribute string name; Properties get_properties (); // Report loads at given location to the LoadManager. void push_loads (in PortableGroup::Location the_location, in LoadList loads) raises (StrategyNotAdaptive); // Get loads, if any, at the given location. Load balancing // strategies may use this method to query loads at specific // locations. Returned loads are the effective loads computed by // the Strategy, as opposed to the raw loads maintained by the // LoadManager. LoadList get_loads (in LoadManager load_manager, in PortableGroup::Location the_location) raises (LocationNotFound); // Return the next member from the given object group which will // requests will be forward to. Object next_member (in PortableGroup::ObjectGroup object_group, in LoadManager load_manager) raises (PortableGroup::ObjectGroupNotFound, PortableGroup::MemberNotFound); // Ask the Strategy to analyze loads, and enable or disable alerts // at object group members residing at appropriate locations. oneway void analyze_loads (in PortableGroup::ObjectGroup object_group, in LoadManager load_manager); // The loads at the given location should no longer be considered // when performing load analysis. // void location_removed (in PortableGroup::Location the_location) // raises (LocationNotFound); }; typedef Strategy CustomStrategy; // Property value for built-in load balancing Strategy. struct StrategyInfo { string name; Properties props; }; interface LoadAlert { // Forward requests back to the load manager via the object group // reference. void enable_alert (); // Stop forwarding requests, and begin accepting them again. void disable_alert (); }; // Interface that all load monitors must implement. interface LoadMonitor { // Retrieve the location at which the LoadMonitor resides. readonly attribute Location the_location; // Retrieve the current load at the location LoadMonitor resides. readonly attribute LoadList loads; }; // Specification of LoadManager Interface interface LoadManager : PortableGroup::PropertyManager, PortableGroup::ObjectGroupManager, PortableGroup::GenericFactory { // For the PUSH load monitoring style. void push_loads (in PortableGroup::Location the_location, in LoadList loads); // Return the raw loads at the given location, as opposed to the // potentially different effective loads returned by the // Strategy::get_loads() method. LoadList get_loads (in PortableGroup::Location the_location) raises (LocationNotFound); // Inform member at given location of load alert condition. void enable_alert (in PortableGroup::Location the_location) raises (LoadAlertNotFound); // Inform member at given location that load alert condition has // passed. void disable_alert (in PortableGroup::Location the_location) raises (LoadAlertNotFound); // Register a LoadAlert object for the member at the given // location. void register_load_alert (in PortableGroup::Location the_location, in LoadAlert load_alert) raises (LoadAlertAlreadyPresent, LoadAlertNotAdded); // Retrieve the LoadAlert object for the member at the given // location. LoadAlert get_load_alert (in PortableGroup::Location the_location) raises (LoadAlertNotFound); // Remove (de-register) the LoadAlert object for the member at the // given location. void remove_load_alert (in PortableGroup::Location the_location) raises (LoadAlertNotFound); // The following load monitor methods are only used for the PULL // load monitoring style. // Register a LoadMonitor object for "pull" monitoring of the // given location. void register_load_monitor (in PortableGroup::Location the_location, in LoadMonitor load_monitor) raises (MonitorAlreadyPresent); // Retrieve the LoadMonitor object for the given location. LoadMonitor get_load_monitor (in PortableGroup::Location the_location) raises (LocationNotFound); // Remove (de-register) the LoadMonitor object for the given // location. void remove_load_monitor (in PortableGroup::Location the_location) raises (LocationNotFound); }; }; #endif /* COSLOADBALANCING_IDL */