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.
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.
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.
È 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/.
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.
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.
Gli advisor dispongono dei seguenti metodi classe di base:
I dettagli relativi a queste routine necessarie sono riportati più avanti in questa stessa sezione.
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.
Tenere presenti i seguenti requisiti per i nomi e i percorsi dell'advisor personalizzato.
public <nome_advisor> ( String sName; String sVersion; int iDefaultPort; int iInterval; String sDefaultLogFileName; boolean replace )
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.
int getLoad( int iConnectTime; ADV_Thread *caller )
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.
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)
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.
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.
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.
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.
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.
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.
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.
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.
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:
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:
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.