Ir para o conteúdo

Simultaneidade e Bloqueio de Eventos

Simultaneidade e Bloqueio

Por padrão, os eventos são executados simultaneamente. Se dois usuários clicarem no mesmo botão ao mesmo tempo, as execuções de eventos poderão se sobrepor. Em algumas situações, pode ser necessário sincronizar eventos. Os eventos sincronizados são executados em série, garantindo que apenas um evento sincronizado seja executado por vez. Eventos não sincronizados ainda poderão ser executados simultaneamente, mesmo com eventos sincronizados.

Os eventos são sincronizados com bloqueios. Um bloqueio abrange a validação e as ações do evento. Os bloqueios não sincronizam outras regras, como padrões ou regras de visibilidade.

Nota

Em um ambiente multiservidor, os bloqueios distribuídos garantem que os eventos sejam sincronizados em todo o cluster. Ao usar o Redis como provedor de estado compartilhado, o algoritmo Redlock é usado.

Para ativar o bloqueio de eventos, marque a opção Usar bloqueio ao criar ou modificar o evento. Isso ativará opções de bloqueio adicionais. O uso do bloqueio está disponível na tela de configuração do evento, clicando em Edge Case.

Cuidado

Tenha cuidado ao escolher se deseja bloquear um evento. A sincronização de eventos impacta negativamente o desempenho.

Bloquear Nomes

Os bloqueios de eventos são denominados bloqueios. O nome determina o escopo do bloqueio. Os eventos bloqueados que compartilham o mesmo nome serão sincronizados. Isso permite que os desenvolvedores sincronizem vários eventos. Por exemplo, os desenvolvedores podem sincronizar os eventos Insert, Update e Delete para uma determinada tabela. Eventos de tabelas diferentes podem até ser sincronizados entre si se compartilharem o mesmo nome.

Se o desenvolvedor não especificar um nome de bloqueio, um nome padrão será gerado em tempo de execução. O nome gerado depende se o evento é um evento em nível de tabela ou em nível de linha. Os eventos em nível de tabela incluem os eventos intrínsecos Filtro e Novo. Os eventos em nível de linha incluem os eventos intrínsecos Insert, Update e Delete, bem como eventos definidos pelo usuário.

Para eventos em nível de tabela, o escopo de nome padrão é o bloqueio da tabela. Bloquear o evento Filter da tabela, por exemplo, garante que apenas um evento Filter possa ser executado por vez para uma determinada tabela.

Para eventos em nível de linha, o escopo de nome padrão é o bloqueio de uma linha. Bloquear o evento Update da tabela, por exemplo, garante que apenas um evento Update possa ser executado por vez para uma determinada linha. Dois eventos Update podem ser executados simultaneamente para linhas diferentes na mesma tabela.

Como os nomes de bloqueio são globais, os desenvolvedores devem tomar cuidado para definir corretamente os nomes de bloqueio de namespace. Considere usar o seguinte padrão como linha de base ao nomear bloqueios:

data-source-name:table-name:event-name

Por exemplo:

Fulfillment:Orders:Ship

Cuidado

Se dois eventos compartilharem o mesmo nome de bloqueio, o Vinyl emitirá um aviso para evitar colisões acidentais.

Os nomes de bloqueio suportam interpolação de strings. A interpolação de string substitui valores da linha atual no nome do bloqueio. Normalmente, os valores da chave primária da linha são substituídos no nome para criar bloqueios com escopo de linha.

A sintaxe de interpolação de string é:

{{nome da coluna }}

Por exemplo, dado o seguinte nome de bloqueio:

Fulfillment:Orders:Ship:{{ OrderId}}

O nome do bloqueio de tempo de execução pode ser semelhante a este:

Fulfillment:Orders:Ship:1234

Expiração do Bloqueio

Normalmente, os bloqueios são mantidos até que o evento seja concluído, com êxito ou não. Se o evento não for concluído em tempo hábil, isso afetará a disponibilidade do sistema. Para atenuar isso, os bloqueios de eventos expiram. Se o evento não for concluído dentro do período de expiração, o bloqueio será liberado. Observe, no entanto, que o evento pode continuar a ser executado.

A expiração padrão é de 10 segundos. Os desenvolvedores podem alterar a validade conforme necessário. Deve-se ter cuidado com valores de vencimento mais altos.

Bloquear Espera

Os bloqueios são exclusivos: apenas um evento pode adquirir e manter um determinado bloqueio por vez. Outros eventos que tentam adquirir o bloqueio são enfileirados. Eles permanecerão na fila até adquirirem o bloqueio ou até que o período de espera do bloqueio tenha expirado.

A espera de bloqueio padrão é de 10 segundos. Os desenvolvedores podem alterar a espera conforme necessário. Se o vencimento for relativamente baixo, considere usar um valor igual ao vencimento. Se a expiração for alta, considere usar um valor baixo para o período de espera do bloqueio. Em outras palavras, se o bloqueio durar apenas alguns segundos, os usuários normalmente estarão dispostos a esperar que o bloqueio fique disponível. Se, por outro lado, o bloqueio durar um minuto ou mais, geralmente é preferível interromper a espera mais cedo e notificar o usuário.

Se o tempo limite de espera do bloqueio for atingido o usuário verá uma mensagem de alerta: "O evento foi cancelado":

Herança de Bloqueio

Eventos suportam herança. As validações e ações definidas em uma tabela física são herdadas por eventos de objetos de dados de mesmo nome. Os eventos também herdam a configuração de bloqueio. Se o evento Update da tabela física estiver bloqueado, o evento Update do objeto de dados também será bloqueado.

A herança de bloqueio também se aplica ao evento Save. O evento Save não é um evento de primeira classe. Em vez disso, suas validações e ações são mescladas nos eventos Insert e Update em tempo de execução. Isso permite que os desenvolvedores registrem uma regra uma vez e a apliquem tanto a inserções quanto a atualizações. Da mesma forma, bloquear o evento Save bloqueará os eventos Insert e Update.

O Vinyl sintetiza um evento Change em tempo de execução usando validações dos eventos Insert ou Update. O evento Change é executado quando um usuário modifica um valor de campo. Se o evento Insert ou Update estiver bloqueado, o evento Change também será bloqueado.