2011-12-19 1 views
2

Hy,Java : Disruptor 또는 Not를 사용하십시오. .

현재 amq 대기열에서 2 개의 값을 가져 와서 일련의 수학적 계산을 수행하는 프로그램을 개발 중입니다. 내 프로그램이 콜백 (청취자)을 통해 메시지를 수신하고 수신하는 amq 서버에 주제가 작성되었습니다.

이제 메시지가 도착할 때마다 두 값이 SynchronizedDescriptiveStatistics 개체에서 가져와 추가됩니다. 값 목록에 추가 된 후 계산의 전체 시퀀스가 ​​다시 수행됩니다 (이것은 실제로 요구 사항의 일부입니다).

현재 직면하고있는 문제는 청취자를 사용하고 있기 때문에 때로는 하나 이상의 메시지가 계산 중간에 수신된다는 것입니다. SynchronizedDescriptiveStatistics는 모든 스레드 관련 문제를 처리하지만 자체적으로 문제는 없지만 잠긴 값이 나올 때 모든 대기중인 값을 한 번에 숫자 목록에 추가합니다. 내 문제는 하나의 값을 추가 한 다음 그것에 calcls를 수행 한 다음 두 번째 값을 반복하는 것이 었습니다.

제가 생각해 낸 해결책은 프로그램 (amq 대기열이 아님)에서 작업 대기열을 사용하는 것입니다. 이런 식으로 계산이 끝날 때마다 프로그램은 대기열에서 더 많은 작업을 찾아 그에 따라 진행합니다.

효율성과 속도를 찾고 있기 때문에 Disruptor 프레임 워크가이 문제에 유용 할 수 있으며 스레드 된 상황에 최적화되어 있다고 생각했습니다. 그러나 정규 표준 대기열로 인해 수행하려는 작업에 충분하기 때문에 Disruptor를 구현할 때 문제가되는지 잘 모르겠습니다.

계산을 수행해야하는 데이터가 많이 있고 계속오고 있으며 전체 계산은 하나의 값을 한 번 더 추가 할 때마다 다시 수행해야합니다. 지속적인 패션. 그러므로 효율성과 엄청난 양의 데이터를 염두에 두는 것이 장기적으로 유용 할 것이라고 생각하는 것입니다.

답장을 기다리는 중입니다. . .

감사합니다.

답변

12

이 질문에 대한 일반적인 답변을 드리겠습니다. 먼저 테스트를하고 결과에 따라 결정하십시오.

효율성에 대해 이야기했지만 성능이 기본 요구 사항이라고 구체적으로 말하지는 않습니다. 성능 요구 사항에 대한 아이디어가있는 경우 대기열을 사용하는 간단한 프로토 타입과 Disruptor의 기본 구현을 조롱하고 두 가지 성능 모두를 측정 할 수 있습니다.

하나가 다른 것보다 훨씬 좋게 나오면 그 대답입니다. 그러나 구현하려는 노력이 훨씬 더 많은 경우, 특히 필요한 효율성을 제공하지 못하거나 어려운 성능 요구 사항이없는 경우 솔루션은 올바른 것이 아님을 나타냅니다.

먼저 측정하고 결과에 따라 결정하십시오.