Un asesor personalizado es un pequeña porción de código Java™, proporcionado como archivo de clases, que llama al código base de Load Balancer para determinar la carga en un servidor. El código base proporciona todos los servicios administrativos necesarios, incluidos el inicio y la detención de una instancia del asesor personalizado, con estados e informes, registro de la información de historial en un archivo de anotaciones cronológicas y notificación de los resultados del asesor al componente de gestor.
Cuando el código base de Load Balancer llama a un asesor personalizado, se realizan los pasos siguientes:
Los asesores personalizados se pueden diseñar para interactuar con Load Balancer en la modalidad normal o de sustitución.
La opción para la modalidad de operación se especifica como un parámetro en el método de constructor en el archivo de asesor personalizado. (Cada asesor sólo funciona en una de estas modalidades, basándose en el diseño.)
En modalidad normal, el asesor personalizado intercambia datos con el servidor y el código del asesor base calcula la duración del intercambio y calcula el valor de carga. A continuación, el código base informa de este valor de carga al gestor. El asesor personalizado devuelve el valor cero para indicar el éxito o un valor negativo para indicar un error.
Para especificar la modalidad normal, establezca el distintivo de sustitución del constructor en false.
En modalidad de sustitución, el código base no lleva a cabo las mediciones de tiempo. El código del asesor personalizado realiza las operaciones que se especifiquen, basándose en los requisitos exclusivos y, a continuación, devuelve un número de carga real. El código base acepta el número de carga y lo notifica, sin alterar, al gestor. Para obtener los mejores resultados, normalice los números de carga entre 10 y 1000, donde 10 representa un servidor rápido y 1000 representa un servidor lento.
Para especificar la modalidad de sustitución, establezca el distintivo de sustitución del constructor en true.
Los nombres de archivo de asesor personalizado deben seguir el formato ADV_nombre.java, donde nombre es el nombre que se elige para el asesor. El nombre completo debe empezar con el prefijo ADV_ en mayúsculas y todos los caracteres posteriores deben estar en minúsculas. El requisito de minúsculas garantiza que el mandato para ejecutar el asesor no sea sensible a las mayúsculas y minúsculas.
De acuerdo con los convenios Java, el nombre de la clase definida en el archivo debe coincidir con el nombre del archivo.
Debe escribir asesores personalizados en lenguaje Java y compilarlos con un compilador Java que esté en el mismo nivel que el código de Load Balancer. Para comprobar la versión de Java en el sistema, ejecute el mandato siguiente desde el directorio vía_acceso_instalación/java/bin:
java -fullversion
Si el directorio actual no forma parte de la vía de acceso, tendrá que especificar que Java se debe ejecutar desde el directorio actual para asegurarse de que obtiene la información de la versión correcta. En este caso, ejecute el mandato siguiente desde el directorio vía_acceso_instalación/java/bin:
./java -fullversion
Durante la compilación aparecen referenciados los siguientes archivos:
La variable de entorno classpath debe apuntar al archivo de asesor personalizado y al archivo de clases base durante la compilación. Un mandato de compilación puede tener el formato siguiente: Para sistemas UNIX Windows, un mandato de compilación es, por ejemplo, el siguiente:
vía_instalación/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java
donde:
La salida de la compilación es un archivo de clase, por ejemplo ADV_nombre.class. Antes de iniciar el asesor, copie el archivo de clase en el directorio vía_acceso_instalación/servers/lib/CustomAdvisors/.
Para ejecutar el asesor personalizado, primero debe copiar el archivo de clase del asesor en el subdirectorio lib/CustomAdvisors/ de la máquina de Load Balancer. Por ejemplo, para un asesor personalizado denominado myping, la vía de acceso de archivo es vía_acceso_instalación/servers/lib/CustomAdvisors/ADV_myping.class
Configure Load Balancer, inicie su función de gestor y emita el mandato para iniciar el asesor personalizado. El asesor personalizado se especifica por su nombre, excluyendo el prefijo ADV_ y la extensión de archivo:
dscontrol advisor start myping número_puerto
El número de puerto especificado en el mandato es el puerto en el que el asesor abrirá una conexión con el servidor de destino.
Como todos los asesores, un asesor personalizado amplía la funcionalidad de la clase base de asesor, que se denomina ADV_Base. La base de asesor efectúa la mayoría de las funciones del asesor, por ejemplo devolver la información de las cargas al gestor para utilizarlas en el algoritmo de peso del gestor. La base del asesor también realiza operaciones de conexión y cierre de sockets, y proporciona métodos de envío y recepción para que el asesor los utilice. El asesor sólo se utiliza para enviar y recibir datos en el puerto especificado para el servidor que se está investigando. Para calcular la carga, se calcula la duración de los métodos TCP proporcionados en la base de asesor. Si se desea, un distintivo en el constructor de la base de asesor sobregraba la carga existente la nueva carga devuelta desde el asesor.
Los asesores tienen los siguientes métodos de clase base:
Más adelante en este apartado, aparecen detalles sobre estas rutinas necesarias.
Se llama a los asesores personalizados después de haber buscado los asesores nativos o estándares. Si el Load Balancer no encuentra un asesor especificado entre la lista de asesores estándar, consulta la lista de asesores personalizados. Hay información adicional sobre el uso de asesores que está disponible en la publicación WebSphere Application Server Load Balancer Administration Guide.
Recuerde los requisitos siguientes para los nombres y las vías de acceso de asesor personalizado.
public <nombre_asesor> (
String sName;
String sVersion;
int iDefaultPort;
int iInterval;
String sDefaultLogFileName;
boolean replace
)
void ADV_AdvisorInitialize()
Este método se proporciona para realizar cualquier inicialización que pueda ser necesaria para el asesor personalizado. Se llama a este método después de que se haya iniciado el módulo base de asesor.
En muchos casos, incluyendo los asesores estándares, este método no se utiliza y el código sólo consta de una sentencia de retorno. Este método se puede utilizar para llamar al método suppressBaseOpeningSocket, que sólo es válido desde dentro de este método.
int getLoad(
int iConnectTime;
ADV_Thread *caller
)
A los métodos, o a las funciones, que se describen en los apartados siguientes se le puede llamar desde los asesores personalizados. El código base de asesor soporta estos métodos.
Algunas de estas llamadas de función se pueden hacer directamente, por ejemplo nombre_función(), pero otras necesitan el prefijo caller. Caller representa la instancia de asesor base que soporta el asesor personalizado que se está ejecutando.
La función ADVLOG permite que un asesor personalizado grabe un mensaje de texto en el archivo de anotaciones cronológicas base de asesor. El formato es el siguiente:
void ADVLOG (int logLevel, String mensaje)
La función getAdvisorName devuelve una serie Java con la parte de sufijo del nombre del asesor personalizado. Por ejemplo, para un asesor denominado ADV_cdload.java, esta función devuelve el valor cdload.
Esta función no toma ningún parámetro.
Tenga en cuenta que este valor no puede cambiar durante una instanciación de un asesor.
La función getAdviseOnPort devuelve el número de puerto en el que se ejecuta el asesor personalizado que realiza la llamada. El valor de retorno es un entero Java (int) y la función no toma parámetros.
Tenga en cuenta que este valor no puede cambiar durante una instanciación de un asesor.
La función getCurrentServerId devuelve una serie Java que es una representación exclusiva del servidor actual.
Normalmente, este valor cambia cada vez que se llama al asesor personalizado, porque el código base de asesor consulta todas las máquinas de servidor en serie.
Esta función no toma ningún parámetro.
La llamada de función getCurrentClusterId devuelve una serie Java que es una representación exclusiva del clúster actual.
Normalmente, este valor cambia cada vez que se llama al asesor personalizado, porque la base de asesor consulta todos los clústeres en serie.
Esta función no toma ningún parámetro.
La llamada de función getSocket devuelve un socket Java que representa el socket abierto al servidor actual para la comunicación.
Esta función no toma ningún parámetro.
La función getInterval devuelve el intervalo de asesor, es decir, el número de segundos entre ciclos de asesor. Este valor es igual al valor predeterminado establecido en el constructor del asesor personalizado, a menos que se haya modificado el valor durante la ejecución utilizando el mandato dscontrol.
El valor de retorno es un entero Java (int). La función no toma ningún parámetro.
La función getLatestLoad permite que un asesor personalizado obtenga el valor de carga más reciente para un objeto de servidor determinado. Los valores de carga los mantienen en tablas internas el código base de asesor y el daemon de gestor.
int caller.getLatestLoad (String clusterId, int port, String serverId)
Los tres argumentos juntos definen un objeto de servidor.
El valor de retorno es un entero.
Esta llamada de función es útil si desea que el comportamiento de un protocolo o puerto sea dependiente del comportamiento de otro. Por ejemplo, puede utilizar esta llamada de función en un asesor personalizado que ha inhabilitado un servidor de aplicaciones determinado si el servidor Telnet de esa misma máquina estaba inhabilitado.
La función receive obtiene información de la conexión de socket.
caller.receive(StringBuffer *response)
El parámetro respuesta es un almacenamiento intermedio de serie en el que se ponen los datos recuperados. Además, la función devuelve un valor entero con el significado siguiente:
La función send utiliza la conexión de socket establecida para enviar un paquete de datos al servidor, utilizando el puerto especificado.
caller.send(String command)
El parámetro mandato es una serie que contiene los datos que se deben enviar al servidor. La función devuelve un valor entero con el significado siguiente:
La llamada de función suppressBaseOpeningSocket permite que un asesor personalizado especifique si el código de asesor base abre un socket TCP para el servidor en nombre del asesor personalizado. Si el asesor no utiliza la comunicación directa con el servidor para determinar el estado, puede que no sea necesario abrir este socket.
Esta llamada de función sólo se puede emitir una vez y se debe emitir desde la rutina ADV_AdvisorInitialize.
La función no toma ningún parámetro.