2014-05-20 2 views
3

메소드를 비 차단으로 유지하면서 메소드가 과도하게 호출되지 않도록 Java에서 가장 좋은 방법은 무엇입니까?Java : 과도하게 호출되는 메소드의 디자인 패턴

내 usecase는 오디오 데이터 용 사용자 지정 버퍼입니다. 데이터를 폴링 할 수있는 버퍼의 메소드는 비 블로킹 (non-blocking)이어야하며, 데이터가 사용 가능하지 않을 때 메소드가 null을 리턴하는 것이 허용 가능합니다. 메서드가 블로킹되는 것은 용납되지 않으므로 동기화하는 것을 원하지 않습니다. 메서드를 지나치게 호출하면 음질이 떨어집니다. 그렇다면 호출자가 스스로 행동하지 않고도 과부하로 메소드를 보호하려면 어떻게해야합니까?

+2

충분히 문서화하지 않았습니까? 겉보기에 임의의 빈도로 제한하는 대신 몇 가지 지침을 설정하십시오. –

+0

위키 피 디아에서 토큰 버킷 찾아보기 –

+0

'일시 중지'설정과 함께 일종의 캐싱 메커니즘을 사용할 수 있습니다. EHCACHE,하지만 .. 지붕 아래 - 실제 코드와 비슷하게 작동합니다. –

답변

1

당신이 "java design pattern"을 물었 기 때문에 스레드 폴링 폴링이 다소 안티 패턴이라고 말할 수 있습니다. 일반적으로는 아니지만 실제로는 톤이 아닙니다.

나는 그것을 보았을 때 거의 항상 호출자가 자신의 통화 속도를 제한했다. 발신자가 음질을 좋게 유지하는 데 관심을 갖고 있으며 CPU를 위험에 빠뜨리고 싶지는 않습니다. 방법을 문서화하고 발신자에게 맡길 수 있습니까?

그러나 귀하의 질문에 답하기 위해 저는 책임을 뒤집을 것이고 소비자가 귀하의 버퍼에 의해 일정 (3ms ??)을 먹는 콜백을 등록하게 할 것입니다. 따라서 소비자가 당기지 않고 생산자가 푸시합니다.

초기 "반응성 스트림"사양 (http://www.reactive-streams.org/)은이를 구현하고 소비자가 처리 할 수있는 항목 수를 생산자에게 요청해야하며 생산자가 사용 가능할 때 피드를 제공해야합니다.

https://github.com/reactive-streams/reactive-streams/blob/master/api/src/main/java/org/reactivestreams/Subscription.java

이 직접 적용되지이다하더라도, 그것은 당신에게 몇 가지 아이디어를 줄 수도 있습니다.

행운을 비네.

+0

설명하는 알림 모델은 우리가 원하는 구현 유형입니다 이 스레드의 범위를 벗어나는 이유 때문에 제거하십시오. 호출자에게 공통된 관심이 있다는 것에 동의하지만, "제대로 작동하는"견고한 구현을 제공하라는 요청을 받았기 때문에 문서에 의존하지 않아도됩니다. 어쨌든, 나는 당신의 포스트에서 내가 사용해야 할 분명한 디자인 패턴을 놓치고 있지 않다는 것을 모았습니다. 그래서 나는 이것을 받아 들인 것으로 표시합니다. 어쨌든 도움을 주신 모든 분들께 감사드립니다 ... – edr

0

는 자바 NIO 프레임 워크를 사용할 수 있습니다 ...

내 현재의 접근 방식은 마지막 여론 조사의 타임 스탬프를 기억하고 짧은은 3ms의보다 전에의 경우는 null를 반환하는 것입니다, 그러나 이것은 "해키"조금 느낌 이리?

조금 더 많은 정보가 도움이 될 것입니다. 데이터에 관심이있는 사람이 어디에서 왔는지 ...

즉 네트워크에서 데이터가 도착하면 버퍼에 데이터를 채울 수 있습니다 (일부 종류의 LRU 맵과 부품에 대한 시간 정보 포함) 데이터를 필요로하는 작업은 버퍼를 읽을 수 있습니까?

+0

ConcurrentLinkedQueue에서 데이터를 가져오고 ConcurrentLinkedQueue는 또 다른 대기열에서 가져온 변환 된 데이터로 공급됩니다. 그래서 이것은 당신이 묘사하고있는 것과 거의 같습니다. 유일한 질문은 데이터를 필요로하는 작업에서이 디자인을 보호 할 수있는 방법입니다. – edr

+0

그래서 한 스레드가 데이터를 쓰고 다른 스레드가 그것을 읽는 설정이 있습니다. 데이터에 의하면 ByteBuffers, 바이트 배열을 의미합니까? –

+0

ByteBuffers 경우 일반 배열을 큐에 추가하고 소비자가 자신의 ByteBuffer로 래핑하는 것이 좋습니다. (잘 모르겠지만 문제를 해결하지 않음) –

3

ConcurrentLinkedQueue이 바로 그 것입니다. 비 블로킹이며 사용할 수있는 메시지가 없으면 null을 반환합니다. 어느 쪽이든 ConcurrentLinkedDequeue

+0

버퍼에서 ConcurrentLinked Queue를 사용하고 있는데, 실제로 공용 폴링 메서드가 호출 될 때 해당 큐에서 폴링 만하고 있지만 오디오 품질에 영향을 줄 수있는 것 같습니다. 3ms 해결 방법을 사용하면 결과가 훨씬 좋습니다. – edr

+0

CLQ가 충분하지 않거나 가장 유용한 옵션 atm이고 다른 것이있을 것이라고 기대하고있었습니다. –

+0

CLQ는 잘 작동하고 현재 솔루션이 작동합니다. 적용 할 수있는 더 똑똑하고 좋은 패턴이 있는지 궁금합니다. – edr