Akka-액터의 인스턴스를 몇 개 만들어야합니까?
저는 Akka 프레임 워크를 처음 접했고 Netty + Akka 위에 HTTP 서버 애플리케이션을 구축하고 있습니다.
지금까지 제 생각은 각 요청 유형에 대한 배우를 만드는 것입니다. 예를 들어 / my-resource에 대한 POST의 액터와 / my-resource에 대한 GET의 다른 액터가 있습니다.
내가 헷갈리는 부분은 배우 제작에 대해 어떻게해야할까요? 내가해야합니까:
모든 요청에 대해 새 액터를 생성합니까 (즉, 모든 요청에 대해 적절한 액터의 TypedActor.newInstance ()를 수행해야 함)? 새로운 배우를 만드는 데 얼마나 많은 비용이 듭니까?
서버 시작시 각 액터의 인스턴스를 하나씩 만들고 모든 요청에 해당 액터 인스턴스를 사용 하시겠습니까? 배우는 한 번에 하나의 메시지 만 처리 할 수 있다고 읽었는데 병목이 아닐까요?
다른 걸 해?
의견을 보내 주셔서 감사합니다.
음, 관리하려는 변경 가능한 상태의 각 인스턴스에 대해 액터를 만듭니다.
귀하의 경우, my-resource
단일 객체이고 각 요청을 직렬로 처리하려는 경우 하나의 액터 일 수 있습니다. 이렇게하면 수정 사이에 일관된 상태 만 반환 할 수 있습니다.
여러 리소스를 관리하는 경우 (가능성이 높음) 수천 개의 리소스를 사용하지 않는 한 리소스 인스턴스 당 하나의 액터가 일반적으로 이상적입니다. 요청 별 액터를 실행할 수도 있지만 해당 요청이 액세스하는 상태에 대해 생각하지 않으면 이상한 디자인으로 끝날 것입니다. 예를 들어 POST 요청 당 하나의 액터를 생성하는 경우 걱정할 것입니다. 같은 리소스를 동시에 수정하지 못하도록하는 방법은 액터를 잘못 정의했음을 분명하게 나타냅니다.
나는 보통 외부 시스템과의 통신을 추상화하는 것이 주 목적인 상당히 사소한 요청 / 응답 행위자를 가지고 있습니다. 그런 다음 "인스턴스"행위자와의 통신은 일반적으로 실제 작업을 수행하기위한 하나의 요청 / 응답 쌍으로 제한됩니다.
Akka를 사용하는 경우 요청별로 액터를 생성 할 수 있습니다. Akka는 리소스가 매우 적으며 매우 평범한 JVM 힙에 문자 그대로 수백만 명의 액터를 만들 수 있습니다. 또한 실제로 무언가를 할 때만 cpu / stack / threads를 소비합니다.
1 년 전에 스레드 기반 및 이벤트 기반 표준 액터의 리소스 소비를 비교했습니다 . 그리고 Akka는 이벤트 기반보다 훨씬 좋습니다.
제 생각에 Akka의 큰 요점 중 하나는 리소스 오버 헤드로 인해 이전 액터 시스템이 "공유 서비스에 액터 만 사용"하도록 강요했던 "사용 당 하나의 액터"로 시스템을 설계 할 수 있다는 것 입니다.
옵션 1로 이동하는 것이 좋습니다.
옵션 1) 또는 2)에는 두 가지 단점이 있습니다. 그러면 옵션 3) 라우팅 (Akka 2.0+)을 사용하겠습니다.
라우터는 로드 밸런서 역할을하는 요소로, 필요한 작업을 수행 할 다른 액터로 요청을 라우팅합니다.
Akka는 메시지를 라우팅하는 논리가 다른 여러 라우터 구현을 제공합니다 (예 : SmallestMailboxPool 또는 RoundRobinPool).
모든 라우터에는 여러 하위 항목이있을 수 있으며 해당 작업은 수신 된 메시지를 라우팅 할 위치를 추가로 결정하기 위해 사서함을 감독하는 것입니다.
//This will create 5 instances of the actor ExampleActor
//managed and supervised by a RoundRobinRouter
ActorRef roundRobinRouter = getContext().actorOf(
Props.create(ExampleActor.class).withRouter(new RoundRobinRouter(5)),"router");
이 절차는 이 블로그에 잘 설명되어 있습니다.
상당히 합리적인 옵션이지만 적합한 지 여부는 요청 처리의 세부 사항에 따라 다릅니다.
예, 물론 가능합니다.
대부분의 경우 최선의 방법은 모든 요청에 한 액터 만 응답하도록하는 것입니다 (또는 요청 유형 당 한 액터).하지만이 액터가하는 유일한 일은 작업을 다른 액터에게 전달하는 것입니다 (또는
Future
). 실제로 작업을 수행합니다.
직렬 요청 처리를 확장하기 위해 마스터 액터 ( Supervisor )를 추가 하면 작업자 액터 ( Children ) ( 라운드 로빈 방식 )에 위임됩니다 .
참고 URL : https://stackoverflow.com/questions/8113468/akka-how-many-instances-of-an-actor-should-you-create
'program story' 카테고리의 다른 글
PHP에서 HTML 양식 입력 기본값을 올바르게 이스케이프하는 방법은 무엇입니까? (0) | 2020.11.28 |
---|---|
아무것도 출력하지 않는 Python 로깅 (0) | 2020.11.28 |
MySQL : 저장 프로 시저 내의 트랜잭션 (0) | 2020.11.28 |
키가 존재하지 않는 맵의 값을 읽으면 어떻게됩니까? (0) | 2020.11.28 |
CSS를 사용하여 웹 양식의 특정 컨트롤 주위에 그룹 상자 만들기 (0) | 2020.11.28 |