Creación de un asesor personalizado

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:

  1. El código base de Load Balancer abre una conexión con la máquina del servidor.
  2. Si se abre el socket, el código base llama a la función GetLoad del asesor especificado.
  3. La función GetLoad del asesor realiza los pasos que el usuario ha definido para evaluar el estado del servidor, incluida la espera de una respuesta del servidor. La función termina la ejecución cuando se recibe la respuesta.
  4. El código base de Load Balancer cierra el socket con el servidor y notifica la información de carga al gestor. En función de si el asesor personalizado funciona en modalidad normal o en modalidad de sustitución, el código base a veces realiza cálculos adicionales después de que finalice la función GetLoad.

Modalidad normal y modalidad de sustitución

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.

Convenios de denominación de asesor

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.

Compilación

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/.

Nota:
Puede compilar los asesores personalizados en un sistema operativo y ejecutarlos en otro sistema operativo. Por ejemplo, puede compilar el asesor en un sistema Windows, copiar el archivo de clase resultante, en formato binario, en una máquina Linux y ejecutar allí el consejero personalizado. Para sistemas operativos AIX, HP-UX, Linux y Solaris, la sintaxis es similar.

Ejecución de un asesor personalizado

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.

Rutinas necesarias

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.

Nota:
La base del asesor proporciona la carga al algoritmo de peso a intervalos especificados en función de un valor fijado en el constructor. Si el asesor no ha completado el proceso y no puede devolver una carga válida, la base de asesor utiliza la carga notificada anteriormente.

Los asesores tienen los siguientes métodos de clase base:

Más adelante en este apartado, aparecen detalles sobre estas rutinas necesarias.

Orden de búsqueda

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.

Denominación y vía de acceso de archivo

Recuerde los requisitos siguientes para los nombres y las vías de acceso de asesor personalizado.

Métodos de asesor personalizado y llamadas de función

Constructor (proporcionado por la base de asesor)

public <nombre_asesor> (
        String sName;
        String sVersion;
        int iDefaultPort;
        int iInterval;
        String sDefaultLogFileName;
        boolean replace
)
sName
Nombre del asesor personalizado.
sVersion
Versión del asesor personalizado.
iDefaultPort
Número de puerto en el que ponerse en contacto con el servidor si no se especifica ningún número de puerto en la llamada.
iInterval
Intervalo al que el asesor consultará a los servidores.
sDefaultLogFileName
Este parámetro es necesario pero no se utiliza. El único valor aceptable es una serie nula, ""
replace
Indica si este asesor funciona en modalidad de sustitución. Los valores posibles son los siguientes:

ADV_AdvisorInitialize()

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.

getLoad()

int getLoad(
        int iConnectTime;
        ADV_Thread *caller
)
iConnectTime
Tiempo, en milisegundos, que ha tardado la conexión en completarse. Esta medición de carga la realiza la base de asesor y se pasa al código de asesor personalizado, que puede utilizar o ignorar la medición al devolver el valor de carga. Si la conexión falla, este valor se establece en -1.
caller
Instancia de la clase base de asesor donde se proporcionan métodos base de asesor.

Llamadas de función disponibles para asesores personalizados

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.

ADVLOG()

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)
nivel_anotaciones_cronológicas
Nivel de estado en el que el mensaje se graba en el archivo de anotaciones cronológicas. El archivo de anotaciones cronológicas de asesor se organiza en etapas; a los mensajes más urgentes se les asigna el nivel de estado 0 y los mensajes menos urgentes reciben los números más altos. Al tipo de mensaje más detallado se le asigna el nivel de estado 5. Estos niveles se utilizan para controlar los tipos de mensajes que el usuario recibe en tiempo real (para establecer el grado de detalle se utiliza el mandato dscontrol). Los errores muy graves se deben registrar siempre en el nivel 0.
mensaje
Mensaje que se debe grabar en el archivo de anotaciones cronológicas. El valor de este parámetro es una serie Java estándar.

getAdvisorName()

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.

getAdviseOnPort()

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.

caller.getCurrentServerId()

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.

caller.getCurrentClusterId()

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.

caller.getSocket()

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.

getInterval()

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.

caller.getLatestLoad()

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.

ID_clúster
Identificador de clúster del objeto de servidor para el que se debe obtener el valor de carga actual. Este argumento debe ser una serie Java.
puerto
Número de puerto del objeto de servidor para el que se debe obtener el valor de carga actual.
ID_servidor
Identificador de servidor del objeto de servidor para el que se debe obtener el valor de carga actual. Este argumento debe ser una serie Java.

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.

caller.receive()

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:

caller.send()

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:

suppressBaseOpeningSocket()

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.