Simultaneidad y bloqueo de eventos en Jitterbit App Builder
Concurrencia y bloqueo
De forma predeterminada, los eventos se ejecutan simultáneamente. Si dos usuarios hacen clic en el mismo botón simultáneamente, las ejecuciones de los eventos pueden solaparse. En algunas situaciones, puede ser necesario sincronizar eventos. Los eventos sincronizados se ejecutan en serie, lo que garantiza que solo se ejecute un evento sincronizado a la vez. Los eventos no sincronizados pueden ejecutarse simultáneamente, incluso con eventos sincronizados.
Los eventos se sincronizan mediante bloqueos. Un bloqueo abarca la validación y las acciones del evento. Los bloqueos no sincronizan otras reglas, como las predeterminadas o las de visibilidad.
Nota
En un ambiente multiservidor, los bloqueos distribuidos garantizan la sincronización de eventos en todo el clúster. Al usar Redis como proveedor de estado compartido, se utiliza el algoritmo Redlock.
Para habilitar el bloqueo de eventos, marque la opción Usar bloqueo al crear o modificar el evento. Esto habilitará opciones de bloqueo adicionales. La opción Usar bloqueo está disponible en la pantalla de configuración de eventos, haciendo clic en Caso extremo.
Precaución
Tenga cuidado al decidir si bloquear un evento. Sincronizar eventos afecta negativamente el rendimiento.
Nombres de bloqueo
Los bloqueos de eventos se denominan bloqueos. El nombre determina su alcance. Los eventos bloqueados que compartan el mismo nombre se sincronizarán. Esto permite a los desarrolladores sincronizar varios eventos. Por ejemplo, pueden sincronizar los eventos Insertar, Actualizar y Eliminar de una tabla determinada. Incluso se pueden sincronizar eventos de diferentes tablas si comparten el mismo nombre.
Si el desarrollador no especifica un nombre de bloqueo, se generará uno predeterminado en tiempo de ejecución. El nombre generado depende de si el evento es a nivel de tabla o de fila. Los eventos a nivel de tabla incluyen los eventos intrínsecos "Filtro" y "Nuevo". Los eventos a nivel de fila incluyen los eventos intrínsecos "Insertar", "Actualizar" y "Eliminar", así como los eventos definidos por el usuario.
Para los eventos a nivel de tabla, el ámbito de nombre predeterminado es el bloqueo de la tabla. Por ejemplo, bloquear el evento de filtro de la tabla garantiza que solo se pueda ejecutar un evento de filtro a la vez para la tabla dada.
Para los eventos a nivel de fila, el ámbito de nombre predeterminado es el bloqueo de una fila. Por ejemplo, bloquear el evento Update de la tabla garantiza que solo se pueda ejecutar un evento Update a la vez para una fila determinada. Dos eventos Update podrían ejecutarse simultáneamente para diferentes filas de la misma tabla.
Dado que los nombres de los bloqueos son globales, los desarrolladores deben asegurarse de asignar correctamente los espacios de nombres a los bloqueos. Considere usar el siguiente patrón como referencia para nombrar los bloqueos:
data-source-name:table-name:event-name
Por ejemplo:
Fulfillment:Orders:Ship
Precaución
Si dos eventos comparten el mismo nombre de bloqueo, App Builder emitirá una advertencia para evitar colisiones accidentales.
Los nombres de bloqueo admiten la interpolación de cadenas. Esta interpolación sustituye los valores de la fila actual en el nombre del bloqueo. Normalmente, los valores de la clave principal de la fila se sustituyen en el nombre para crear bloqueos con alcance de fila.
La sintaxis de interpolación de cadenas es:
{{nombre-de-columna }}
Por ejemplo, dado el siguiente nombre de candado:
Fulfillment:Orders:Ship:{{ ID de pedido }}
El nombre del bloqueo de tiempo de ejecución podría verse así:
Fulfillment:Orders:Ship:1234
Caducidad del bloqueo
Normalmente, los bloqueos se mantienen hasta que el evento se completa, ya sea con éxito o sin él. Si el evento no se completa a tiempo, afectará la disponibilidad del sistema. Para mitigar esto, los bloqueos de eventos expiran. Si el evento no se completa dentro del plazo de expiración, el bloqueo se libera. Sin embargo, tenga en cuenta que el evento puede continuar ejecutándose.
El tiempo de expiración predeterminado es de 10 segundos. Los desarrolladores pueden modificarlo según sea necesario. Se recomienda precaución con valores de expiración más altos.
Bloqueo de espera
Los bloqueos son exclusivos: solo un evento puede adquirir y mantener un bloqueo a la vez. Los demás eventos que intenten adquirir el bloqueo se pondrán en cola. Permanecerán en cola hasta que adquieran el bloqueo a su vez o hasta que transcurra el tiempo de espera.
El tiempo de espera predeterminado para el bloqueo es de 10 segundos. Los desarrolladores pueden modificarlo según sea necesario. Si el tiempo de caducidad es relativamente bajo, considere usar un valor igual al tiempo de caducidad. Si el tiempo de caducidad es alto, considere usar un valor bajo para el tiempo de espera. En otras palabras, si se espera que el bloqueo solo dure unos segundos, los usuarios suelen estar dispuestos a esperar a que esté disponible. Si, por el contrario, se espera que el bloqueo dure un minuto o más, suele ser preferible agotar el tiempo de espera antes de tiempo y notificar al usuario.
Si se alcanza el tiempo de espera para el bloqueo, el usuario verá un mensaje de alerta: "El evento fue cancelado".
Herencia de bloqueo
Los eventos admiten herencia. Las validaciones y acciones definidas en una tabla física se heredan mediante eventos de objetos de datos con el mismo nombre. Los eventos también heredan la configuración de bloqueo. Si el evento Update de la tabla física está bloqueado, el evento Update del objeto de datos también lo está.
La herencia de bloqueos también se aplica al evento Guardar. Este evento no es un evento de primera clase. En cambio, sus validaciones y acciones se fusionan con los eventos Insertar y Actualizar en tiempo de ejecución. Esto permite a los desarrolladores registrar una regla una sola vez y que se aplique tanto a las inserciones como a las actualizaciones. De igual forma, bloquear el evento Guardar bloqueará los eventos Insertar y Actualizar.
App Builder sintetiza un evento de cambio en tiempo de ejecución mediante las validaciones de los eventos Insertar o Actualizar. El evento de cambio se ejecuta cuando un usuario modifica el valor de un campo. Si el evento Insertar o Actualizar está bloqueado, el evento de cambio también lo estará.