Google App EngineでホストされているDjangoアプリからShopify APIを使用しようとしています。Rate Limit API Google App EngineでDjangoでAPIを呼び出す
# Setup local bucket to limit API Calls
bucket = TokenBucket(40, .5)
api_call_success = False
while not api_call_success:
if bucket.tokens < 1:
sleep(.5)
else:
[... do an API call ...]
bucket.consume(1)
api_call_success = True
これは私の地元のスクリプトで動作しますが、それは動作しません:私はShopifyのレート制限を超える行っていないことを確認するmodified version of thisを使用しています私の地元のシングルスレッドスクリプトの場合
私のGoogle App Engineは複数のテナントが存在し、複数のセッションが同時に発生するアプリケーションをホストしました。
私はこのレート制限を処理する最善の方法を研究しようとしていましたが、現在、常に各ユーザー/店舗のリクエストレスポンスヘッダーをmemcacheに書き込んで、「x-shopify-shop以前のコール制限(およびコール時間)が何であったかを確認するには、「-api-call-limit」を使用します。だから私はこのような何かを試してみました:
fill_rate = .5
capacity = 40
# get memcache key info
last_call_time = memcache.get(memKey+"_last_call_time")
last_call_value = memcache.get(memKey+"_last_call_value")
# Calculate how many tokens should be available
now = datetime.datetime.utcnow()
delta = fill_rate * ((now - last_call_time).seconds)
tokensAvailable = min(capacity, delta + last_call_value)
# Check if we can perform operation
if tokensAvailble > 1:
[... Some work involving Shopify API call ...]
# Do some work and then update memcache
memcache.set_multi({"_last_call_time": datetime.datetime.strptime(resp_dict['date'], '%a, %d %b %Y %H:%M:%S %Z'), "_last_call_value": resp_dict['x-shopify-shop-api-call-limit'].split('/',1)[0]}, key_prefix=memKey, time=120)
else:
[... wait ...]
誰もがこのレート制限を管理するためのより良い方法をお勧めしますか?
、アプリケーションのフロントエンドもShopifyを呼び出す場合APIを使用すると、ユーザーが操作を実行しようとすると同時にコールバケット内のすべての部屋をバックエンドプロセスが使い切った場合、応答性の問題が発生することはありますか?私は人々が問題であると示唆したいくつかのスレッドを読んだ。 – cj1689262
あなたは 'def consume_token'で使用しているレート制限ロジックをさらに詳しく説明できますか?以前の応答時間に基づいて計算を試みようとしていましたが、consume_tokenを呼び出す前に私はself.response = noneを呼び出していますので、前回の呼び出し時間に実際にアクセスできません。 – cj1689262
あなたの最初の質問について:私は、フロントエンドからAPIを使用することがどういう意味か分かりません。私の知る限りでは、サーバーに要求を送信する必要がありますし、サーバーがAPI呼び出しを行います。これをクライアント側から行うとセキュリティ上の問題が発生します。つまり、APIリクエストを発行する前にアプリがトークンを待っていれば、それは何をすべきかを正確に行うことに成功しているという。これが大きな問題になる場合は、実装の再評価をお勧めし、API呼び出しを減らす可能性があるかどうかを確認してください。 – Julien