상태 비저장 작업자 조직

기본적으로 Orleans 런타임은 클러스터 내에서 조직 활성화를 1회 이상 만들지 않습니다. 고유한 형식/ID를 가진 엔터티에 해당하는 각 조직을 사용하는 Virtual Actor 모델의 가장 직관적인 식입니다. 그러나 애플리케이션이 시스템의 특정 엔터티에 연결되지 않은 기능적인 상태 비정상 작업을 수행해야 하는 경우도 있습니다. 예를 들어 클라이언트가 처리를 위해 대상 조직으로 라우팅되기 전에 압축 해제해야 하는 압축된 페이로드가 있는 요청을 보내는 경우 이러한 압축 해제/라우팅 논리는 애플리케이션의 특정 엔터티에 연결되지 않으며 쉽게 스케일 아웃할 수 있습니다.

StatelessWorkerAttribute가 조직 클래스에 적용되는 경우 해당 클래스의 조직을 상태 비저장 작업자 조직으로 처리해야 함을 Orleans 런타임에 나타냅니다. 상태 비저장 작업자 조직에는 일반 조직 클래스의 실행과 매우 다른 실행을 만드는 다음과 같은 속성이 있습니다.

  1. Orleans 런타임은 클러스터의 다른 사일로에 상태 비저장 작업자 조직을 여러 개 활성화를 만들 수 있습니다.
  2. 상태 비저장 작업자 조직에 대한 요청은 사일로가 호환되는 한 로컬로 실행되므로 네트워킹 또는 직렬화 비용이 발생하지 않습니다. 로컬 사일로가 호환되지 않는 경우 요청은 호환되는 사일로로 전달됩니다.
  3. Orleans 런타임은 이미 사용 중인 상태 비저장 작업자 조직의 추가 활성화를 자동으로 만듭니다. 선택적 maxLocalWorkers 인수로 명시적으로 지정하지 않는 한 런타임에서 사일로당 만드는 상태 비저장 작업자 조직의 최대 활성화 수는 기본적으로 컴퓨터의 CPU 코어 수로 제한됩니다.
  4. 2와 3으로 인해 상태 비저장 작업자 조직 활성화는 개별적으로 주소를 지정하지 않습니다. 상태 비저장 작업자 조직에 대한 두 개의 후속 요청은 서로 다른 활성화에 의해 처리될 수 있습니다.

상태 비저장 작업자 조직은 실제 부하에 따라 자동으로 스케일 업 및 다운되는 자동 관리형 조직 활성화 풀을 만드는 간단한 방법을 제공합니다. 런타임은 항상 동일한 순서로 사용 가능한 상태 비저장 작업자 조직 활성화를 검색합니다. 따라서 항상 찾을 수 있는 첫 번째 유휴 로컬 활성화에 요청을 디스패치하고 이전의 모든 활성화가 사용 중인 경우에만 마지막 활성화에 도달합니다. 모든 활성화가 사용 중이고 활성화 제한에 도달하지 않은 경우 목록 끝에 하나 이상의 활성화를 만들고 요청을 디스패치합니다. 즉, 상태 비저장 작업자 조직에 대한 요청 속도가 증가하고 기존 활성화가 모두 현재 사용 중인 경우 런타임은 활성화 풀을 한도까지 확장합니다. 반대로, 부하가 감소하고 상태 비저장 작업자 조직의 더 적은 수의 활성화로 처리될 수 있는 경우 목록의 맨 뒤에 있는 활성화는 요청이 디스패치되지 않습니다. 유휴 상태가 되고 결국 표준 활성화 수집 프로세스에 의해 비활성화됩니다. 따라서 활성화 풀은 결국 부하에 맞게 축소됩니다.

다음 예제에서는 기본 최대 활성화 수 제한을 사용하여 상태 비저장 작업자 조직 클래스 MyStatelessWorkerGrain을 정의합니다.

[StatelessWorker]
public class MyStatelessWorkerGrain : Grain, IMyStatelessWorkerGrain
{
    // ...
}

상태 비저장 작업자 조직을 호출하는 것은 다른 조직과 동일합니다. 유일한 차이점은 대부분의 경우 단일 조직 ID(예: 0 또는 Guid.Empty)가 사용된다는 것입니다. 상태 비저장 작업자 조직 풀이 여러 개 있는 경우 여러 조직 ID를 사용할 수 있습니다. ID당 하나씩 사용하는 것이 좋습니다.

var worker = GrainFactory.GetGrain<IMyStatelessWorkerGrain>(0);
await worker.Process(args);

이는 사일로당 하나의 조직만 활성화되는 상태 비저장 작업자 조직 클래스를 정의합니다.

[StatelessWorker(1)] // max 1 activation per silo
public class MyLonelyWorkerGrain : ILonelyWorkerGrain
{
    //...
}

StatelessWorkerAttribute는 대상 조직 클래스의 재진입을 변경하지 않습니다. 다른 조직과 마찬가지로 상태 비저장 작업자 조직은 기본적으로 재진입되지 않습니다. 조직 클래스에 ReentrantAttribute를 추가하여 명시적으로 재진입할 수 있습니다.

State(상태)

"상태 비저장 작업자"의 "상태 비저장" 부분은 상태 비저장 작업자가 상태를 가질 수 없다는 것을 의미하지 않으며 기능 작업을 실행하는 것으로만 제한됩니다. 다른 조직과 마찬가지로 상태 비저장 작업자 조직은 필요한 상태를 로드하고 메모리에 유지할 수 있습니다. 상태 비저장 작업자 조직의 여러 활성화를 클러스터의 동일하고 다른 사일로에서 만들 수 있기 때문에 다른 활성화에 의해 유지되는 상태를 조정하는 쉬운 메커니즘은 없습니다.

몇 가지 유용한 패턴에는 상태 비저장 작업자 유지 상태가 포함됩니다.

핫 캐시 항목 확장

처리량이 높은 핫 캐시 항목의 경우 이러한 각 항목을 상태 비저장 작업자 조직으로 보관하면 다음과 같이 됩니다.

  1. 사일로 내 및 클러스터의 모든 사일로에서 자동으로 스케일 아웃 및
  2. 클라이언트 게이트웨이를 통해 클라이언트 요청을 받은 사일로에서 데이터를 항상 로컬로 사용할 수 있도록 하여 다른 사일로에 대한 추가 네트워크 홉 없이 요청에 응답할 수 있습니다.

스타일 집계 줄이기

일부 시나리오에서 애플리케이션은 클러스터에 있는 특정 유형의 모든 조직에서 특정 메트릭을 계산하고 집계를 주기적으로 보고해야 합니다. 예를 들어 게임 맵당 여러 플레이어, VoIP 통화의 평균 지속 시간 등을 보고합니다. 수천 또는 수백만 개의 조직이 각각 메트릭을 단일 글로벌 집계자에 보고하는 경우 집계자는 즉시 오버로드되어 쇄도하는 보고서를 처리할 수 없게 됩니다. 다른 방식은 스타일 집계를 줄이기 위해 이 작업을 2단계(또는 그 이상)로 전환하는 것입니다. 집계의 첫 번째 계층은 상태 비저장 작업자 사전 집계 조직으로 메트릭을 보내는 조직을 보고하여 수행됩니다. Orleans 런타임은 각 사일로를 사용하여 상태 비저장 작업자 조직의 여러 활성화를 자동으로 만듭니다. 이러한 모든 호출은 원격 호출이나 메시지 serialization 없이 로컬로 처리되므로 이러한 집계 비용은 원격 사례보다 훨씬 적습니다. 이제 각 사전 집계 상태 비저장 작업자 조직 활성화는 독립적으로 또는 다른 로컬 활성화와 조정하여 집계된 보고서를 오버로드하지 않고 전역 최종 집계자(또는 필요한 경우 다른 감소 계층)로 보낼 수 있습니다.