2012-11-08 3 views
0

Windows Azure 용으로 개발 된 ASP.NET 응용 프로그램이 있습니다. 응용 프로그램이 매우 쓰기 쉽기 때문에 DB에 대해 샤딩을 사용하여 쓰기 시간을 향상시켜야하지만 데이터를 쉽게 분리해야한다는 생각이 들었습니다. 그러나 모든 인스턴스에서 몇 가지 중앙 변수를 추적해야하며 해당 정보를 저장할 최적의 위치가 확실하지 않습니다. 내 옵션은 무엇입니까?샤르드 환경에서 중앙 집중식 값을 관리하는 방법

요구 사항 :

  • 는, 내구성이해야 인스턴스가
  • 가 동기화되어야합니다 재부팅 살아남을 수 있습니다. 이러한 경우 업데이트를 충돌 시키거나 적어도 예외를 던지려면 값을 덮어 쓰거나 자동으로 실패하는 것이 중요합니다.
  • 는 2000 + 읽기/I 단순히/메모리의 값을 기록 읽고 모든 너무 디스크에 플러시 작업자 역할을 실행하는 별도의 구성 요소를 작성하는 생각 두 번째

당 쓰기 (합리적으로 빠른이어야합니다 자주하지만, 그 목적을 위해 이미 Windows Azure에서 사용할 수있는 용도로 작성된 것이 있어야한다고 생각합니다.

내가 찾고있는 것은 Apache ZooKeeper와 같은 시스템이지만 생각하고 싶지는 않습니다. 작업자 역할을 시작할 때 JRE를 설치하고 모든 재즈를 다루십시오.

Ed 이 : 아래의 제안, 나는 다음과 같은 코드를 사용하여 푸른 표 스토리지를 사용하기 위해 노력하고있어 기준 자료 : 그러나

var context = table.ServiceClient.GetTableServiceContext(); 
var item = context.CreateQuery<OfferDataItemTableEntity>(table.Name) 
    .Where(x => x.PartitionKey == Name).FirstOrDefault(); 

if (item == null) 
{ 
    item = new OfferDataItemTableEntity(Name); 
    context.AddObject(table.Name, item); 
}      

if (item.Allocated < Quantity) 
{ 
    allocated = ++item.Allocated; 
    context.UpdateObject(item); 
    context.SaveChanges(); 
    return true; 
} 

을의 context.UpdateObject(item) 호출 The context is not currently tracking the entity.가 추가 처음 항목에 대한 컨텍스트를 쿼리하지 않습니다 실패 컨텍스트 추적 메커니즘?

답변

0

는 당신이 필요로하는 Table Storage입니다 그것은 모든 요구 사항과 일치하기 때문에 : 여기

읽을 몇 가지 링크입니다

  • Durabl e : 예, 테이블 스토리지는 특정 클라우드 서비스 또는 인스턴스와 관련이없는 스토리지 계정의 일부입니다.
  • 동기화 됨 : 예, 테이블 저장소는 특정 클라우드 서비스 또는 인스턴스와 관련이없는 저장소 계정의 일부입니다.
    • 그것은 업데이트 충돌을 피하기 위해 매우 중요합니다 : 예,이 ETag를
  • 합리적으로 빠른의 사용으로 가능하다?매우 빠른, up to 20,000 entities/messages/blobs per second

업데이트 : 여기

이 새로운 스토리지 SDK (2.0)를 사용하는 몇 가지 예제 코드입니다 :

var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; 
var table = storageAccount.CreateCloudTableClient() 
          .GetTableReference("Records"); 
table.CreateIfNotExists(); 

// Add item. 
table.Execute(TableOperation.Insert(new MyEntity() { PartitionKey = "", RowKey ="123456", Customer = "Sandrino" })); 

var user1record = table.Execute(TableOperation.Retrieve<MyEntity>("", "123456")).Result as MyEntity; 
var user2record = table.Execute(TableOperation.Retrieve<MyEntity>("", "123456")).Result as MyEntity; 

user1record.Customer = "Steve"; 
table.Execute(TableOperation.Replace(user1record)); 

user2record.Customer = "John"; 
table.Execute(TableOperation.Replace(user2record)); 
  1. 첫째는 항목을 추가를 123456
  2. 그런 다음 동일한 레코드를 얻는 2 명의 사용자를 시뮬레이션 중입니다. 둘 다 레코드를 표시하는 페이지를 열었다 고 가정합니다.
  3. 사용자 1이 빠르며 항목을 업데이트합니다. 이 작동합니다.
  4. 사용자 2는 여전히 창이 열렸습니다. 이것은 그가 아이템의 구버전에서 작업하고 있다는 것을 의미합니다. 그는 이전 항목을 업데이트하고 저장하려고 시도합니다.

The remote server returned an error: (412) Precondition Failed.

+0

내 요구 사항은 엔티티가 이전 값이 예상 값과 일치 할 경우에만 업데이트 할 수 있도록하는 것입니다 (낙관적 잠금, 즉 '엔티티 업데이트 = 엔티티 = 값'. 테이블 스토리지로 수행 할 수 있습니까? 내가 할 수있는 웹 주위에 힌트를 보았지만 구체적인 예는 없습니다 ... – Chris

+0

예, ETag를 사용할 수 있습니다. 새 SDK를 사용하면 매우 쉽게 만들 수 있습니다. –

+0

내가 제안한대로 할려고하는데, 하지만 오류가 발생했습니다. 위의 편집을 참조하십시오. – Chris

0

내가 하이브리드 캐시/테이블 스토리지 솔루션 결국이 다음과 같은 예외합니다 (SDK가있는 ETag를 일치하기 때문에이 가능)을 발생합니다. 모든 인스턴스는 Azure 캐싱을 통해 변수를 추적하며, 첫 번째 인스턴스는 값을 테이블 저장 영역에 초당 한 번 저장하는 타이머를 가동합니다. 시작할 때 캐시 변수는 사용 가능한 경우 테이블 스토리지에 저장된 값으로 초기화됩니다.

관련 문제