0

私はdynamically generated KMLを使用していますが、Googleのサーバーでは「タイミングの問題」のため断続的に失敗します。私が最後にチェックしたのはうまくいったが、それは一致しているようだ。データを新鮮なままメモリに保存するために、5分ごとにページにアクセスするcronジョブを作成する必要がありますか?サーバーサイドKMLジェネレータは、次のとおりです。動的に生成されたKMLのトラブルシューティング

class KMLHandler(webapp2.RequestHandler): 

    def get(self): 
     self.response.headers['Cache-Control'] = 'public,max-age=%s' \ 
      % 86400 
     start = datetime.datetime.now() - timedelta(days=60) 
     from google.appengine.api import memcache 
     memcache_key = 'ads' 
     data = memcache.get(memcache_key) 
     if data is None: 
      a = Ad.all().filter('modified >', 
           start).filter('published =', 
        True).order('-modified').fetch(1000) 
      memcache.set('ads', a) 
     else: 
      a = data 
     dispatch = 'templates/kml.html' 
     template_values = {'a': a, 'request': self.request, 
          'host': os.environ.get('HTTP_HOST', 
          os.environ['SERVER_NAME'])} 
     path = os.path.join(os.path.dirname(__file__), dispatch) 
     output = template.render(path, template_values) 
     self.response.headers['Content-Type'] = \ 
      'application/vnd.google-earth.kml+xml' 
     self.response.headers['Content-Length'] = len(output) 
     self.response.out.write(output) 

- テンプレートファイルには、次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
<Document> 
{% for ad in a %} 
{% if ad.geopt %} 
<Placemark><name></name><description> 
<![CDATA[{% if ad.uri2view %}<img src="{{ ad.uri2view }}">{% endif %}<a href="http://www.koolbusiness.com/vi/{{ad.key.id}}"> {{ ad.title }} </a><br/>{{ad.text|truncatewords:20}}]]></description><Point><coordinates>{{ad.geopt.lon|floatformat:2}},{{ad.geopt.lat|floatformat:2}}</coordinates></Point></Placemark>{% endif %}{% endfor %}</Document></kml> 

- 私もそれが正しいことを保証するために、KMLのバリデータを通じてoutputを実行しました。それは動的に生成され、私はそれをキャッシュしようとします。控えめな理由がなければ断続的に失敗します。私はKMLを生成するPythonを持っており、コードがチェックされていて、動作しているはずです。プログラムのどこが間違っているのか分かりません。スクリプトの出力を静的なkmlファイルとして保存しても動作し、KMLは有効なので、動的に生成されたときにGoogleに配信する際に「タイミングの問題」があるようです。しかし、これをさらにトラブルシューティングするにはどうすればよいですか?代わりにJSONを使用するように全体の戦略を変更することができますが、それはたくさん記録され、私はそれを動作させることに近いと思います。

私は考えることができる3つの戦略はJinja2のテンプレートに

  • 変更
  • JSONに変更はなく、KML
  • にデータを保持するために、ファイルごとに5分にアクセスするcronジョブを書くです任意のヘルプ
+3

どのような種類の障害ですか? App Engineのログにエラーが表示されていますか? –

+0

時々ログのタイムアウトエラーが表示され、KMLに障害が発生したときには、それがdeadlineexceedederrorであり、正確にチェックされると思います。 –

+1

何が失敗するかは、問題が何であるかを実際に知るためには非常に重要です。 –

答えて

2

ためのmemcacheの enter image description here おかげで、私はそれがGoogleの私ので、あなたのKMLを構築するために時間がかかりすぎています疑います諦める。 linkを数回テストしました。ロードするのに数秒かかります。たまには5秒以上です。これらのKMLファイルをダウンロードしてレンダリングするサーバーは、ファイルをすばやく読み込むことができない場合には、タイムアウトまたは放棄されます。この種の動作は、ファイルが時々ロードされない、またはキャッシュが(良い負荷が発生したときに)満了する断続的な失敗と一貫しています。

KMLを生成するプロセスを改善できない場合は、生成する実際のファイルデータをキャッシュして、後でそれをより早く返すことができます。タスクキューAPI/Cronを使用すると、N分ごとに再構築タスクを実行することで、キャッシュを最新の状態に保つことができます。

+0

ありがとうございました。 –

関連する問題