Tutorial: equilibrar la carga de los mensajes de syslog mediante extensiones de protocolo
El protocolo Syslog disponible en el dispositivo NetScaler solo funciona para los mensajes generados en el dispositivo NetScaler. No equilibra la carga de los mensajes procedentes de nodos externos. Para equilibrar la carga de dichos mensajes, debe utilizar la función de extensiones de protocolo y escribir la lógica de análisis de mensajes de syslog mediante el lenguaje de programación Lua 5.2.
Código para analizar el mensaje de syslog
El código solo tiene definida la función de devolución de datos del cliente TCP: client.on_data (). Para los datos del servidor, no agrega una función de devolución de llamada y el servidor al cliente toma la ruta nativa rápida. El código identifica el límite del mensaje en función del carácter final. Si el paquete TCP contiene más de un mensaje de syslog, dividimos el paquete en función del carácter final y equilibramos la carga de cada mensaje.
——[[TCP客户机数据ctxt Syslog事件处理程序- TCP client side App processing context. data - TCP Data stream received. --]] function client.on_data(ctxt, payload) local message = nil local data_len local data = payload.data local trailing_character = "\n" ::split_message:: -- Get the offset of trailing character local new_line_character_offset = data:find(trailing_character) -- If trailing character is not found, then wait for more data. if (not new_line_character_offset) then goto need_more_data end -- Get the length of the current message data_len = data:len() -- Check whether we have more than one message -- by comparing trailing character offset and -- current data length if (data_len > new_line_character_offset) then -- If we have more than one message, then split -- the data into two parts such that first part -- will contain message upto trailing character -- offset and second part will contain -- remaining message. message, data = data:split(new_line_character_offset) else message = data data = nil end -- Send the data to the backend server. ns.send(ctxt.output, "EOM", {data = message}) goto done ::need_more_data:: -- Wait for more data ctxt:hold(data) data = nil goto done ::done:: -- If we have more data to parse, -- then do parsing again. if (data) then goto split_message end end