Controlar acesso a arquivos entre o serviço e o servidor da Web

2

Eu tenho um aplicativo da web e um serviço do windows que acessam o mesmo conjunto de arquivos. Eu uso um semáforo nomeado para impedir que ele acesse as informações ao mesmo tempo (solicitações de serviço ou servidor da Web para ter acesso ao diretório, usá-lo rapidamente, libera o semáforo).

Eu quero executar este aplicativo no Windows Azure. Eu acho que usando uma máquina virtual seria legal porque então eu posso usar um semáforo nomeado para controlar o acesso e, em seguida, executar o servidor da Web e o serviço do Windows na VM. A questão é que a Máquina Virtual parece ser do tipo limitada no espaço . Eu preciso usar muito mais armazenamento do que o que é oferecido para máquinas virtuais. Eu também estaria perdendo o armazenamento geograficamente redundante.

É possível, no Windows Azure, ter um semáforo nomeado compartilhado entre um serviço em nuvem e um site? Talvez eu precise de um serviço separado que tenha acesso exclusivo a esses arquivos e se comunique com o serviço e o site? Isso seria ruim ter que programar outro serviço e gastar o dinheiro extra por mês nele. Existe uma maneira melhor?

Editar (mais informações):

  • O dimensionamento é definitivamente necessário. Haverá uma grande quantidade de dados armazenados e eu estou preocupada que ele irá terceirizar a VM no futuro.
  • Eles não são arquivos de banco de dados. Eles são arquivos individuais com um diretório separado que possui muitos índices diferentes. Estou preocupado com o serviço do windows e o servidor da web tentando acessar o mesmo índice ao mesmo tempo (embora seja uma ocorrência rara).
  • Acredito que um blob de armazenamento funcionaria bem nesse caso.
  • Um blob de locação não seria bom. 15 segundos é muito longo para esperar.

O que eu acho que vou fazer:

Provavelmente, terei uma VM executando o serviço do Windows mencionado acima e um serviço extra que não faz nada além de "gerenciar bloqueios" nos índices e arquivos específicos que estão localizados em um blob. Então ... o servidor web ou o serviço windows solicitará um "bloqueio" deste serviço. Dessa forma, o aplicativo pode trabalhar diretamente com os arquivos e levará menos tempo de desenvolvimento para isso.

Editar 2:

Ou talvez eu possa colocar tudo em uma VM, usar um semáforo nomeado e acessar os blobs de armazenamento (provavelmente a melhor opção por enquanto)

    
por dhsto 15.08.2013 / 02:54

1 resposta

2

Esta pergunta é um pouco aberta, pois há muitas maneiras de resolver potencialmente esse problema. Pensando no Azure especificamente:

  • Ter um serviço extra não significa necessariamente gastar dinheiro extra. Você pode executar seu serviço em sua (s) máquina (s) virtual (is) existente (s). Você pode configurar sua camada de serviço para ser executada de forma serial, garantindo que não haja duas solicitações que tentem acessar arquivos ao mesmo tempo.
  • Em relação ao espaço limitado: Onde você está armazenando seus arquivos? Se você colocá-los no disco do sistema operacional, isso não vai ultrapassar o tamanho do disco do sistema operacional (cerca de 127 GB). Se você anexar um disco, terá até 1 TB, e poderá ter 2 discos anexados por núcleo, até 16 discos anexados (16 GB de armazenamento anexado) no total.
  • Se você armazenar arquivos em um sistema de arquivos (no disco do sistema operacional ou no disco conectado), haverá problemas para dimensionar além de uma máquina virtual, a menos que você tenha uma máquina virtual separada executando seu serviço e gerenciando o armazenamento. Ainda assim, você não poderá escalar além de uma Máquina Virtual de "serviço". Para o Windows Azure, você deve considerar o armazenamento de arquivos nos Blobs de Armazenamento do Azure. Depois de fazer isso, você tem a capacidade de acessar seu armazenamento a partir de qualquer número de máquinas virtuais (o que significa que você pode dimensionar sua camada de serviço).
  • Acompanhamento do marcador anterior: não tenho ideia do tipo de arquivo que você está acessando. Se esses arquivos forem banco de dados , minha ideia de usar blobs não seria prática.
  • Para acesso exclusivo em várias máquinas, você precisa do seu próprio esquema mutex; não há nenhuma construção de semáforo no Azure que abranja máquinas / serviços. Embora os blobs tenham concessões , não acho que isso seja eficiente para um cenário de alta transação. No entanto: imagine que você faça fila para solicitações específicas e, em seguida, faça com que os leitores de fila processem solicitações específicas. Isso eliminaria sua contenção de objeto?
  • Um último pensamento: a menos que você esteja usando o Linux, você não precisa necessariamente usar máquinas virtuais. Também é possível observar os serviços em nuvem (funções da Web / de trabalho), pois são máquinas virtuais do Windows Server sem monitoração de estado e com muito mais flexibilidade com o dimensionamento.
por 15.08.2013 / 04:19

Tags