排解中介軟體 API 失敗問題

大多數中介軟體 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 錯誤。

原因:

發布端在讀取端處於啟用狀態時取消註冊。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息無法使用,表示發布者已消失,且沒有新訊息。

History 的 read_from_history 不會傳回新訊息

錯誤:

read_from_history 不會傳回任何新訊息,只會傳回舊訊息。

原因:

發布端在讀取端處於啟用狀態時取消註冊。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息無法使用,表示發布者已消失,且沒有新訊息。

InstantReader read_latest_message 傳回內部錯誤

錯誤:

read_latest_message 傳回 Internal 錯誤。

原因:

發布端在讀取端處於啟用狀態時取消註冊。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息無法使用,表示發布者已消失,且沒有新訊息。

疑難排解訊息佇列空白的問題

嘗試讀取空白訊息佇列時,可能會發生錯誤。

訂閱者的 read_next_messages 傳回空白清單

錯誤:

read_next_messages 成功傳回空白清單。

原因:

發布者處於活躍狀態,但尚未傳送訊息。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息可用,表示發布商處於啟用狀態,且沒有新訊息。

觀察器的 next 傳回內部錯誤

錯誤:

next 傳回 Internal 錯誤。

原因:

發布者處於活躍狀態,但尚未傳送訊息。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息可用,表示發布商處於啟用狀態,且沒有新訊息。

History 的 read_from_history 不會傳回新訊息

錯誤:

read_from_history 成功傳回空白清單。

原因:

發布者處於活躍狀態,但尚未傳送訊息。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息可用,表示發布商處於啟用狀態,且沒有新訊息。

InstantReader read_latest_message 傳回內部錯誤

錯誤:

read_latest_message 傳回 Internal 錯誤。

原因:

發布者處於活躍狀態,但尚未傳送訊息。

修正:

請搭配使用訂閱者或記錄與可用性串流。如果可用性串流的最後一則訊息可用,表示發布商處於啟用狀態,且沒有新訊息。

排解緩衝區溢位或資料遺失問題

如果發布者傳送訊息的速度快於讀取者處理訊息的速度,就可能發生錯誤。

訂閱者在溢位後首次讀取時,會傳回 DataLoss 錯誤

錯誤:

read_next_messages 傳回 DataLoss 錯誤。

原因:

發布者傳送訊息的速度比讀取者取用訊息的速度快。

修正:

可能的修正方式如下:

  • 在 VSIDL 架構定義中增加發布者環形緩衝區 capacity,讓佇列在訂閱者讀取訊息前,能吸收訊息爆量。
  • 提高訂閱者取用訊息的頻率,或降低發布者訊息速率。
  • 如果服務只需要最新的訊息值,不需要處理每個中間更新,請使用 InstantReader,而非 Subscriber。

觀察者在溢位後的第一個 next 會傳回 DataLoss 錯誤

錯誤:

next 傳回 DataLoss 錯誤。

原因:

發布者傳送訊息的速度比讀取者取用訊息的速度快。

修正:

可能的修正方式如下:

  • 發布者發布訊息的速度較慢。例如,您可能有一個變數,其中包含最新訊息的時間戳記。如果目前時間小於最新發布時間加上差異值,則不發布訊息。使用這項機制時,每個差異最多會發布一則訊息。

  • Consumer 使用 InstantRead 物件,而非觀察器。InstantRead 物件不會傳回溢位錯誤,且一律會傳回最後一則訊息。如果只有最後一則訊息對您重要,則可以使用 InstantRead 物件,而非觀察器。

  • 消費者會實作取樣。如果解決方案中的發布者 (P1) 發布訊息的速度快於觀察者 (01) 讀取訊息的速度,您可以建立新的發布者 (P2) 和觀察者 (02),以因應發布和讀取速度的差異。

    舉例來說,假設 P1 每 10 毫秒發布一則訊息,但 O1 每 100 毫秒只能讀取一則訊息,並捨棄其餘九則訊息。如要解決差異,請按照下列步驟建立解決方案:

    1. P1 將訊息發布至 O2。
    2. O2 讀取一則訊息,並捨棄九則。
    3. O2 將讀取的一則訊息傳送給 P2。
    4. P2 將讀取訊息傳送給 O1。
    5. O1 每十秒讀取一則訊息。

    以下程式碼範例說明如何實作這個取樣情境:

    int discarded_message = 10;
    
    while (true) {
    message m = O2.read_message();
    if discarded_message == 10 {
      discarded_message = 0;
      P2.publish(m);
    } else {
     discarded_message ++;
    }
    }
    

記錄讀取不完整

錯誤:

在複製記錄前,訊息已遺失。讀取時不會直接收到錯誤通知。

原因:

發布者傳送訊息的速度比讀取者取用訊息的速度快。

修正:

可能的修正方式如下:

  • 在 VSIDL 架構定義中增加發布者環形緩衝區 capacity,讓 History 保留足夠的近期訊息,供讀者輪詢間隔使用。
  • 更頻繁地從 History 讀取,或降低發布者傳送訊息的頻率。

InstantReader 只會讀取最後一則訊息

錯誤:

在複製記錄前,訊息已遺失。讀取時不會直接收到錯誤通知。

原因:

發布者傳送訊息的速度比讀取者取用訊息的速度快。

修正:

不適用

RPC 用戶端呼叫方法,但方法無法使用

錯誤:

方法呼叫失敗,並顯示 Unavailable 錯誤。

原因:

SDV 不知道伺服器名稱,並傳回 Unavailable。如果服務探索未傳回有效的伺服器名稱,中介軟體就會傳回這項錯誤。

修正:

啟動服務套件,為用戶端要使用的指定介面定義 server。

伺服器端導入作業傳回 SdvStatus 錯誤

錯誤:

伺服器端實作會傳回包含 SdvStatus 錯誤的 SdvResult,例如 SdvStatusCode::NotFound。錯誤會傳回呼叫用戶端。

原因:

SDV 和用戶端與伺服器之間的通訊系統正常運作,但用戶端提出的要求在伺服器中觸發錯誤。

修正:

請使用用戶端提出有效要求,或修正伺服器,以便成功回應這些要求。