0

私は RESTful API を開発しており、OAuth 2.0 認証を実装しています。

私のすべてのクライアントは、SSL 経由で Authorization ヘッダーにベアラー トークンを渡すリクエストを作成します。

Authorization: Bearer sdflksd3r4823vgbyerge

現在、Postgres にアクセス トークンとリフレッシュ トークンを保存しているため、リクエストごとにサーバーがデータベースに接続して SELECT クエリを実行する必要があります。「tokens」テーブルには約 100 万行が含まれているため、テーブルにインデックスが作成されていても、パフォーマンスはあまり良くありません... また、すべてのリクエストでトークンの有効性をチェックするのはかなり時間の無駄だと思います。

私たちのトークンは、データのランダムなバイトです。データベースを参照せずにトークンをデコードして検証できるように、自己エンコードされたトークンを使用することを検討しましたが、トークンはユーザーから取り消し可能でなければならないという問題があるため、これは解決策ではありません。

私のオプションは何ですか?

Postgres の代わりにRedisを使用することを考えていました: 読み取りははるかに高速になるはずです。別のオプションとして、トークンの有効性を確認し、レスポンスを Memcached に 15 分間キャッシュして、後続のリクエストでデータベース ルックアップが不要になるようにすることもできます。

何か案は?

4

2 に答える 2

3

私はいくつかの実際の数字を優しく突いてみました。使用可能な GHz/RAM/ディスク I/O に関して、「ec2 マイクロ インスタンス」が実際に何を持っているかを言う準備ができていないので、別の方法で試す必要があります。

CREATE TABLE tokens(tok text, username text);
INSERT INTO tokens SELECT md5(i::text), 'User number ' || i FROM generate_series(1,1000000) i;
SELECT * FROM tokens WHERE username LIKE '%01' LIMIT 19;
-- Now check the timings on some of returned tokens
EXPLAIN ANALYSE SELECT username FROM tokens WHERE tok = '38b3eff8baf56627478ec76a704e9b52';
                                                 QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Index Scan using tokens_pkey on tokens  (cost=0.42..8.44 rows=1 width=18) (actual time=0.099..0.101 rows=1 loops=1)
   Index Cond: (tok = '38b3eff8baf56627478ec76a704e9b52'::text)
 Total runtime: 0.133 ms
(3 rows)

ご覧のとおり、私の実行は非常に高速であるため、タイミングはおそらく無意味です。気にするなら、10 の並列プロセスから 10000 を実行し、その間にランダムな待機を行います。私はしません-それは1ミリ秒未満であり、予想される最も遅い仮想マシンでも5ミリ秒未満です。

それで - あなたのアプリケーションの問題ですか?わかりません - 詳細を教えてくれませんでした。

それはあなたのフレームワークですか?わかりません - あなたは言わないでしょう。

接続時間ですか?わかりません...

クエリ自体ですか?わかりません...

ただし、PostgreSQL がインデックスを使用して小さな100 万行のテーブルから 1 行を読み取るという問題はありません。

幸運を!

于 2013-11-14T18:45:31.487 に答える
1

トークンにはインデックスが必要であることに注意してください。リチャードの応答では省略されています。インデックスを作成する前は、クエリの実行時間は約 200 ミリ秒でした。インデックスを作成した後、0.1 ミリ秒に低下しました。(申し訳ありませんが、彼の投稿に直接コメントしたいのですが、十分なスコアがありません)。

于 2014-02-11T00:58:01.650 に答える