16.8 ウェブサービスでセッションの情報を共有する

ウェブサービスは1つのリクエストごとに独立して処理を行います。プログラムの中でリクエストをまたいだ情報共有を直接行うことはありません。同じHTTPのURLにアクセスがあっても、ユーザーAとユーザーBのリクエストは独立しています。1つのリクエストを起点とした処理のブロックを「セッション」と呼びます。1つのセッションの中で共有する情報はJavaであればスレッドローカルストレージの役割でしたが、それに該当するGoの機能を紹介していきます。

1つのユーザーリクエストから生じるセッションに関連する情報としては、次のようなものがあります。

  • データベースのコネクションや、トランザクション

  • パフォーマンス測定ログや、デバッグログなどの識別子

「16.1 並行処理の基本を知る 」で、Goのコンテキストには2つの役割があると紹介しました。このうちの後者を、セッションデータのストレージとして利用します。次のように、セッションストレージには2つの役割があります。

  • 1つのセッションから派生するすべての処理をまとめてキャンセルする(タイムアウトでの終了も含む)

  • 1つのセッション内で共有される情報を保持する

	ctx := context.Background() // ルートのcontext
	ctx = context.WithValue(ctx, "key", "value")
	log.Println(ctx.Value("key"))

このサンプルではコンテキストに値を設定しています。値を登録するには、親となるコンテキストと、それを取り出すためのキーとともに値を渡すと、値を保持したコンテキストが作成され返されます。参照するにはキーを渡しますが、キーが重複している場合は子として後から登録された値が返されます。 ...