대부분의 미들웨어 API는 SdvResult 객체를 반환합니다. 성공하면 이 객체에 예상 결과 객체가 포함됩니다. 실패 시 이 객체에는 예상치 못한 동작이나 오류 상태를 나타내는 SdvStatus 객체가 포함됩니다. 오류 상태는 Internal, Unavailable, DataLoss과 같은 오류 코드로 식별되는 경우가 많습니다.
이 페이지는 이러한 오류 코드를 해결하는 데 도움이 됩니다.
등록 및 생성 실패 문제 해결
등록 및 생성 실패는 일반적으로 잘못된 서비스를 만들거나 등록하려고 할 때 발생합니다.
두 번째 서비스를 만들 수 없음
오류:
오류 Internal개가 있습니다.
원인:
정확히 동일한 서비스 번들 인스턴스 (이름 및 인스턴스 ID)를 두 번 등록하려고 하고 있습니다.
해결
정확히 동일한 서비스 번들 인스턴스 (이름 및 인스턴스 ID)를 두 번 등록하려고 시도하지 마세요.
중복 서비스 번들을 삭제할 수 없음
오류:
Status(-3, EX_ILLEGAL_ARGUMENT)
원인:
존재하지 않는 중복 서비스 번들을 삭제하려고 합니다.
해결
존재하지 않는 중복 서비스 번들을 삭제하려고 하지 마세요.
메시지 전송을 위한 게시자 인스턴스를 가져올 수 없음
오류:
take_publisher() 호출은 none를 반환합니다.
원인:
동일한 서비스 번들 인스턴스에서 동일한 변형에 대해 take_publisher()를 두 번 호출했습니다.
해결
동일한 서비스 번들 인스턴스에서 동일한 변형에 대해 take_publisher()를 두 번 호출하지 마세요.
Subscriber, Observer, History 또는 InstantReader를 만들 수 없음
오류:
오류 Unavailable개가 있습니다.
원인:
존재하지 않거나 등록이 취소된 게시자의 Subscriber, Observer, History 또는 InstantReader를 만들려고 했습니다.
해결
게시자의 Subscriber, Observer, History 또는 InstantReader를 만들기 전에 게시자가 있는지 또는 등록되어 있는지 확인하세요.
RPC 클라이언트를 만들 수 없음
오류:
Unavailable 오류
원인:
존재하지 않거나 등록되지 않은 서버 단위 이름의 RPC 클라이언트를 만들려고 했습니다.
해결
RPC 클라이언트를 만들기 전에 서버가 존재하고 등록되었는지 확인합니다.
통신 실패 문제 해결
서비스가 실행되고 다른 서비스와 통신하기 시작한 후 통신 오류가 발생할 수 있습니다.
게시자 등록 해제 문제 해결
게시자가 리더가 아직 활성 상태인 동안 등록 해제하면 오류가 발생할 수 있습니다.
구독자의 read_next_messages()가 빈 목록을 반환함
오류:
read_next_messages()는 성공하지만 빈 목록을 반환합니다.
원인:
독자가 활성 상태인 동안 게시자가 등록 취소됩니다.
해결
가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 등록 해제되고 새 메시지가 없습니다.
관찰자의 next()가 내부 오류를 반환함
오류:
next()에서 Internal 오류를 반환합니다.
원인:
독자가 활성 상태인 동안 게시자가 등록 취소됩니다.
해결
가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.
기록의 read_from_history()가 새 메시지를 반환하지 않음
오류:
read_from_history()는 새 메시지를 반환하지 않고 이전 메시지만 반환합니다.
원인:
독자가 활성 상태인 동안 게시자가 등록 취소됩니다.
해결
가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.
InstantReader read_latest_message()가 내부 오류를 반환함
오류:
read_latest_message()에서 Internal 오류를 반환합니다.
원인:
독자가 활성 상태인 동안 게시자가 등록 취소됩니다.
해결
가용성 스트림과 함께 구독자 또는 기록을 사용합니다. 가용성 스트림의 마지막 메시지를 사용할 수 없는 경우 게시자가 사라졌으며 새 메시지가 없습니다.
빈 메시지 대기열 문제 해결
빈 메시지 대기열에서 읽으려고 하면 오류가 발생할 수 있습니다.
구독자의 read_next_messages()가 빈 목록을 반환함
오류:
read_next_messages()이 빈 목록을 반환합니다.
원인:
게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.
해결
재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.
관찰자의 next()가 내부 오류를 반환함
오류:
next()에서 Internal 오류를 반환합니다.
원인:
게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.
해결
재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.
기록의 read_from_history()가 새 메시지를 반환하지 않음
오류:
read_from_history()이 빈 목록을 반환합니다.
원인:
게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.
해결
재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.
InstantReader read_latest_message()가 내부 오류를 반환함
오류:
read_latest_message()에서 Internal 오류를 반환합니다.
원인:
게시자가 활성 상태이지만 메시지를 전송하지 않았습니다.
해결
재고 스트림이 있는 구독자 또는 기록을 사용합니다. 재고 스트림의 마지막 메시지를 사용할 수 있는 경우 게시자가 활성 상태이며 새 메시지가 없습니다.
버퍼 오버플로 또는 데이터 손실 문제 해결
게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송하면 오류가 발생할 수 있습니다.
오버플로 후 구독자의 첫 번째 읽기에서 DataLoss 오류가 반환됨
오류:
read_next_message()에서 DataLoss 오류를 반환합니다.
원인:
게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.
해결
오버플로 후 옵저버의 첫 번째 next()가 DataLoss 오류를 반환함
오류:
next()에서 DataLoss 오류를 반환합니다.
원인:
게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.
해결 방법: 가능한 해결 방법은 다음과 같습니다.
게시자가 더 느린 속도로 게시합니다. 예를 들어 최신 메시지의 타임스탬프가 있는 변수가 있을 수 있습니다. 현재 시간이 최신 게시 시간 + 델타보다 작으면 메시지를 게시하지 않습니다. 이 메커니즘을 사용하면 델타당 최대 하나의 메시지가 게시됩니다.
소비자가 관찰자 대신
InstantRead객체를 사용합니다.InstantRead객체는 오버플로 오류를 반환하지 않으며 항상 마지막 메시지를 반환합니다. 마지막 메시지만 중요한 경우 관찰자 대신InstantRead객체를 사용할 수 있습니다.소비자가 샘플링을 구현합니다. 관찰자 (O1)가 메시지를 읽을 수 있는 속도보다 더 빠르게 메시지를 게시하는 게시자 (P1)가 솔루션에 있는 경우 게시 및 읽기 속도의 차이를 수용하기 위해 새 게시자 (P2)와 관찰자 (O2)를 만들 수 있습니다.
예를 들어 P1이 10ms마다 메시지를 게시하지만 O1은 100ms마다 하나의 메시지만 읽을 수 있고 나머지 9개 메시지는 삭제한다고 가정해 보겠습니다. 불일치를 해결하려면 다음 단계에 따라 솔루션을 만드세요.
- P1이 O2에 메시지를 게시합니다.
- O2는 메시지 하나를 읽고 9개를 삭제합니다.
- O2가 하나의 읽은 메시지를 P2에 전송합니다.
- P2가 O1에 하나의 읽음 메시지를 전송합니다.
- O1은 10초마다 메시지 하나를 읽습니다.
다음 예시 코드는 이 샘플링 시나리오를 구현하는 방법을 보여줍니다.
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
기록의 읽기가 불완전함
오류:
기록 복사 전에 메시지가 손실됩니다. 읽기 시 직접 오류 알림이 없습니다.
원인:
게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.
해결
InstantReader가 마지막 메시지만 읽음
오류:
기록 복사 전에 메시지가 손실됩니다. 읽기 시 직접 오류 알림이 없습니다.
원인:
게시자가 리더가 소비할 수 있는 것보다 빠른 속도로 메시지를 전송합니다.
해결
해당 사항 없음
RPC 클라이언트가 메서드를 호출했지만 메서드를 사용할 수 없음
오류:
Unavailable 오류와 함께 메서드 호출이 실패합니다.
원인:
SDV는 서버 이름을 알지 못하므로 Unavailable를 반환합니다. 서비스 검색에서 유효한 서버 이름을 반환하지 않으면 이 오류가 미들웨어에 의해 반환됩니다.
해결
클라이언트가 사용하려는 지정된 인터페이스의 server를 정의하는 서비스 번들을 시작합니다.
서버 측 구현에서 SdvStatus 오류가 반환됨
오류:
서버 측 구현은 SdvStatusCode::NotFound와 같은 SdvStatus 오류가 포함된 SdvResult를 반환합니다. 오류는 호출 클라이언트에 다시 전파됩니다.
원인:
SDV와 클라이언트-서버 간 통신 시스템은 예상대로 작동하지만 클라이언트가 서버에서 오류를 트리거하는 요청을 했습니다.
해결
클라이언트로 유효한 요청을 하거나 서버를 수정하여 이러한 요청에 성공적으로 응답하세요.