Carpe Diem

備忘録

Redisを使った分散ロック (SETNX, Redlock)

概要

分散システムにおいて同じリソースにアクセスする際にロック(排他制御)する仕組みを分散ロックといいます。

ロックを用いる背景としては主に2つあり、

目的 説明 具体例
効率 同じ作業を不必要に複数回行わないため キャッシュのOriginへのリクエストを抑制したい(Cache stampede対策)
正確性 データの不整合が起きないようにするため トランザクション

Redisを分散ロックに使う場合は主に前者のケースにおいて推奨されます。

環境

  • Redis 6.2.0
続きを読む

NEG(Network Endpoint Group)を使った負荷分散

概要

従来のGKEのロードバランサーはNodeに到達後iptablesで再度負荷分散するという2段階ロードバランシングでした。
これによりレイテンシの増加、分散のばらつきといった問題が生じていました。

f:id:quoll00:20210222013932g:plain

ref: Google Cloud Blog - News, Features and Announcements

しかしNEG(Network Endpoint Group)という機能を使うことで直接Pod宛てに負荷分散を行うことができ、上記の問題を低減することが可能となっています。

f:id:quoll00:20210222014123g:plain

ref: Google Cloud Blog - News, Features and Announcements

続きを読む

セキュアなトークン管理方法

概要

クライアント↔サーバ間の認証・認可情報としてのトークン管理はWebサービスとしては必ずつきまとうものですが、一方できちんと実装しないとセキュアに管理はできません。

今回はそのトークン管理方法の一例を紹介します。

要件

今回の主な要件は以下です。

  • AuthサーバとResourceサーバは別で管理する(負荷特性が異なるので)
  • 認証するとAuthサーバはrefresh tokenとaccess tokenを返す
  • access tokenはJWT形式
  • access tokenはクライアントのオンメモリで管理する
  • access tokenの期限は短く(1時間以内)
  • refresh tokenを使ってaccess tokenを発行できる
  • refresh tokenはrevoke可能である
    • 認証情報に変更があれば(パスワード変更など)refresh tokenをrevokeできる
  • Resourceサーバは起動時などにAuthサーバから公開鍵を取得し、access tokenの署名検証に使用する

ネイティブクライアントの場合

ネイティブクライアントの場合、keychainなどセキュアな管理ストレージがあるためrefresh tokenを保存することができます。

続きを読む

デッドロックとその対策

概要

複数のトランザクションが共通のリソースにアクセスする際に気をつけるものとしてデッドロックがあります。

例えばこのように一方はResource1, Resource2とロックしてアクセスし、もう一方はResource2, Resource1とロックしてアクセスする場合、うまく行けば両方とも成功しますが、

f:id:quoll00:20210207152617p:plain

ロックのタイミングによっては一方がロックできず、またアンロックもできない状態(=デッドロック)に陥ります。

続きを読む

OAuth 2.0 Device Authorization Grant

概要

サービスのマルチデバイス対応をした際に、各デバイスで同じアカウントにログインするのはユーザにとっては非常に手間です。

例えばテレビデバイスに対応した場合にID&パスワードをリモコンで入力させるのはユーザにとって苦痛でしかありません。

なのでサービス側はユーザが苦労なくスムーズにログインできる方法を提供しなくてはいけませんが、一方でセキュリティについても気にする必要があります。

そんなケースの対応方法としてOAuth 2.0 Device Authorization Grantがあるので紹介します。

ユーザの体験

例としてテレビデバイスでログインします。
huluが体験として分かりやすいので実際にやってみます。

ログインしようとする

f:id:quoll00:20210201045708j:plain

続きを読む

SquidをForward Proxyサーバとして使う

概要

Forward Proxyを導入することで以下のメリットを得ることができます。

  • DNS lookupをキャッシュして名前解決を高速化
  • Targetからのレスポンスをキャッシュして高速化
  • TargetがIP制限している場合に、送信元IPを固定するサーバにする
  • ↑と逆にTargetの制限をかけられる(社内→インターネットのパターン)

今回Forward Proxyとして有名なSquidを使って簡単な検証を行ってみます。

環境

続きを読む

http clientでHTTP/2を使う方法

背景

外部APIを叩く時に利用するhttp clientですが、サーバ側がHTTP/2対応しているのであればコネクションの有効活用ができるようHTTP/2を使いたいものです。

その際にhttp client側で設定する点、気をつける点を説明していきます。

環境

  • Go 1.15.6
  • curl 7.64.1

HTTP/2対応しているか確認する方法

まずは対象とするサーバやhttp clientがHTTP/2対応になっているかを確認する方法を紹介します。

サーバ側の確認

サーバ側が対応しているかどうかはcurl-vオプションで手軽に確認できます。

続きを読む