/ / A melhor maneira de se comunicar entre o aplicativo ASP.NET e a função de trabalho - asp.net-mvc, wcf, azure, azure-worker-roles, azure-web-roles

A melhor maneira de se comunicar entre o aplicativo ASP.NET e a função de trabalho - asp.net-mvc, wcf, azure, azure-worker-roles e azure-web-roles

Eu tenho ambos os ASP.NET app e Worker Role configurado e agora eu me pergunto como eu me comunico entre eles? Eu acho que a ideia é que a solução será distribuída em diferentes localizações geográficas. Então, como faço para vincular o Worker e Web Roles distribuídos de uma maneira simples e eficiente? Eu comecei a olhar para o WCF, mas parece-me ser um exagero e supercomplicado. Outro pensamento que tive foi usar o cliente SignalR dentro das funções de trabalho para conversar com o servidor nas funções da Web.

EDITAR:

O contexto exato:

1) Usuário envia arquivos para o servidor

2) O servidor envia o arquivo para o Armazenamento do Azure e adiciona o nome do arquivo ao CloudQueue

3) Trabalhador obtém o nome do arquivo do CloudQueue

4) Worker inicia um novo Thread que obtém o arquivo do Armazenamento do Azure e inicia o processamento

5) Relatórios Worker / Thread de volta ao aplicativo em cada etapa do processamento do arquivo

6) O aplicativo recebe os relatórios e usa o SignalR para encaminhar as etapas de processamento para o navegador do cliente em tempo real.

O que eu sinto falta é nas etapas 2> 3, comonotificar imediatamente o trabalhador que um novo arquivo chegou? Não quero pesquisar o CloudQueue porque isso cria atrasos. Também nas etapas 5> 6, o Trabalhador precisa notificar o aplicativo sobre as etapas e isso deve ser feito sem demora, mas, novamente, não vejo como uma solução de pesquisa pode ser usada nesse caso.

Respostas:

1 para resposta № 1

Como dito acima, um pouco mais de contexto énecessário. Você basicamente tem duas opções principais, Filas do Windows Azure e Filas / Tópicos do Barramento de Serviço do Windows Azure. Meu conselho pessoal seria usar Azure filas se os papéis da Web e Worker são colocados na mesma região e Serviços filas de ônibus se eles não são. Eu teria que perguntar por que você não Colocando seu Web e Worker Roles juntos, se você tiver uma implantação geográfica de você aplicativo, em seguida, olhar para a implantação de todas as suas funções Web e Trabalho Roles em cada região, por exemplo, EUA, Europa e Ásia e, em seguida, use o Gerenciador de Tráfego para rotear o usuário para a região ideal.

Há uma boa postagem no blog sobre quando usar a fila "Filas do Windows Azure e Filas do Barramento de Serviço do Windows Azure - Comparadas e Contrastadas": http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

HTH

EDITAR

Uma boa abordagem para a comunicação entre Web e Worker Role está abaixo (eu roubei isso de um tópico recente que o @smarx respondeu)

1 Função da Web grava uma mensagem na fila que inclui um ID do trabalho.

2 Função de trabalho faz o trabalho e grava o resultado em uma tabela com chave de partição.

3 A função da Web é pesquisar essa linha da tabela. Uma vez que existe, a resposta volta.

No seu caso, você pode fazer com que a função de trabalho atualize o armazenamento de tabela com as atualizações de status e, em seguida, faça com que sua função da Web as pegue e exiba para o usuário. por exemplo. 20%, 50%, completo, etc ...

Eu realmente não vejo atrasos neste tipo de comunicação, contanto que você esteja pesquisando suficientemente a partir do Web Role (* note os custos de transação)

Eu presumo que algum tipo de comunicação InterRole possa ser feita aqui para atualizações de status, mas pode ser um IMO exagerado:

http://msdn.microsoft.com/en-us/library/windowsazure/hh180158.aspx


0 para resposta № 2

Eu recomendo dar uma olhada no CQRS, que significa Segregação de Responsabilidade por Consulta de Comando.

O objetivo dessa arquitetura é criar sistemas que sejam fracamente acoplados, extensíveis e escalonáveis.

http://cqrsjourney.github.com/

Greg Young inventou este sistema e há umnúmero de implementações de código aberto disponíveis para agilizar a construção de sistemas distribuídos e escalonáveis. Antes dele estava Bertrand Meyer, que preparou o terreno.

O conceito simplista é que uma série defilas separam papéis da web e funções de trabalho. Por isso, quando os usuários enviam trabalhos de uma função da Web, esse trabalho é enfileirado e depois é recolhido por uma função de trabalho. Um trade off é que há consistência de dados eventual, não consistência imediata. O benefício é que é fracamente acoplado e escalável. Se a fila começar a ficar muito grande, poderão ser adicionadas funções de trabalho adicionais para lidar com a escala adicional.

A abordagem usa conceitos como comandos, consultas e objetos de domínio. O CQRS está se tornando uma maneira extremamente poderosa de atingir as metas que eu acho que você está buscando.

Um mecanismo de pesquisa pode fornecer muitos recursos úteis. Aqui estão alguns vídeos úteis: Greg Young http://www.youtube.com/watch?v=KXqrBySgX-s Meu amigo rinat http://www.youtube.com/watch?v=CnvO_nlvrps

Boa sorte!


0 para resposta № 3

Eu usei o armazenamento da tabela azure como um lugar paracomunicar-se entre a função de trabalho e a função da web. Basicamente, a função Worker armazenará a mensagem / notificação na tabela azure e na função web terá um timer para verificar periodicamente as alterações na tabela azure. Depois disso, a função da Web usará o SignalR para enviar a mensagem para as páginas do cliente em tempo real para relatar o progresso.

Arquivo global.asax.cs:

private static System.Timers.Timer _timer;

protected void Application_Start()
{
//Start the timer job
_timer = new System.Timers.Timer(3000);
_timer.Elapsed += new ElapsedEventHandler(WebRoleTimerJob);
_timer.Start();
}


/// <summary>
/// This event will be fired intervally every 3 seconds to broadcast messsage to all registered client pages using SignalR
/// </summary>
public static void WebRoleTimerJob(object sender, ElapsedEventArgs e)
{
// Here, you can read Azure table storage to detect any changes
// or notification from Worker role
// ....

//If there is any changes, then broadcast message
// to all relevant client pages using SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<Hub>();
context.Clients.All.addNewMessageToPage("your_message_name", "message_content");
}