시스템에는 두 가지 유형의 메시지 유형 A와 B가 있습니다. 각 메시지는 다른 구조를가집니다. 유형 A에는 int 멤버가 포함되고 유형 B에는 이중 멤버가 포함됩니다. 내 시스템은 두 가지 유형의 메시지를 여러 비즈니스 로직 스레드에 전달해야합니다. 대기 시간을 줄이는 것은 매우 중요하므로 Disruptor를 사용하여 주 스레드에서 비즈니스 논리 스레드로 메시지를 기계적으로 전달할 수 있는지 조사하고 있습니다.여러 메시지 유형으로 장애 처리자를 사용하는 방법
내 문제는 disruptor가 링 버퍼에있는 한 유형의 개체 만 허용한다는 것입니다. 이것은 disruptor가 링 버퍼의 객체를 미리 할당하기 때문에 의미가 있습니다. 그러나 Disruptor를 통해 비즈니스 로직 스레드에 두 가지 유형의 메시지를 전달하는 것도 어렵습니다.
구성 교란이 (로 How should one use Disruptor (Disruptor Pattern) to build real-world message systems?에 의해 권장) 고정 된 크기의 바이트 배열을 포함하는 객체를 사용하기 : 내가 말할 수있는 건, 내가 네 가지 옵션이 있습니다. 이 경우 주 스레드는 메시지를 중단 장치에 게시하기 전에 바이트 배열로 인코딩해야하며 각 비즈니스 논리 스레드는 수신시 바이트 배열을 개체로 다시 디코딩해야합니다. 이 설정의 단점은 비즈니스 로직 스레드가 실제로 중단 장치에서 메모리를 공유하지 않는다는 것입니다. 대신 중단 장치가 제공 한 바이트 배열에서 새 개체를 만들어서 가비지를 만듭니다. 이 설정의 장점은 모든 비즈니스 로직 스레드가 동일한 장애 요인으로부터 여러 유형의 메시지를 읽을 수 있다는 것입니다.
단일 유형의 개체를 사용하지만 개의 장애가 인을 각 개체 유형에 대해 하나씩 생성하도록 방해자를 구성하십시오. 위의 경우에는 A 유형의 객체와 B 유형의 객체에 대해 각각 두 개의 분리 된 분리자가 있습니다.이 설정의 위쪽은 기본 스레드가 객체를 바이트 배열로 인코딩 할 필요가 없으며 비즈니스 논리가 낮은 쓰레드는 장애가 (쓰레기가 생성되지 않음)에서 사용 된 것과 동일한 객체를 공유 할 수 있습니다. 이 설정의 단점은 어떻게 든 각각의 비즈니스 로직 스레드가 여러 가지 장애가의 메시지를 구독해야한다는 것입니다.
모두 메시지 A의 모든 필드를 포함하고 B.이 매우 OO 스타일의 반대 "슈퍼"개체의 단일 유형을 사용하도록 교란을 구성하지만, 옵션 # 1과 # 절충이 가능합니다 2.
개체 참조을 사용하도록 장애 조치를 구성하십시오. 그러나이 경우 객체 사전 할당 및 메모리 정렬의 성능 이점을 잃게됩니다.
이 상황에 대해 무엇을 권하고 싶습니까? 옵션 # 2가 가장 깨끗한 솔루션이라고 생각하지만 소비자가 여러 가지 혼란으로부터 오는 메시지를 기술적으로 구독 할 수 있는지 여부와 그 방법을 알지 못합니다. 누구나 옵션 # 2를 구현하는 방법에 대한 예제를 제공 할 수 있다면 크게 감사하겠습니다!
마이클 바커는 스럽 Google 그룹 내 질문에 대답 게시 할 수 있습니다. 아래에서 그의 답변을 확인하십시오. https://groups.google.com/d/msg/lmax-disruptor/clUkJaFMsZg/54fKplz21MwJ –
질문에 대한 답변이 여기에있는 답변으로 변환하고 해당 답변을 수락 된 것으로 표시하는 것이 좋습니다. – cic