다음을 통해 공유


조직 ID

Orleans의 각 그레인에는 두 부분으로 구성된 고유한 단일 사용자 정의 식별자가 있습니다.

  1. 그레인 형식은 이름이며, 이 이름은 그레인 클래스를 고유하게 식별합니다.
  2. 해당 그레인 클래스의 논리적 인스턴스를 고유하게 식별하는 그레인 .

그레인 형식과 키는 모두 Orleans에서 사람이 읽을 수 있는 문자열로 표시되며 규칙에 따라 그레인 ID는 / 문자로 구분된 그레인 형식과 키로 작성됩니다. 예를 들어 shoppingcart/bob65(은)는 키 bob65를 사용해 shoppingcart(으)로 명명된 그레인 형식을 나타냅니다.

그레인 ID를 직접 생성하는 것은 일반적이지 않습니다. 대신 Orleans.IGrainFactory(을)를 사용하여 그레인 참조를 만드는 것이 더 일반적입니다.

다음 섹션에서는 그레인 형식 이름 및 그레인 키에 대해 자세히 설명합니다.

그레인 형식 이름

Orleans(은)는 클래스 이름에서 접미사 "Grain"을 제거하고 결과 문자열을 소문자 표현으로 변환하여 그레인 구현 클래스를 기반으로 하는 그레인 형식 이름을 만듭니다. 예를 들어 ShoppingCartGrain 클래스에는 shoppingcart 그레인 형식 이름이 지정됩니다. 그레인 형식 이름과 키는 알파 숫자(a-z, A-Z0-9) 문자와 -, _, @, = 등의 기호와 같은 인쇄 가능한 문자로만 구성하는 것이 좋습니다. 다른 문자는 지원되거나 지원되지 않을 수 있으며 로그에 인쇄되거나 데이터베이스와 같은 다른 시스템에서 식별자로 표시될 때 특별한 처리가 필요한 경우가 많습니다.

또는 Orleans.GrainTypeAttribute 특성을 사용하여 다음 예제와 같이 연결된 그레인 클래스의 그레인 형식 이름을 사용자 지정할 수 있습니다.

[GrainType("cart")]
public class ShoppingCartGrain : IShoppingCartGrain
{
    // Add your grain implementation here
}

앞의 예제에서 ShoppingCartGrain 그레인 클래스에는 cart 그레인 형식 이름이 있습니다. 각 조직은 하나의 그레인 형식 이름만 가질 수 있습니다.

제네릭 그레인의 경우 제네릭 arity가 그레인 형식 이름에 포함되어야 합니다. 예를 들어 다음 DictionaryGrain<K, V> 클래스를 고려합니다.

[GrainType("dict`2")]
public class DictionaryGrain<K, V> : IDictionaryGrain<K, V>
{
    // Add your grain implementation here
}

그레인 클래스에는 두 개의 제네릭 매개 변수가 있으므로 제네릭 arity 뒤에 ` 백틱(2)이 그레인 형식 이름의 끝에 추가되고, dict 그레인 클래스의 특성에 지정된 대로 dict`2인 그레인 형식 이름만듭니다.

그레인 키

편의를 위해 Orleans(은)는 String에 더해 Guid 또는 Int64에서 그레인 키를 생성할 수 있도록 하는 메서드를 노출합니다. 기본 키의 범위는 조직 형식으로 지정됩니다. 따라서 조직의 전체 ID는 조직의 형식과 해당 키에서 형성됩니다.

조직의 호출자는 사용해야 하는 체계를 결정합니다. 옵션은 다음과 같습니다.

기본 데이터는 동일하기 때문에 스키마를 서로 바꿔서 사용할 수 있습니다. 모두 문자열로 인코딩됩니다.

싱글톤 그레인 인스턴스가 필요한 상황에서는 "default"같은 잘 알려진 고정 값을 사용할 수 있습니다. 이것은 단지 규칙일 뿐이지만 이 규칙을 준수하면 호출자 사이트에서 싱글톤 그레인이 사용되고 있음을 분명히 알 수 있습니다.

GUID(Globally Unique Identifier)를 키로 사용

System.Guid(은)는 작업 처리 시스템에서 새 작업을 만들 때와 같이 임의성 및 전역 고유성이 필요한 경우 유용한 키를 만듭니다. 키 할당을 조정할 필요가 없으므로 시스템에서 단일 실패 지점 또는 리소스에 대한 시스템 쪽 잠금을 도입하여 병목 상태를 표시할 수 있습니다. GUID가 충돌할 가능성이 매우 낮기 때문에 임의 식별자를 할당해야 하는 시스템을 설계할 때 일반적인 선택입니다.

클라이언트 코드에서 GUID로 조직 참조:

var grain = grainFactory.GetGrain<IExample>(Guid.NewGuid());

조직 코드에서 기본 키 검색:

public override Task OnActivateAsync()
{
    Guid primaryKey = this.GetPrimaryKey();
    return base.OnActivateAsync();
}

정수를 키로 사용

정수(Long)도 사용할 수 있습니다. 이는 GUID보다 숫자 인덱스가 선호되는 관계형 데이터베이스에 조직이 유지되는 경우에 의미가 있습니다.

클라이언트 코드에서 정수(Long)로 조직 참조:

var grain = grainFactory.GetGrain<IExample>(1);

조직 코드에서 기본 키 검색:

public override Task OnActivateAsync()
{
    long primaryKey = this.GetPrimaryKeyLong();
    return base.OnActivateAsync();
}

문자열을 키로 사용

문자열도 사용할 수 있습니다.

클라이언트 코드에서 문자열로 조직 참조:

var grain = grainFactory.GetGrain<IExample>("myGrainKey");

조직 코드에서 기본 키 검색:

public override Task OnActivateAsync()
{
    string primaryKey = this.GetPrimaryKeyString();
    return base.OnActivateAsync();
}

복합 키 사용

GUID나 long과 잘 맞지 않는 시스템이라면 GUID 또는 long과 문자열의 조합을 사용하여 조직을 참조할 수 있는 복합 기본 키를 선택할 수 있습니다.

다음과 같이 IGrainWithGuidCompoundKey 또는 IGrainWithIntegerCompoundKey 인터페이스에서 인터페이스를 상속할 수 있습니다.

public interface IExampleGrain : Orleans.IGrainWithIntegerCompoundKey
{
    Task Hello();
}

클라이언트 코드에서 다음과 같이 조직 팩터리의 IGrainFactory.GetGrain 메서드에 두 번째 인수가 추가됩니다.

var grain = grainFactory.GetGrain<IExample>(0, "a string!", null);

조직의 복합 키에 액세스하기 위해 GrainExtensions.GetPrimaryKey 메서드(GrainExtensions.GetPrimaryKeyLong)에 대한 오버로드를 호출할 수 있습니다.

public class ExampleGrain : Orleans.Grain, IExampleGrain
{
    public Task Hello()
    {
        long primaryKey = this.GetPrimaryKeyLong(out string keyExtension);
        Console.WriteLine($"Hello from {keyExtension}");

        Task.CompletedTask;
    }
}

그레인이 논리 식별자를 사용하는 이유

.NET과 같은 개체 지향 환경에서 개체의 ID는 개체에 대한 참조와 구별하기 어렵습니다. new 키워드를 사용하여 개체를 만들 때 다시 가져오는 참조는 개체를 나타내는 일부 외부 엔터티에 매핑하는 요소를 제외하고 해당 ID의 모든 측면을 나타냅니다. Orleans(은)는 분산 시스템을 위해 설계되었습니다. 분산 시스템에서 개체 참조는 단일 프로세스의 주소 공간으로 제한되므로 인스턴스 ID를 나타낼 수 없습니다. Orleans(은)는 논리 식별자를 사용하여 이 제한을 방지합니다. 그레인 참조는 프로세스 수명 동안 유효하게 유지되고 한 프로세스에서 다른 프로세스로 이식할 수 있도록 논리 식별자를 사용하므로 동일한 엔터티인 참조가 만들어진 그레인을 계속 참조하는 동안 네트워크를 통해 저장 및 나중에 검색되거나 네트워크를 통해 애플리케이션의 다른 프로세스로 전송될 수 있습니다.