Quais são os casos em que o enfileiramento avançado da Oracle é o mecanismo preferencial para implementar os requisitos funcionais? Por exemplo, a transferência de dinheiro da conta bancária A para a conta bancária B pode teoricamente ser considerada como duas operações diferentes e pode ser implementada separadamente - primeiro, enfileirar a transferência de dinheiro da conta A (atualizar) e depois enfileirar a transferência de dinheiro para a conta B (atualizar) . No entanto, é óbvio que não pode ser feito assim porque essas duas operações devem ser feitas em uma operação consistente - na transação.
Talvez o enfileiramento avançado deva ser considerado apenas ao desenvolver procedimentos/funções armazenados que executam alguma lógica que é feita internamente (fazendo operações DML e chamando outro proc/fnc armazenado local) e externamente (chamando alguns webservices). Ao usar essas chamadas para webservices, não podemos envolver tudo em uma transação consistente, então a única maneira é usar algum mecanismo de enfileiramento ...
Quaisquer exemplos detalhados da vida real seriam apreciados.
O que estou curioso não são os detalhes da tecnologia em si, mas sim quais são os casos reais de uso dessas mensagens, porque nunca fiz isso antes. Tipo, por que preciso passar alguns dados (carga útil da mensagem)?
Não estou tão familiarizado com o Oracle como estou com o Postgres. No entanto, vou lhe dizer onde vejo abordagens de enfileiramento como esta como ideais (como o autor de pg_message_queue ): permitir que transações de banco de dados tenham efeitos colaterais não transacionais com custo mínimo de complexidade. Um exemplo simples é "quando realizamos uma transação dizendo que enviamos uma peça, vamos enviar um e-mail notificando o cliente".
Você poderia fazer isso sem o Oracle AQ, mas o Oracle AQ provavelmente tornará isso mais simples. O fator chave é que isso permite que você enfileira a mensagem de forma que fique visível no commit e tenha a mensagem que será a base de um email assim que a transação do banco de dados for confirmada e não antes. Se você tentar enviar a mensagem de dentro da transação, receberá vários casos de falha desagradáveis:
Outro exemplo pode ser aplicativos fracamente acoplados, integrados em uma fila de mensagens. Cada aplicativo pode ser executado sem conhecimento do outro, mas quando as transações são confirmadas, as mensagens são enviadas para o outro. Se eles não puderem ser entregues imediatamente, não há problema. Vamos processá-los quando pudermos.
Portanto, o básico é que há muitos casos em que você deseja centralizar a lógica em torno do banco de dados, onde não pode realmente fazer tudo corretamente em uma única transação. Ser capaz de enviar mensagens para outros componentes no db commit é realmente útil.
E com certeza você poderia construir tudo sozinho sem AQ. Mas isso já foi construído para você.
Edit: Eu reli os documentos da Oracle aqui e eles são irremediavelmente confusos, então não o culpo por sua confusão aqui. Se eu já não estivesse um pouco familiarizado com os tipos de coisas sobre as quais eles estavam falando, não tenho certeza se seria capaz de segui-los. Agora tenho 100% de certeza de que minha resposta está no alvo.
Eu uso AQ para
Usando uma fila, você pode fazer estas coisas:
Aqui estão mais informações sobre como eu uso AQ entre bancos de dados. Eu não sou um especialista e peguei a maior parte do código da Internet. A documentação do Oracle é longa, mas realmente não me ajudou.
Primeiro crie a fila:
No banco de dados de origem:
A ação é reconhecidamente grosseira, mas versátil. Os requisitos eram afunilar as alterações de várias tabelas para outro banco de dados onde era necessário processamento adicional sem tocar no código do aplicativo. Uma chamada típica é para um pacote de um gatilho, outro procedimento ou trabalho.
Dentro do pacote
--e tirando mensagens da fila
Eu certamente escreveria isso de forma diferente hoje, mas funciona... O principal problema com o AQ para mim é que eu nunca recebi mensagens de fila para fila entre bancos de dados diferentes. Isso foi descrito como um valor primário para ele. No entanto, ainda gosto de ter a certeza de que a transação inicial pode ser concluída sem levar em consideração o estado do banco de dados de destino. Se a mensagem não for inserida no banco de dados de destino, um erro será registrado e um e-mail será enviado notificando o desenvolvedor.
Na vida real, o AQ pode ser usado para enviar notificações aos clientes quando uma ação específica é executada no banco de dados.
Considere um exemplo em que um usuário solicitou a compra de um item. Assim que o pagamento for recebido, um pedido será criado preenchendo a fila com os detalhes. Essa fila terá assinantes para o dono da loja e os aplicativos de mensagens de pagamento.
Assim, o assinante 1, ou seja, o dono da loja (qualquer notificação a ser enviada ao dono da loja) escolherá a mensagem sobre o item a ser enviado. e outro assinante preparará a notificação sobre o item adquirido, portanto, neste caso, uma vez que a mensagem seja processada pelo assinante, o pedido é marcado como concluído e a mensagem da fila é removida.
Se durante o processamento do pedido ocorrer algum erro, uma entrada será marcada na fila de exceção e as mensagens da fila de exceção poderão ser processadas posteriormente.
Você pode usar o Oracle AQ para vários exemplos da vida real, como usamos -
Depende do requisito dos aplicativos da Web e do propósito de usar o Advanced Queueing.
Acho que existem alternativas como comparar o timestamp que inicia a consulta e, portanto, verificar a prioridade da consulta de transação a ser executada primeiro.