大多數中介軟體 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 毫秒只能讀取一則訊息,並捨棄其餘九則訊息。如要解決差異,請按照下列步驟建立解決方案:
- P1 將訊息發布至 O2。
- O2 讀取一則訊息,並捨棄九則。
- O2 將讀取的一則訊息傳送給 P2。
- P2 將讀取訊息傳送給 O1。
- 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 和用戶端與伺服器之間的通訊系統正常運作,但用戶端提出的要求在伺服器中觸發錯誤。
修正:
請使用用戶端提出有效要求,或修正伺服器,以便成功回應這些要求。