Criando um Orientador Customizado

Um orientador customizado é uma pequena parte do código Java, fornecido como um arquivo de classe, chamado pelo código de base do Load Balancer para determinar a carga em um servidor. O código de base fornece todos os serviços administrativos necessários, incluindo iniciar e parar uma instância do orientador customizado, fornecer status e relatórios, registrar informações históricas em um arquivo de log e relatar resultados do orientador para o componente do gerenciador.

Quando o código de base do Load Balancer chama um orientador customizado, as seguintes etapas acontecem.

  1. O código de base do Load Balancer abre uma conexão com a máquina do servidor.
  2. Se o soquete abrir, o código base chamará a função GetLoad do orientador especificado.
  3. A função GetLoad do orientador executa as etapas definidas pelo usuário para avaliar o status do servidor, incluindo a espera por uma resposta do servidor. A função termina a execução quando a resposta é recebida.
  4. O código de base do Load Balancer fecha o soquete com o servidor e relata as informações de carregamento ao gerenciador. Dependendo de o orientador customizado operar ou não no modo normal ou no modo de substituição, o código de base ocasionalmente faz cálculos adicionais após a função GetLoad terminar.

Modo Normal e Modo de Substituição

Os orientadores customizados podem ser projetados para interagir com o Load Balancer no modo normal ou no modo de substituição.

A opção do modo de operação é especificada no arquivo do orientador customizado como um parâmetro no método do construtor. (Cada orientador opera em apenas um desses modos, baseado em seu design).

No modo normal, o orientador customizado troca dados com o servidor e o código do orientador base determina o tempo da troca e calcula o valor de carregamento. O código base então relata esse valor de carregamento para o gerenciador. O orientador customizado retorna o valor zero para indicar sucesso ou um valor negativo para indicar um erro.

Para especificar o modo normal, configure o sinalizador de substituição no construtor como false.

No modo de substituição, o código base não executa nenhuma medida de tempo. O código do orientador customizado executa quaisquer operações que forem especificadas com base nos requisitos exclusivos e então retorna um número de carregamento real. O código base aceita o número de carregamento e o relata de maneira inalterada para o gerenciador. Para obter melhores resultados, normalize os números de carregamento entre 10 e 1000, com 10 representando um servidor rápido e 1000 representando um servidor lento.

Para especificar o modo de substituição, configure o sinalizador de substituição no construtor como true.

Convenções de Nomenclatura do Orientador

Os nomes do arquivo do orientador customizado devem seguir o formulário ADV_name.java, em que name é o nome escolhido para o orientador. O nome completo deve iniciar com o prefixo ADV_ in em letras maiúsculas, e todos os caracteres subsequentes devem ser letras minúsculas. O requisito para letras minúsculas garante que o comando para execução do orientador não faz distinção de maiúsculas e minúsculas.

De acordo com as convenções Java, o nome da classe definida dentro do arquivo deve corresponder ao nome do arquivo.

Compilação

Você deve gravar orientadores customizados na linguagem Java e compilá-los com um compilador Java que esteja no mesmo nível do código do Balanceador de Carga. Para verificar a versão do Java em seu sistema, execute o seguinte comando do diretório install_path/java/bin:

java -fullversion

Se o diretório atual não fizer parte do seu caminho, você precisará especificar que o Java deve ser executado a partir do diretório atual para assegurar que você esteja obtendo as informações de versão corretas. Nesse caso, execute o seguinte comando no diretório install_path/java/bin:

./java -fullversion

Os seguintes arquivos são referidos durante a compilação:

A variável do seu ambiente de caminho de classe deve apontar para o arquivo do orientador e para o arquivo de classes de base durante a compilação. Um comando de compilação poderá ter o seguinte formato: para sistemas UNIX Windows, um comando de compilação de amostra é:

 install_path/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java

onde:

A saída da compilação é um arquivo de classe, por exemplo, ADV_name.class. Antes de iniciar o orientador, copie o arquivo de classe no diretório install_path/servers/lib/CustomAdvisors/.

Nota:
É possível compilar orientadores customizados em um sistema operacional e executar em outro sistema operacional. Por exemplo, é possível compilar o orientador em um sistema Windows, copiar o arquivo de classe resultante no formato binário, em uma máquina Linux e executar o orientador customizado lá. Para sistemas operacionais AIX, HP-UX, Linux e Solaris, a sintaxe é semelhante.

Executando um Orientador Customizado

Para executar o orientador customizado, primeiro é necessário copiar o arquivo de classe do orientador em um subdiretório lib/CustomAdvisors/ na máquina do Load Balancer. Por exemplo, para um orientador customizado chamado myping, o caminho de arquivo é install_path/servers/lib/CustomAdvisors/ADV_myping.class

Configure o Load Balancer, inicie a função do gerenciador e emita o comando para iniciar o orientador customizado. O orientador customizado é especificado por seu nome, excluindo o prefixo ADV_ e a extensão de arquivo:

dscontrol advisor start myping port_number

O número da porta especificado no comando é a porta na qual o orientador abrirá uma conexão com o servidor de destino.

Rotinas Necessárias

Como todos os orientadores, um orientador customizado estende a funcionalidade da classe base do orientador, que é chamada de ADV_Base. A base do orientador executa a maioria das funções do orientador, como relatar carregamentos de volta ao gerenciador para uso no algoritmo de peso do gerenciador. O orientador base também executa operações de conexão e de fechamento de soquete e fornece métodos de envio e de recebimento para uso pelo orientador. O orientador é usado somente para enviar e receber dados na porta especificada para o servidor que está sendo investigado. Os métodos TCP fornecidos no orientador base são cronometrados para calcular o carregamento. Um sinalizador no construtor do orientador base sobrescreve o carregamento existente com o novo carregamento retornado a partir do orientador, se desejado.

Nota:
Com base em um valor configurado no construtor, o orientador base fornece o carregamento para o algoritmo de peso em intervalos especificados. Se o orientador não concluir o processamento e não puder retornar um carregamento válido, o orientador base usará o carregamento relatado anteriormente.

Os orientadores possuem os seguintes métodos da classe base:

Os detalhes sobre essas rotinas necessárias são exibidos posteriormente nesta seção.

Ordem de Procura

Os orientadores customizados são chamados depois que orientadores nativos ou padrão forem procurados. Se o Load Balancer não localizar um orientador especificado na lista de orientadores padrão, ele consultará a lista de orientadores customizados. Informações adicionais sobre o uso de orientadores estão disponíveis no WebSphere Application Server Load Balancer Administration Guide.

Nomenclatura e Caminho de Arquivo

Lembre-se dos seguintes requisitos para nomes e caminhos do orientador customizado.

Métodos do Orientador Customizado e Chamadas de Função

Construtor (fornecido pela base do orientador)

public <advisor_name> (
        String sName;
        String sVersion;
        int iDefaultPort;
        int iInterval;
        String sDefaultLogFileName;
        boolean replace
)
sName
O nome do orientador customizado.
sVersion
A versão do orientador customizado
iDefaultPort
O número da porta no qual entrar em contato com o servidor se o número da porta for especificado na chamada.
iInterval
O intervalo no qual o orientador consultará os servidores.
sDefaultLogFileName
Esse parâmetro é necessário mas não é usado. O único valor aceitável é uma cadeia nula, ""
replace
Se este orientador funcionar ou não no modo de substituição. Os valores possíveis são os seguintes:

ADV_AdvisorInitialize()

void  ADV_AdvisorInitialize()

Este método é fornecido para executar qualquer inicialização que poderá ser necessária para o orientador customizado. Esse método é chamado depois que o módulo do orientador base ser iniciado.

Em muitos casos, incluindo os orientadores padrão, esse método não é usado e seu código consistem apenas em uma instrução de retorno. Esse método pode ser usado para chamar o método suppressBaseOpeningSocket, que é válido apenas de dentro desse método.

getLoad()

int getLoad(
        int iConnectTime;
        ADV_Thread *caller
)
iConnectTime
A quantia de tempo, em milissegundos, que é necessária para que a conexão seja concluída. Essa medida de carregamento é executada pelo código do orientador base e transmitida para o código do orientador customizado, que pode usar ou ignorar a medida quando retornar o valor de carregamento. Se a conexão falhar, esse valor será configurado como -1.
caller
A instância da classe base do orientador na qual os métodos de base do orientador são fornecidos.

Chamadas de Função Disponíveis para Orientadores Customizados

Os métodos ou funções, descritos nas seções a seguir, podem ser chamados a partir de orientadores customizados. Esses métodos são suportados pelo código do orientador base.

Algumas dessas chamadas de função podem ser feitas diretamente, por exemplo, function_name(), mas outras requerem o prefixo responsável pela chamada. O Responsável pela Chamada representa a instância do orientador de base que suporta o orientador customizado que está sendo executado.

ADVLOG()

A função ADVLOG permite que um orientador customizado grave uma mensagem de texto no arquivo de log do orientador base. O formato é o seguinte:

void  ADVLOG  (int logLevel, String message)
logLevel
O nível de status no qual a mensagem é gravada no arquivo de log. O arquivo de log do orientador é organizado em estágios; a maioria das mensagens urgentes recebe um nível de status 0 e mensagens menos urgentes recebem números maiores. O tipo de mensagem mais detalhado recebe o nível de status 5. Esses níveis são usados para controlar os tipos de mensagens que o usuário recebe em tempo real (O comando dscontrol é usado para configurar o detalhamento). Os erros catastróficos devem sempre ser registrados no nível 0.
message
O tipo de mensagem a ser gravado no arquivo de log. O valor deste parâmetro é uma cadeia Java padrão.

getAdvisorName()

A função getAdvisorName retorna uma cadeia Java com a parte do sufixo do nome do orientador customizado. Por exemplo, para um orientador chamado ADV_cdload.java, essa função retorna o valor cdload.

Essa função não usa parâmetros.

Observe que não é possível que esse valor seja alterado durante uma instanciação de um orientador.

getAdviseOnPort()

A função getAdviseOnPort retorna o número da porta na qual o orientador customizado de chamada está em execução. O valor de retorno é um número inteiroJava (int), e a função não utiliza nenhum parâmetro.

Observe que não é possível que esse valor seja alterado durante uma instanciação de um orientador.

caller.getCurrentServerId()

A função getCurrentServerId retorna uma cadeia Java que é uma representação exclusiva para o servidor atual.

Normalmente, esse valor é alterado sempre que você chama seu orientador customizado, porque o código base do orientador consulta todas as máquinas servidores em série.

Essa função não usa parâmetros.

caller.getCurrentClusterId()

A chamada de função getCurrentClusterId retorna uma cadeia Java que é uma representação exclusiva para o cluster atual.

Normalmente, esse valor é alterado sempre que você chama seu orientador customizado, porque o código base do orientador consulta todos os clusters em série.

Essa função não usa parâmetros.

caller.getSocket()

A chamada de função getSocket retorna um soquete Java que representa o soquete aberto para o servidor atual para comunicação.

Essa função não usa parâmetros.

getInterval()

A função getInterval retorna o intervalo do orientador, ou seja, o número de segundos entre os ciclos do orientador. Esse valor é igual ao valor-padrão configurado no construtor do orientador customizado, a não ser que o valor tenha sido modificado no tempo de execução usando o comando dscontrol.

O valor de retorno é um número inteiro Java (int). A função não usa parâmetros.

caller.getLatestLoad()

A função getLatestLoad permite que um orientador customizado obtenha o valor de carregamento mais recente para um determinado objeto do servidor. Os valores de carregamento são mantidos em tabelas internas pelo código base do orientador e pelo daemon do gerenciador.

int caller.getLatestLoad (String clusterId, int port, String serverId)

Os três argumentos juntos definem um objeto do servidor.

clusterId
O identificador de cluster no objeto do servidor para o qual o valor de carregamento atual é obtido. Esse argumento deve ser uma cadeia Java.
port
O número da porta do objeto do servidor para o qual o valor de carregamento atual é obtido.
serverId
O identificador de servidor do objeto do servidor para o qual o valor de carregamento atual é obtido. Esse argumento deve ser uma cadeia Java.

O valor de retorno é um número inteiro.

Essa chamada de função é útil se você desejar tornar o comportamento de protocolo ou de porta dependente do comportamento de outro. Por exemplo, você pode usar essa chamada de função em um orientador customizado que desativou um determinado servidor de aplicativos se o servidor Telnet nessa mesma máquina foi desativado.

caller.receive()

A função de recebimento obtém informações da conexão do soquete.

caller.receive(StringBuffer *response)

O parâmetro response é um buffer de cadeia no qual os dados recuperados são colocados. Adicionalmente, a função retorna um valor de número inteiro com a seguinte significância:

caller.send()

A função de envio usa a conexão de soquete estabelecida para enviar um pacote de dados para o servidor usando a porta especificada.

caller.send(String command)

O parâmetro command é uma cadeia que contém os dados a serem enviados ao servidor. A função retorna um valor de número inteiro com a seguinte significância:

suppressBaseOpeningSocket()

A chamada de função suppressBaseOpeningSocket permite que um orientador customizado especifique se o código do orientador de base abre um soquete TCP para o servidor em nome do orientador customizado. Se o orientador não usar comunicação direta com o servidor para determinar seu status, ele poderá não ser necessário para abrir esse soquete.

Essa chamada de função pode ser emitida apenas uma vez, e deve ser emitida da rotina ADV_AdvisorInitialize.

A função não usa parâmetros.