5

Google App Engine からサード パーティ サービスへのリクエストをレート制限する効率的な方法を探しています。サード パーティ サービスは、アカウントごとにリクエストをレート制限します。Google App Engine 側では、ほとんどの作業がタスク内で実行されます。トークン バケットは、ここでは優れた一般的なアルゴリズムです。

Q: サービスごとではなく、アカウントごとにリクエストを効率的にレート制限するには、どのようなアプローチを使用できますか?

アカウントごとのリクエスト数とサービスされるアカウント数は大きく異なるため、GAE タスク キューのレートを設定する必要はありません。パフォーマンス上の理由から、memcache ベースの (incr/decr?) アイデアに最も関心があります。

これは memcache ベースのトークン バケットに要約されると思いますか?

考え?

4

3 に答える 3

1

GAE で memcache を使用してトークン バケットを実装する方法は次のとおりです。

編集:これを(別の)刺す。

これは、 https://github.com/simonw/ratelimitcache/blob/master/ratelimitcache.pyから一部を借用したものです。

def throttle(key, rate_count, rate_seconds, tries=3):
    '''
    returns True if throttled (not enough tokens available) else False
    implements token bucket algorithm
    '''
    client = memcache.Client(CLIENT_ARGS)
    for _ in range(tries):
        now = int(time.time())
        keys = ['%s-%s' % (key, str(now-i)) for i in range(rate_seconds)]
        client.add(keys[0], 0, time=rate_seconds+1)
        tokens = client.get_multi(keys[1:])
        tokens[keys[0]] = client.gets(keys[0])
        if sum(tokens.values()) >= rate_count:
            return True
        if client.cas(keys[0], tokens[keys[0]] + 1, time=rate_seconds+1) != 0:
            return False
    logging.error('cache contention error')
    return True

使用例は次のとおりです。

def test_that_it_throttles_too_many_requests(self):
    burst = 1
    interval = 1
    assert shared.rate_limit.throttle('test', burst, interval) is False
    assert shared.rate_limit.throttle('test', burst, interval) is True


def test_that_it_doesnt_throttle_burst_of_requests(self):
    burst = 16
    interval = 1
    for i in range(burst):
        assert shared.rate_limit.throttle('test', burst, interval) is False
    time.sleep(interval + 1) # memcache has 1 second granularity
    for i in range(burst):
        assert shared.rate_limit.throttle('test', burst, interval) is False
于 2016-02-09T18:56:28.653 に答える
1

このプロジェクトはしばらく前にブックマークとして保存しました: http://code.google.com/p/gaedjango-ratelimitcache/

特定の質問に対する答えではありませんが、始めるのに役立つかもしれません。

于 2010-09-06T18:48:53.147 に答える