Pergunta

Preciso enfileirar eventos e tarefas para sistemas externos de maneira confiável/transacional.Usar coisas como MSMQ ou ActiveMQ parece muito sedutor, mas a parte transacional fica complicada (MSDTC, etc).

Poderíamos usar o banco de dados (SQL Server 2005+, Oracle 9+) e obter suporte transacional mais fácil, mas a parte das filas fica mais feia.

Nenhuma das rotas parece tão boa e está repleta de dicas desagradáveis ​​​​e casos extremos.

Alguém pode oferecer alguma orientação prática neste assunto?

Pensar:E/C/A ou um mecanismo de tarefas agendadas que é ativado de vez em quando e verifica se há alguma tarefa agendada que precisa ser executada neste momento (ou seja,a data da próxima execução já passou, mas a data de expiração ainda não foi atingida).

Foi útil?

Solução

nosso sistema possui 60 computadores, cada um executando 12 tarefas (threads) que precisam "obter o próximo trabalho".Ao todo, são 50 mil “empregos” por dia.faça as contas de quantas transações por minuto e perceba que o tempo da tarefa é variável, portanto é possível obter vários eventos "pop" exatamente ao mesmo tempo.

Tivemos nossa primeira versão usando MSMQ.conclusão: ficar longe.Embora tenha funcionado bem com os problemas de carregamento e sincronização, ele teve 2 problemas.um irritante e outro que quebra o negócio.

Chato: como software corporativo, o MSMQ tem necessidades de segurança que apenas o tornam mais uma coisa para configurar e lutar com o administrador de rede do cliente.

Empecilho: então chegou o momento em que queríamos fazer o próximo trabalho, mas não usando um simples pop, mas algo como "obter o próximo trabalho AZUL" ou "obter o próximo trabalho AMARELO".não posso fazer isso!

Fomos para o plano B:Implementamos nosso próprio Q com uma única tabela SQL 2005. não poderia estar mais feliz

Enfatizei testá-lo com 200 mil mensagens por dia, funcionou.Podemos tornar a lógica do “próximo” tão complicada quanto quisermos.

A pegada:você precisa ter muito cuidado com o SQL que pega o próximo item.Já que você quer que seja rápido e SEM travamento.existem 2 SQL muito importantes dicas usamos com base em algumas pesquisas.A magia é mais ou menos assim:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

Outras dicas

Eu vi o MSMQ usado transacionalmente e não parecia particularmente complicado - um Transaction SCope agrupava as chamadas de enfileiramento ou desenfileiramento junto com o acesso ao banco de dados e tudo estava bem, desde que a fila fosse definida como transacional depois de criada.Não acho que isso seja verdade com o ActiveMQ, que é um corretor de mensagens, mas o MSMQ é instalado localmente em cada máquina endpoint, portanto, colocar um item transacionalmente na fila não requer uma transação distribuída sofisticada.

Você provavelmente já está ciente disso, mas no .NET existem algumas bibliotecas leves que fornecem algumas abstrações interessantes sobre o MSMQ (e, teoricamente, outros transportes também)

nServiceBus: www.nservicebus.com

Trânsito de massa: http://code.google.com/p/masstransit/

Além disso, Oren Eini tem uma fila transacional interessante, embora experimental, baseada em sistema de arquivos.O benefício dessa biblioteca é que, diferentemente do MSMQ, ela pode ser implantada como uma biblioteca e não requer a dor de cabeça de manutenção da implantação do MSMQ.

Você pode ler sobre isso aqui: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

Além disso, o SQL Server 2005 lida com o enfileiramento de maneira bastante elegante, usando o SQL Server Service Broker, mas você precisará do SQL Server instalado em cada endpoint e não sei se o SSB atravessa o firewall.

Finalmente, se você não obtiver a resposta que procura aqui, recomendo fortemente o fórum de discussão nSErviceBus.Udi Dahan responde a esses tipos de perguntas junto com seu pequeno grupo de seguidores orientados a mensagens, e é o melhor recurso que encontrei até agora para obter respostas rápidas e competentes às minhas perguntas orientadas a filas.Esse fórum está aqui: http://tech.groups.yahoo.com/group/nservicebus/

Quartzo.Net é um sistema de agendamento de tarefas de código aberto.

É para isso que o MSMQ foi projetado - enfileirar transações.Se isso não funcionar para você, verifique o recurso "Service Broker" do SQL Server - é a "fila em uma tabela SQL" que 'csmba' descreve em sua resposta, mas é um componente integrado do SQL Server, bem embalado e exposto para seu uso.

O WebSphere MQ (Série MQ) é uma opção?Suporta mensagens transacionais.

Você pode ver o recurso Oracle chamado Enfileiramento Avançado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top