- Java JDK 17
- Mysql: 8.0.36
-
Aplicação que simula o consumo de eventos de uma fila. Porém, sem broker (kafka, RabbitMQ), sem SQS, SNS. Apenas fazendo uso do bom e velho banco de dados relacional. https://dev.mysql.com/blog-archive/mysql-8-0-1-using-skip-locked-and-nowait-to-handle-hot-rows/
-
Usei uma estratégia que alguns bancos de dados como PostegreSQL, Oracle e Mysql oferecem suporte, chamada de FOR UPDATE E SKIP LOCKED. Basicamente, é possível informar as duas cláusulas durante a execução de um filtro no banco de dados:
De modo geral, qualquer consulta com FOR UPDATE
trava explicitamente as linhas afetadas pela consulta durante uma transação. Isso impede que outras transações modifiquem essas linhas até que a transação que as bloqueou seja concluída.
Enquanto que o SKIP LOCKED
permite que uma consulta ignore linhas que estão bloqueadas por outras transações.
É possível testar da seguinte forma: cadastrar 20 ou mais ordens através do endpoint: http://localhost:8089/api/order/create
, com o seguinte corpo:
{
"name": "Carregador",
"amount": 70
}
Em seguida, chamar o endpoint http://localhost:8089/api/order/process
e verificar as ordens com status
atualizado.
Em resumo, uma das transações obtém o lock da linha em questão e continua em busca da próxima linha que ainda não obteve lock. Assim, cada transação retorna 10 resultados das respectivas linhas que não estavam com skip locked fornecido por outra transação.