Creazione di un advisor personalizzato

Un advisor personalizzato è una piccola parte del codice Java, fornito come file di classe, definito dal codice di base del Load Balancer per determinare il carico su un server. Il codice di base fornisce tutti i servizi di gestione necessari, inclusi l'avvio e l'arresto di un'istanza dell'advisor personalizzato, l'indicazione di stato e report, la registrazione di informazioni cronologiche in un file di log e la registrazione dei risultati dell'advisor sul componente gestore.

Quando il codice di base del Load Balancer chiama un advisor personalizzato, avviene quanto segue.

  1. Il codice di base del Load Balancer avvia una connessione con la macchina server.
  2. Se il socket viene aperto, il codice di base chiama la funzione GetLoad dell'advisor.
  3. La funzione GetLoad dell'advisor esegue le operazioni definite dall'utente per valutare lo stato del server, che include anche l'attesa di una risposta da parte del server. Dopo aver ricevuto la risposta, la funzione termina l'esecuzione.
  4. Il codice di base del Load Balancer chiude il socket con il server e invia le informazioni sul carico al gestore. A seconda del fatto se l'advisor personalizzato opera in modalità normale o in modalità di sostituzione, il codice di base, al termine della funzione GetLoad, effettua, a volte, ulteriori calcoli.

Modalità normale e modalità di sostituzione

Gli advisor personalizzati possono essere progettati per interagire con il Load Balancer in modalità normale o in modalità di sostituzione.

La scelta della modalità di funzionamento viene specificata nel file dell'advisor personalizzato come un parametro nel metodo del costruttore. (Ciascun advisor opera solo in una delle seguenti modalità, in base al proprio progetto.)

In modalità normale, l'advisor personalizzato scambia i dati con il server, il codice dell'advisor di base programma lo scambio e calcola il valore del carico. Il codice di base invia questo valore del carico al gestore. L'advisor personalizzato restituisce il valore zero per indicare la riuscita o un valore negativo per indicare un errore.

Per specificare la modalità normale, impostare l'indicatore di sostituzione nel costruttore su false.

In modalità di sostituzione, il codice di base non esegue nessuna misurazione temporizzata. Il codice dell'advisor personalizzato esegue qualsiasi operazione specificata, in base a requisiti univoci e restituisce un numero di carico effettivo. Il codice di base accetta il numero del carico e lo invia, inalterato, al gestore. Per ottenere risultati migliori, normalizzare i numeri del carico tra 10 e 1000; 10 indica un server veloce e 1000 indica un server lento.

Per specificare la modalità di sostituzione, impostare l'indicatore di sostituzione nel costruttore su true.

Convenzioni di denominazione dell'advisor

I nomi dei file dell'advisor personalizzato hanno il formato ADV_nome.java, dove nome è il nome scelto per il proprio advisor. Il nome completo deve cominciare con il prefisso ADV_ in lettere maiuscole, mentre tutti i caratteri successivi devono essere minuscoli. Le lettere minuscole assicurano che il comando di esecuzione dell'advisor non distingue tra maiuscole e al minuscole.

In base alle convenzioni Java, il nome classe definito all'interno del file deve corrispondere al nome del file.

Compilazione

È necessario scrivere gli advisor personalizzati in linguaggio Java e compilarli con un compilatore Java allo stesso livello del codice di Load Balancer. Per controllare la versione di Java sul proprio sistema, eseguire il seguente comando dalla directory percorso_install/java/bin:

java -fullversion

Se la directory corrente non fa parte del percorso, sarà necessario specificare che Java deve essere eseguito dalla directory corrente in modo da ottenere le informazioni corrette sulla versione. In questo caso, eseguire il seguente comando dalla directory percorso_install/java/bin:

./java -fullversion

Durante la compilazione si fa riferimento ai seguenti file:

Durante la compilazione, la variabile d'ambiente classpath deve indicare il file dell'advisor personalizzato e il file delle classi di base. Un comando di compilazione può avere il seguente formato: per sistemi UNIX Windows, un comando di compilazione di esempio è:

 percorso_install/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_nome.java

dove:

L'output della compilazione è un file di classe, ad esempio, ADV_nome .class. Prima di avviare l'advisor, copiare il file di classe nella directory percorso_installazione/servers/lib/CustomAdvisors/.

Nota:
è possibile compilare gli advisor personalizzati su un sistema operativo ed eseguirli su un altro sistema. Ad esempio, è possibile compilare l'advisor su un sistema Windows, copiare il file di classe risultante, in formato binario, su una macchina Linux ed eseguire da tale ubicazione l'advisor personalizzato. Per sistemi operativi AIX, HP-UX, Linux e Solaris, la sintassi è simile.

Esecuzione di un advisor personalizzato

Per eseguire l'advisor personalizzato, è necessario innanzitutto copiare il file di classe dell'advisor sulla directory secondaria lib/CustomAdvisors/ sulla macchina del Load Balancer. Ad esempio, per un advisor personalizzato definito myping, il percorso del file è percorso_installazione/servers/lib/CustomAdvisors/ADV_myping.class

Configurare il Load Balancer, avviare la funzione del gestore e immettere il comando per avviare l'advisor personalizzato. L'advisor personalizzato viene specificato tramite il nome, escludendo il prefisso ADV_ e l'estensione del file:

dscontrol advisor start
myping numero_porta

Il numero porta specificato nel comando è la porta su cui verrà avviata una connessione con il server di destinazione.

Routine richieste

Come tutti gli advisor, un advisor personalizzato estende la funzionalità della classe di base dell'advisor, definita ADV_Base. L'advisor di base esegue la maggior parte delle funzioni dell'advisor, come ad esempio l'invio dei carichi al gestore per essere utilizzati nell'algoritmo di valutazione del gestore. Inoltre, tale advisor effettua le operazioni di connessione e chiusura del socket e fornisce i metodi di invio e di ricezione per l'uso da parte dell'advisor. L'advisor viene utilizzato unicamente per l'invio e la ricezione dei dati sulla porta specifica del server esaminato. I metodi TCP forniti con l'advisor di base sono programmati per calcolare il carico. Se necessario, un'indicatore all'interno del costruttore dell'advisor di base sostituisce il carico esistente con il nuovo carico restituito dall'advisor.

Nota:
in base al valore impostato nel costruttore, l'advisor di base fornisce il carico all'algoritmo di valutazione a intervalli specifici. Se l'advisor non ha completato l'elaborazione e non può restituire un carico valido, l'advisor di base utilizza il carico inviato precedentemente.

Gli advisor dispongono dei seguenti metodi classe di base:

I dettagli relativi a queste routine necessarie sono riportati più avanti in questa stessa sezione.

Ordine di ricerca

Gli advisor personalizzati vengono chiamati dopo aver effettuato la ricerca di advisor nativi o standard. Se il Load Balancer non trova un advisor specificato nell'elenco di advisor standard, consulta l'elenco di advisor personalizzati. Nella WebSphere Application Server Load Balancer - Guida alla gestione sono disponibili ulteriori informazioni sull'utilizzo degli advisor.

Percorso del file e di denominazione

Tenere presenti i seguenti requisiti per i nomi e i percorsi dell'advisor personalizzato.

Chiamate di funzione e metodi dell'advisor personalizzato

Costruttore (fornito dall'advisor di base)

public <nome_advisor> (
        String sName;
        String sVersion;
        int iDefaultPort;
        int iInterval;
        String sDefaultLogFileName;
        boolean replace
)
sName
Il nome dell'advisor personalizzato.
sVersion
La versione dell'advisor personalizzato.
iDefaultPort
Il numero della porta su cui contattare il server nel caso in cui non fosse stato specificato nessun numero di porta nella chiamata.
iInterval
L'intervallo in cui l'advisor effettuerà la query ai server.
sDefaultLogFileName
Questo parametro è necessario ma non viene utilizzato. L'unico valore accettabile è una stringa nulla, ""
sostituzione
Indica la possibilità che questo advisor funzioni o meno in modalità di sostituzione. I valori possibili sono i seguenti:

ADV_AdvisorInitialize()

void  ADV_AdvisorInitialize()

Questo metodo viene fornito per effettuare qualsiasi inizializzazione che potrebbe essere necessaria per l'advisor personalizzato. Tale metodo viene chiamato dopo l'avvio del modulo di base dell'advisor.

In molti casi, inclusi gli advisor standard, questo metodo non viene utilizzato e il relativo codice è composto unicamente da un'istruzione return. Questo metodo può essere utilizzato per chiamare il metodo suppressBaseOpeningSocket, valido solo dall'interno di questo metodo.

getLoad()

int getLoad(
        int iConnectTime;
        ADV_Thread *caller
)
iConnectTime
Il tempo, espresso in millisecondi, necessario per completare la connessione. Questa misurazione del carico viene effettuata dal codice di base dell'advisor e inoltrata al codice dell'advisor personalizzato, il quale, durante la restituzione del valore del carico, può utilizzare o ignorare la misurazione. Se la connessione non riesce, questo valore viene impostato su -1.
chiamante
L'istanza della classe di base dell'advisor dove vengono forniti i metodi di base dell'advisor.

Chiamate di funzione disponibili per gli advisor personalizzati

I metodi, o funzioni, descritti nelle seguenti sezioni possono essere chiamati dagli advisor personalizzati. Questi metodi sono supportati dal codice di base dell'advisor.

Alcune di queste chiamate di funzione possono essere effettuate direttamente, ad esempio nome_funzione(), ma altre necessitano del prefisso chiamante. Chiamante rappresenta l'istanza dell'advisor di base che supporta l'advisor personalizzato eseguito.

ADVLOG()

La funzione ADVLOG consente a un advisor personalizzato di scrivere un messaggio di testo sul file di log dell'advisor di base. Di seguito viene riportato il formato:

void  ADVLOG  (int logLevel, String messaggio)
logLevel
Il livello di stato in cui viene scritto il messaggio sul file di log. Il file di log dell'advisor è organizzato in fasi; ai messaggi più urgenti viene attribuito il livello di stato 0, mentre quelli meno urgenti ricevono numeri più elevati. Al tipo di messaggio verbose viene attribuito un livello di stato pari a 5. Questi livelli vengono utilizzati per controllare in tempo reale i tipi di messaggi ricevuti dall'utente. (Il comando dscontrol viene utilizzato per impostare il livello di precisione delle informazioni dei messaggi). Gli errori gravi devono essere registrati sempre sul livello 0.
messaggio
Il messaggio da scrivere sul file di log. Il valore di questo parametro è una stringa Java standard.

getAdvisorName()

La funzione getAdvisorName restituisce una stringa Java con parte del suffisso del nome dell'advisor personalizzato. Ad esempio, per un advisor definito ADV_cdload.java, questa funzione restituisce il valore cdload.

Questa funzione non utilizza alcun parametro.

Si noti che non è possibile modificare questo valore durante la creazione di un'istanza di un advisor.

getAdviseOnPort()

La funzione getAdviseOnPort restituisce il numero porta su cui è in esecuzione l'advisor personalizzato chiamante. Il valore di ritorno è un numero intero (int)Java e la funzione non utilizza alcun parametro.

Si noti che non è possibile modificare questo valore durante la creazione di un'istanza di un advisor.

caller.getCurrentServerId()

La funzione getCurrentServerId restituisce una stringa Java che è una rappresentazione univoca per il server corrente.

Generalmente, questo valore viene modificato ogni volta che viene richiamato l'advisor personalizzato, in quanto il codice di base dell'advisor richiede tutte le macchine server in serie.

Questa funzione non utilizza alcun parametro.

caller.getCurrentClusterId()

La chiamata alla funzione getCurrentClusterId restituisce una stringa Java che è una rappresentazione univoca per il cluster corrente.

Generalmente, questo indirizzo viene modificato ogni volta che viene richiamato l'advisor personalizzato, in quanto il codice di base dell'advisor richiede tutti cluster in serie.

Questa funzione non utilizza alcun parametro.

caller.getSocket()

La chiamata alla funzione getSocket restituisce un socket Java che rappresenta il socket aperto sul server corrente per la comunicazione.

Questa funzione non utilizza alcun parametro.

getInterval()

La funzione getInterval restituisce l'intervallo dell'advisor, vale a dire, il numero di secondi trascorsi tra i cicli dell'advisor. Questo valore è uguale al valore predefinito impostato nel costruttore dell'advisor personalizzato, a meno che il valore non sia stato modificato durante il runtime utilizzando il comando dscontrol.

Il valore di ritorno è un numero intero (int) Java. La funzione non utilizza alcun parametro.

caller.getLatestLoad()

La funzione getLatestLoad consente a un advisor personalizzato di ottenere il valore del carico più recente per un determinato oggetto server. I valori del carico vengono gestiti in tabelle interne dal codice di base dell'advisor e dal daemon del gestore.

int caller.getLatestLoad (String IDcluster, int porta, String IDserver)

Tutti e tre gli argomenti definiscono un oggetto server.

IDcluster
L'identificativo cluster dell'oggetto server per cui ottenere il valore di carico corrente. Questo argomento deve essere una stringa Java.
porta
Il numero della porta dell'oggetto server per cui richiedere il valore corrente del carico.
IDserver
L'identificativo server dell'oggetto server per cui ottenere il valore di carico corrente. Questo argomento deve essere una stringa Java.

Il valore di ritorno è un numero intero.

Questa chiamata di funzione è utile se si desidera che il funzionamento di un protocollo o di una porta dipenda dal funzionamento di un altro protocollo o porta. Ad esempio, si potrebbe utilizzare questa chiamata di funzione in un advisor personalizzato che ha disabilitato un particolare server delle applicazioni se su quella stessa macchina è stato disabilitato il server Telnet.

caller.receive()

La funzione di ricezione ottiene informazioni dalla connessione socket.

caller.receive(StringBuffer *response)

Il parametro response è un buffer di stringhe in cui vengono introdotti i dati richiamati. Inoltre, la funzione restituisce un valore intero avente il seguente significato:

caller.send()

La funzione di invio utilizza la connessione socket stabilita per inviare un pacchetto di dati al server, utilizzando la porta specificata.

caller.send(String command)

Il parametro command è una stringa contenente i dati da inviare al server. La funzione restituisce un valore intero avente il seguente significato:

suppressBaseOpeningSocket()

La funzione suppressBaseOpeningSocket consente a un advisor personalizzato di specificare se il codice dell'advisor di base apre un socket TCP sul server per conto dell'advisor personalizzato. Se l'advisor non utilizza la comunicazione diretta con il server per stabilire il suo stato, potrebbe essere necessario aprire questo socket.

Questa chiamata di funzione può essere emessa solo una volta e deve essere emessa dalla routine ADV_AdvisorInitialize.

La funzione non utilizza alcun parametro.