執行管線
Spine 在寫出 HTTP 回應之前完成業務執行、回應準備和可失敗的提交階段。v0.5.1 的順序如下:
階段保證
- 全域攔截器在路由前執行
PreHandle;路由攔截器在參數解析後、控制器前執行。 - 控制器錯誤和回應準備錯誤都會成為
executionErr。 - JSON 序列化、Cookie/狀態驗證和回傳值處理先在記憶體中完成。
- 只有回應可準備時才執行領域事件後處理;接著執行
PostHandle。 - 成功完成
PreHandle的攔截器以反向順序執行BeforeResponse。任一錯誤都會阻止成功回應寫出。 - 準備好的回應只在所有
BeforeResponse成功後寫入真實 writer。 AfterCompletion最後執行,用於日誌、指標和清理,不用於決定交易提交。
攔截器錯誤與中止
PreHandle 回傳一般錯誤時,管線進入錯誤回應路徑。回傳 core.ErrAbortPipeline 表示攔截器已完成所需處理,例如 CORS 預檢;仍會為已進入的攔截器執行完成階段。
go
type Interceptor interface {
PreHandle(ctx ExecutionContext, meta HandlerMeta) error
PostHandle(ctx ExecutionContext, meta HandlerMeta)
BeforeResponse(ctx ExecutionContext, meta HandlerMeta, executionErr error) error
AfterCompletion(ctx ExecutionContext, meta HandlerMeta, err error)
}回應與外部副作用
準備回應後再派發領域事件,可以防止序列化或 Cookie/狀態驗證失敗時提前發布事件。但資料庫提交、訊息代理發布和實體 socket 寫入不能組成同一個原子交易。需要可靠的跨系統一致性時,應使用 transactional outbox、冪等鍵和至少一次傳遞設計。
HTTP、消費者與 WebSocket
HTTP、訊息消費者和 WebSocket 都重用管線概念,但上下文與回傳處理器依傳輸區分。App.Interceptor 預設同時註冊至 HTTP 與 WebSocket;需要明確範圍時使用 InterceptorFor。WebSocket 握手驗證是訊息管線之前的獨立階段,連線槽位先保留,再呼叫 PreHandshake,最後才 upgrade。
關於交易邊界,請參閱交易管理教學。
