2016-08-09 5 views
1

AtLeastOnceDelivery 영속 액터를 사용하고 있습니다. 우리는 엄청난 양의 확인되지 않은 메시지를 받고 있으며,이 수가 너무 클 경우 OutOfMemoryError가 발생합니다.Akka Persistence - AtLeastOnceDelivery : 메모리가 부족한 상태에서 확인되지 않은 메시지를 무제한으로 가져 오는 방법

확인되지 않은 메시지가 확인 될 때까지 메모리에 보관하지 않고 디스크에 미확인 메시지를 보관하도록 AtLeastOnceDelivery 액터를 구성 할 수있는 방법이 있습니까?

또는이 제한 사항을 해결하는 AtLeastOnceDelivery 대안이 있습니까?

+0

우리는 미확인 메시지 설정의 최대 개수로 놀아 보았습니다. 이 값을 줄이면 OutOfMemoryError가 발생하지 않지만 후속 메시지가 삭제됩니다. 우리는 확인되지 않은 메시지가 메모리에 저장되지 않지만 메시지 손실없이 파일로 계속 플러시되는 솔루션을 원합니다. –

답변

0

AtLeastOnceDelivery 특성을 디스크에 계속 저장하고 정보를 메모리에 저장하지 않을 수는 없습니다. AtLeastOnceDelivery은 퍼시스턴셜 액터와 비슷한 의미를 따르며, 전달 가능한 메시지는 Akka 퍼시스턴스 백엔드에 백업되고 빠른 액세스를 위해 메모리에 보관됩니다. 메모리 내 저장소는 hardcoded to the trait입니다.

범위 내에서 메모리 사용량을 유지하는 데 문제가 있다면 아마도 그 이유와 해결 방법을 조사해야합니다. 메모리가 부족한 배우가 메시지 전달에 대한 응답을 충분히 빨리 얻지 못하고 따라서 배달 가능한 작업이 계속 늘어나고있는 것 같습니다.

메시지 처리 속도를 높일 수있는 몇 가지 트릭이 있습니다. 메시지 처리의 개별 구성 요소를 더 빠르게 최적화하도록 시도하거나 Router actor과 같은 기술을 사용하여 메시지 처리를 병렬 처리 할 수 ​​있습니다. 그러나 때로는 이러한 트릭으로 처리 속도를 충분히 높일 수 없을 수도 있습니다. 즉 처리를 위해 메시지가 액터로 전달되는 방식을 제어해야 할 때가 있습니다.

대신 액터가 들어오는 모든 메시지를 수락하는 대신 make the actor pull the work 수 있습니다. 이 패턴을 구현할 수있는 방법에는 여러 가지가 있지만 공통된 전제가 있습니다. 즉, 모든 메시지를 액터에 직접 덤핑하는 대신 데이터베이스 (또는 방대한 양의 데이터를 처리 할 수있는 메시지)에 저장 한 다음 worker 액터는 저장된 메시지를 최대한 빨리 가져 와서 작업합니다. 패턴에 대한 많은 상용 솔루션이 있다고 생각하지 않으므로 직접 솔루션을 구현하는 데 약간의 작업을해야 할 것입니다.

+0

@Jaako 답변 해 주셔서 감사합니다. 당신은 당신이 만든 많은 포인트에 집중하고 있습니다. 어떻게 든 작업이나 역압을 당기는 메커니즘을 구현해야하는 것처럼 보입니다. –