Go サーバーを正常に停止するは、進行中の処理を放棄せずにダウンロードサービスを閉じる実践プロジェクトです。まずテキスト資料を完全にダウンロードし、即時停止が受け付け済みの転送を中断する様子を観察します。その後、新しい接続を拒否しながら、既存のダウンロードを元のサーバープロセスで完了させる終了処理を実装します。
2 つのガイド付きラボでは、実際のクライアント結果を、プロセスの識別、シグナルの送達、HTTP の終了処理、main が待つ責任と結び付けます。1 つの独立したチャレンジでは、同じ仕組みを異なる 2 件の受け付け済み資料転送に適用します。各単元には独自の環境と教材が用意されます。所要時間は約 150 分で、読解と通常の修正を含む著者の見積もりです。
学習内容
このコースを修了すると、次のことができるようになります。
- 実際の資料のバイトを比較し、利用できる完全なダウンロードと中断された転送を区別する。
- コースの元のビルド済み Go プロセスを識別し、そのプロセスに正確に
SIGTERMを送る。 - 停止前にリクエストが受け付けられたことを確認し、既存処理の継続中に新しい接続が拒否される様子を観察する。
- 有限の context 予算を設定した
http.Server.Shutdownで、通常の処理中 HTTP リクエストを完了させる。 http.ErrServerClosedと実際のサーバーエラーを区別し、終了処理が完了するまで main を待機させる。- 完全にダウンロードした 1 件または 2 件の資料を保持し、元のクライアントとサーバーの結果を確認して、提供されたファイルと観察記録を保存する。
このコースの対象者
このコースは、小さな HTTP サービスとその処理中リクエストのライフサイクルを調整したい Go 学習者を対象としています。
前提知識: 基本的なターミナル操作、遺失物 API を構築するで扱う Go のハンドラーとエラー値、および Go Worker で Web サイトを確認するで扱う goroutine と channel、または同等の経験。プロセス ID、シグナル、有限の context、main が終了処理を待つ仕組みは使用前に説明します。
学習環境: LabEx が、ブラウザのターミナル環境で Go、開始用のライフサイクルコード、用意された HTTP ハンドラー、実際のテキスト資料 2 件、観察ツールを提供します。同じマシン上の Server と Downloads ターミナルでサービスとクライアントを実行でき、ローカルへの Go のインストールは不要です。コマンド、ラベル、プログラム出力は英語のままです。
よくある質問
OS のシグナルを事前に知っている必要はありますか?
必要ありません。ラボでは、コース自身のサーバーを停止する前にプロセスの識別と SIGTERM を説明します。用意された観察ツールが受け付け済みリクエストと実際のプロセス結果の確認を助けるため、内部のトレース形式を学ぶ必要はありません。
Shutdown を呼べば、すべて自動的に完了しますか?
main は終了処理の完了を待つ必要があります。期限切れエラーは、処理中の作業が完了した証拠にはなりません。サーバー側の処理は、クライアントがダウンロードファイルの読み取りやバッファーの書き出しを終える前に完了する場合があります。そのため、ターミナルのメッセージの順序を仮定せず、両方の結果を確認します。
チャレンジでは何が変わりますか?
元のサーバーを停止するとき、異なる 2 件の資料がすでに転送中である必要があります。両方のダウンロードが正確なバイトを保持し、処理中は新しい接続を拒否し、その同じサーバーが正常終了しなければなりません。範囲は通常の HTTP です。WebSockets、分散トラフィックの切り替え、本番環境での無停止保証は対象外です。

