0

最近、Googleのスクリプトウェブアプリがqpsの制限に達しています。パフォーマンスを改善するためのより良い方法は何でしょうか。Google Apps Script Web Appロングポーリングと同時実行制限

私は約50人のアクティブユーザーがいます。私は15,000行のGoogleスプレッドシートをデータベースとして使用しています。私のアプリはこのスプレッドシートからユーザーが要求したjsonデータを提供しています。私は長い投票を使用して接続を5分間維持し、スプレッドシートの更新がない場合は閉じます。その後、クライアントは再接続します。 Web Appは私として実行されるように公開されています。

私のポーリングは次のように機能します。

function doGet(e){ 
    var userHasVersion = e.parameter.userVersion 
    while (runningTime < 300001) { 
      var currentServerVersion = parseInt(cache.get("currentVersion"),10) 
      if(userVersion<currentServerVersion){ 
      var returndata = [] 
      for(var i = userVersion+1; i <= currentServerVersion;i++){ 
       var newData = cache.get(i) 
       if(newData!=null){returnData.push(JSON.parse(cache.get(newData)))} 
      } 
      return ContentService.createTextOutput(JSON.stringify({currentServerVersion,data:returnData })).setMimeType(ContentService.MimeType.JSON); 
      } else { 
      Utilities.sleep(20000) 
      } 
      runningTime = calculateRunningTime() 
    } 
} 

私がこれまで試してみました何を:私はスプレッドシートへの呼び出しを減らすためのCacheServiceとの要求を最適化

1)。数ヶ月間助けてくれましたが、現在はqpsエラーがますます多く発生しています。

2)クォータについてGoogleチームに問い合わせる。彼らは、私の説明では、同時実行のためのクォータ/制限が公開されておらず、予告なしに変更されることがあります。彼らは、cacheServiceの使い方とエラー処理の改善を勧めました。

私は短期ポーリングにロングポーリングから切り替えることだと思います。しかし、それは欠点のように感じる。パフォーマンスをさらに最適化するか、別のサービスに移行する必要がありますか?

うヘルプ「アプリにアクセスしているユーザーとしてアプリを実行」を使用しようとしていますか? (ユーザーが同じデータベースを使用する必要があります)

は、GoogleのスクリプトAPI実行可能ファイルは、Webアプリケーションとは異なりますか?それは当てはまるかもしれませんが、同じqpsクォータを共有しているかどうかはわかりません。

私はまた、GAEサービスを検討しているが、私は自由なクォータの上に行くのを回避したいと思います。

アドバイスをいただければ幸いです!

答えて

1

以下の部分を改善できると思います。データがキャッシュサービスから取得されるとき、getAll()get()より効果的です。私はその差を測定したことがあります。それはget()より約890倍速いです。キャッシュサービスから取得するデータの数が多い場合、この部分の改善はパフォーマンスにとって重要であると私は思います。

あなたのスクリプト:

var returndata = [] 
for(var i = userVersion+1; i <= currentServerVersion;i++){ 
    var newData = cache.get(i) 
    if(newData!=null){returnData.push(JSON.parse(cache.get(newData)))} 
} 

の改善スクリプト:

var ar = []; 
for(var i = userVersion+1; i <= currentServerVersion;i++){ 
    ar.push([i]); 
} 
var r = JSON.parse(JSON.stringify(cache.getAll(ar))); // Since key is number, I used this. 
var returnData = [r[j] for each (j in r)if (!r[j])]; 

私はあなたのデータを見ることができないので、私はこの実行を確認することはできません。エラーが発生した場合は、教えてください。

私はあなたの質問を誤解している場合、私はごめんなさい。

+0

ありがとうございました!私はこれをテストしようとします。私はこのトリックについて知らなかった。短時間ポーリングに切り替えると便利です。次に、このパフォーマンスの違いは間違いありません! –

+0

@Evgeny Vostok私はあなたをお手伝いします。私のサンプルがうまくいかない場合は、私に教えてください。そしてputデータをキャッシュに入れるために '' put() ''を使うと、 '' putAll() ''がより良くなります。 – Tanaike

関連する問題