ホームページ >バックエンド開発 >Golang >クロスレイヤーコンテキストキャンセルの処理

クロスレイヤーコンテキストキャンセルの処理

WBOY
WBOY転載
2024-02-05 23:54:07489ブラウズ

クロスレイヤーコンテキストキャンセルの処理

質問内容

コントローラー、サービス、リポジトリなどを備えた階層型バックエンド API を開発しています。

###コンテクスト###

これらのレイヤーの各メソッドは、

リクエスト コンテキスト

を含む context.Context を最初のパラメータとして受け取ります。これは、どのメソッドでもさまざまなリクエスト関連データ (相関 ID など) にアクセスできるため便利です。

リクエスト コンテキスト

には、次の TimeoutMiddleware によってタイムアウトが設定されます。 リーリー ###チャレンジ### このアイデアは、リクエスト コンテキストがタイムアウトになったときに、進行中の操作を適切に停止することです。 コンテキストと同時実行性 (ほとんどはありません) の理解に基づいて、次のヘルパー関数を作成しました。 リーリー

理論上、任意の操作を

できるだけ早く停止したい場合は、次のように、アプリケーション内のすべてのメソッドの先頭

でこの関数を呼び出す必要があります。

リーリー

また、データベースにアクセスするリポジトリでは、

QueryQueryRowExec など、ほとんどの関数に Context

が必要であることもわかっています。 # ## ...、次のように:### リーリー したがって、上記の行でエラーが発生するたびに、単に internal_server_error と次のようなエラー メッセージを返すのではなく、エラーがコンテキストのキャンセルによるものではないかどうかを確認する必要があります。 リーリー リーリー HandleContextCancel 関数の使用は少し冗長に思えますが、どう思いますか? 正解

HandleContextCancel

関数は必要ありません。単純に次のように実行できます:

リーリー 他のエラー処理関数がこのエラーを正しくラップしている場合 (つまり、Unwrap() error

メソッドを実装している場合)、エラーにタイムアウト/キャンセル エラーが含まれているかどうかをトップレベルでチェックし、戻り値などのエラーの種類を処理します。すべてのレイヤーに対してこれを行う必要はありません。

以上がクロスレイヤーコンテキストキャンセルの処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。