Servicio de escucha en agentes privados de Jitterbit
Introducción
El servicio de escucha es una característica de los agentes privados que puede ejecutar una operación de integración cuando ocurre un evento en un punto final, y puede equilibrar la carga del procesamiento de operaciones a través de un grupo de agentes.
El servicio solo funciona en grupos de agentes privados, y únicamente con los siguientes conectores y actividades:
Requisitos previos
Para utilizar el servicio de escucha, debe tener lo siguiente:
-
Agentes privados versión 10.78 / 11.16 o posterior.
-
Un número impar de agentes en un grupo de agentes. Para beneficiarse completamente de las características de balanceo de carga y tolerancia a fallos del servicio de escucha, se recomienda tener un mínimo de 3 agentes en el grupo de agentes.
-
\((N + 1) / 2\) de un total de \(N\) agentes en el grupo de agentes deben estar en funcionamiento. Por ejemplo, si hay 5 agentes en un grupo de agentes, 3 de ellos deben estar en funcionamiento.
-
Puertos TCP 5701 y 5801 abiertos en todos los hosts de agentes.
Nota
Dependiendo de su sistema, se pueden utilizar los siguientes comandos para probar puertos abiertos en un agente:
telnet <dirección del agente> <puerto>
netcat -vz <dirección del agente> <puerto>
onc -vz <dirección del agente> <puerto>
Test-NetConnection <dirección del agente> -Port <puerto>
(PowerShell)
Asegúrese de que su antivirus y firewall permitan conexiones a través de los puertos 5701 y 5801 para una prueba precisa.
-
Todos los agentes en la misma red.
Si encuentra el siguiente mensaje de error en Integration Studio, puede ser porque no ha cumplido con todos los requisitos:
Error al habilitar eventos
Error al habilitar eventos para la operación.
El clúster no ha alcanzado el tamaño mínimo requerido.
Habilitar el servicio de escucha
El servicio de escucha está deshabilitado por defecto. Debe habilitar el servicio de escucha en todos los agentes privados en un grupo, y en ambas operaciones y actividades del proyecto.
Habilitar agentes
Para habilitar el servicio, sigue estos pasos en todos los agentes privados del grupo:
-
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
. -
Agrega estas líneas:
1 2 3
agent.sdk_framework.listener.enabled=true agent.sdk_framework.listeners.matchEventsQueueToAvailableCores=true # agent.sdk_framework.listeners.eventsQueue=N
-
Línea 1: Habilita el servicio.
-
Línea 2: Establece el tamaño de la cola de eventos automáticamente.
-
Línea 3: (Opcional) Descomenta para establecer el tamaño de la cola de eventos manualmente, donde \(N\) es menor o igual al número de núcleos de procesador en el host del agente. (Si se utiliza, comenta la línea 2.)
-
-
Reinicia el agente.
Habilitar operaciones y actividades
Por defecto, la escucha de eventos está deshabilitada. Para habilitar la escucha de eventos en operaciones y actividades, sigue estos pasos:
-
Abre el proyecto y encuentra la operación que contiene la actividad de escucha. La capacidad de escucha de una actividad se muestra con un ícono en la parte superior derecha, para habilitado, o para no habilitado.
-
Si la operación aún no está desplegada, despliega la operación. Después de que esté desplegada, el interruptor Eventos Deshabilitados aparece en la parte inferior de la operación:
-
Para habilitar la escucha de eventos para la operación, haz clic en el interruptor Eventos Deshabilitados.
Importante
Habilitar o deshabilitar la escucha de eventos para una operación afecta a todas las actividades habilitadas para escuchar en la operación.
Monitorear el servicio de escucha
Puedes monitorear el estado del servicio de escucha con la Consola de Administración o la API REST.
Monitorear con la Consola de Administración
Una vez que una operación con una actividad de escucha esté desplegada, la operación y sus actividades de escucha se muestran en la pestaña Listeners de la página Proyectos de la Consola de Administración:
Monitor con la API REST
Puedes enviar una solicitud HTTP GET
al servicio de escucha para ver información de estado. Los siguientes puntos finales de información están disponibles:
Endpoint | Descripción |
---|---|
localhost:46912/axis/v1/cdk/internal/leader | Muestra el agente líder del clúster. |
localhost:46912/axis/v1/cdk/internal/cluster | Muestra el estado del clúster. |
localhost:46912/axis/v1/cdk/internal/starter/stats | Muestra estadísticas. |
localhost:46912/axis/v1/cdk/internal/members | Muestra el proceso de restauración. |
Consejo
Para restablecer las estadísticas, ejecuta este comando:
curl -XDELETE localhost:46912/axis/v1/cdk/internal/starter/stats
Ejemplos
Muestra el agente líder del clúster:
curl --silent localhost:46912/axis/v1/cdk/internal/leader | python -m json.tool
{
"AgentClusterMemberUUID": "67a77314-46c7-4243-9193-bc143ece5ed0",
"OrgId": "20980",
"AgentId": "281020",
"AgentHost": "192.168.64.18",
"AgentName": "Agent 1",
"AgentGroupId": "171230",
"AgentGroupName": "Agent Group A"
}
Muestra el estado del clúster:
curl --silent localhost:46912/axis/v1/cdk/internal/cluster | python -m json.tool
{
"clusterTime": 1725895381981,
"currentNumberOfMembers": 2,
"state": "ACTIVE",
"hasMinimumSize": true,
"minimumMembersRequired": 2
}
Muestra estadísticas:
curl --silent localhost:46912/axis/v1/cdk/internal/starter/stats | python -m json.tool
{
"sdk-retryable-events-queue": 0,
"sdk-inflight-messages-0": 0,
"sdk-processing-events-queue-0": {
"stats": null,
"lastProcessedEvent": -1,
"queueSize": 0
}
}
Muestra miembros:
curl --silent localhost:46912/axis/v1/cdk/internal/members | python -m json.tool
[
{
"isLeader": "true",
"minClusterSize": "2",
"inetSocketAddress": "192.168.64.18",
"uuid": "67a77314-46c7-4243-9193-bc143ece5ed0",
"version": "5.0.5",
"isLiteMember": "false",
"leaderNodeState": "STARTED",
"ipv4": "true",
"inetAddress": "192.168.64.18",
"port": "5701",
"ipv6": "false",
"host": "rocky89",
"AgentName": "Agent 1",
"AgentId": "281020"
},
{
"isLeader": "false",
"minClusterSize": "2",
"inetSocketAddress": "192.168.64.25",
"uuid": "efbfab6a-0326-43c0-a4f7-f14a26a36d25",
"version": "5.0.5",
"isLiteMember": "false",
"ipv4": "true",
"inetAddress": "192.168.64.25",
"port": "5701",
"ipv6": "false",
"host": "192.168.64.25",
"AgentName": "Agent 2",
"AgentId": "281030"
}
]
Habilitar persistencia
Los mensajes enviados a un agente pueden almacenarse en una base de datos. Si el agente falla, la base de datos proporciona un almacenamiento persistente de mensajes que pueden reenviarse cuando el agente vuelva a estar en línea.
Por defecto, la base de datos PostgreSQL interna almacena esta información, pero solo para clústeres de un solo agente. Para clústeres con más de un agente, debes habilitar la persistencia manualmente.
También puedes usar una base de datos externa habilitada para JDBC o un servidor Redis.
Persistencia de múltiples agentes (PostgreSQL interno)
Para habilitar la persistencia de múltiples agentes en la base de datos PostgreSQL interna, sigue estos pasos en todos los agentes privados del grupo:
-
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
. -
Agrega estas líneas:
agent.sdk_framework.queueStore.enabled=true agent.sdk_framework.queueStore.type=dbinternal agent.sdk_framework.persistence.enabled=true agent.sdk_framework.persistence.type=dbinternal
-
Reinicia el agente.
Persistencia de múltiples agentes (JDBC externo o Redis)
Para habilitar la persistencia de múltiples agentes utilizando una base de datos externa habilitada para JDBC o un servidor Redis, sigue estos pasos en todos los agentes privados del grupo:
-
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
. -
Si la base de datos utiliza una conexión JDBC, agrega estas líneas:
Configuraciones de almacenamiento persistente de base de datos habilitada para JDBC (Ejemplo)agent.sdk_framework.queueStore.enabled=true agent.sdk_framework.queueStore.type=db agent.sdk_framework.persistence.enabled=true agent.sdk_framework.persistence.type=db agent.sdk_framework.datastore.db.url=jdbc:sqlserver://harmony:1433;database=cloud agent.sdk_framework.datastore.db.user=sa agent.sdk_framework.datastore.db.password=****** agent.sdk_framework.datastore.db.databaseName=cloud agent.sdk_framework.datastore.db.dialect=org.hibernate.dialect.SQLServerDialect agent.sdk_framework.datastore.db.driver_class=com.microsoft.sqlserver.jdbc.SQLServerDriver
Si la base de datos es Redis, agrega estas líneas:
Configuraciones de almacenamiento persistente de Redis (Ejemplo)agent.sdk_framework.queueStore.enabled=true agent.sdk_framework.queueStore.type=redis agent.sdk_framework.persistence.enabled=true agent.sdk_framework.persistence.type=redis agent.sdk_framework.datastore.redis.url=redis://redis:6379 #Optional - pool configuration agent.sdk_framework.datastore.redis.maxTotal=8 agent.sdk_framework.datastore.redis.maxIdle=8 agent.sdk_framework.datastore.redis.minIdle=0 agent.sdk_framework.datastore.redis.blockWhenExhausted=true agent.sdk_framework.datastore.redis.maxWaitMillis=-1 agent.sdk_framework.datastore.redis.testOnBorrow=false agent.sdk_framework.datastore.redis.testOnReturn=false agent.sdk_framework.datastore.redis.jmxEnabled=true
-
Reinicia el agente.
Importante
El usuario de la base de datos debe tener permisos para crear tablas, y para crear, leer, actualizar y eliminar datos.
Solución de problemas
Restauración del clúster después de la falla del agente
Si un agente falla con la persistencia habilitada, puedes restaurarlo manualmente utilizando estos pasos:
-
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
en el host del agente que falló. -
Agrega esta línea:
agent.sdk_framework.listener.running.mode=restore
-
Inicia el agente.
-
Usa la API REST para consultar el estado del agente.
-
Cuando el estado de
leaderNodeState
seaRESTORED
, detén el agente. -
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
nuevamente y elimina o comenta la línea agregada en el paso 2. -
Inicia el agente.
Mensajes no entregados
El mecanismo de reintento de entrega de mensajes del clúster elimina los mensajes no entregados después de un período. Para cambiar el período o suprimir la eliminación de mensajes, sigue estos pasos:
-
Edita
JITTERBIT_HOME/Resources/jitterbit-agent-config.properties
. -
Encuentra la siguiente línea y cambia el valor de \(N\) (en minutos):
agent.sdk_framework.retry.deleteRetryableMessageAfter=N
Consejo
Para mantener todos los mensajes indefinidamente, utiliza el valor de
-1
paraN
. -
Reinicia el agente.