OOM을 피하기 위해 일부 Akka 1.1.3 액터의 사서함 크기를 공유 사용자 지정 디스패처로 제한합니다. 예를 들어 : (: actor.stop()
가, 잠깐 것처럼 슬프게 보이고, actor.start()
는 ActorStartException
가 발생합니다 보조 노트를) 내가 좋아하는 것 핸들 Akka 액터 바운드 사서함 MessageQueueAppendFailedException
object Static {
val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher(
"customDispatcher",
1000,
BoundedMailbox(capacity = 10)
)
}
class MyActor extends Actor {
self.dispatcher = Static.dispatcher
...
}
그래서 나는 메시지 상류 생산자 일시 중지 할 수 있습니다 넘쳐 사서함에 반응합니다. 대기열 채우기와 대기열 배출 사이에는 약간의 데이터 손실이 허용됩니다.
는
Dispatchers에 Akka의 장 메시지를 내 사서함 에 추가 할 수없는 경우 ("BlockingMessageTransferQueue이 전송 시간 초과")
그것이 MessageQueueAppendFailedException을 던질 것이다 액터에 메시지를 보내려고 할 때 말한다 pushTimeout에 의해 지정된 시간.
어디에서이 예외를 잡을 수 있습니까?
모든 myActor ! message
을 try/catch로 랩핑해야하는 것처럼 문서화하면 소리가납니다. 그게 맞습니까? 나는 정말로 그 취급을 중앙 집중시키고 싶다. 내 Supervisor
아마 그것을 가로 채고 내 처리기를 실행할 수 있습니까?
검사의 목적은 무엇입니까? –
이것이 특정 사례에 적용되는지 확신 할 수 없지만 사서함이 넘칠 위험이있는 상황에 처한 경우 소비자 행동가가 생산자가 아닌 생산자에게 작업을 요청하는 "풀"디자인을 고려할 수 있습니다 귀하의 소비자를 스팸. –
@Viktor 그것은 특히 소비자를 일시 중지하기 위해 업스트림 조치를 취하는 것입니다 (이 질문에이를 추가 할 것입니다). 댄이 맞아요, 그리고 당연히 끌어 당기는 모델을 고려할 것입니다. 그러나 지금은 거의 재구성하지 않고이 작업을 수행하고 싶습니다. 데이터 손실은 용납됩니다. – Bluu