对动态生成的 KML 进行故障排除

Posted

技术标签:

【中文标题】对动态生成的 KML 进行故障排除【英文标题】:Troubleshooting dynamically generated KML 【发布时间】:2012-02-12 22:30:49 【问题描述】:

我使用 dynamically generated KML 间歇性失败似乎是因为谷歌服务器的“时间问题”。上次我检查它是否有效,但这似乎是巧合。我应该做一个每 5 分钟访问一次页面的 cron 作业以使数据在内存中保持新鲜吗?服务器端 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,但这将需要大量的重新编码,我认为我已经接近让它发挥作用了。

我能想到的三个策略是

更改为 Jinja2 模板 改为 JSON 而不是 KML 编写一个每 5 分钟访问一次文件的 cron 作业,以将数据保存在 memcache 中 感谢您的帮助

【问题讨论】:

什么样的故障?您是否在 App Engine 日志中看到错误? 我偶尔会在日志中看到超时错误,当出现 KML 故障时,我认为这是一个deadlineexceedederror,将准确检查。 失败对于真正了解问题所在非常重要。 【参考方案1】:

我怀疑构建您的 KML 花费的时间太长,因此 Google 放弃了。我对link 进行了几次测试,每次加载都需要几秒钟,有时超过 5 秒。如果无法快速加载文件,下载和渲染这些 KML 文件的服务器将超时/放弃。这种行为与有时无法加载文件或缓存(发生良好加载时)过期时的间歇性故障一致。

如果生成 KML 的过程无法改进,您应该缓存您生成的实际文件数据,以便将来更快地返回。使用任务队列 API / Cron,您可以通过每 N 分钟运行一次重建任务来保持缓存最新。

【讨论】:

以上是关于对动态生成的 KML 进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

从继承超类时实现matlab.system进行故障排除

对冻结的 php 脚本进行故障排除

如何对苹果Mac屏幕自动降低亮度进行故障排除?

对远程 jquery 插件请求进行故障排除

对 signInManager.PasswordSignInAsync 进行故障排除 [重复]

对NetBackup 问题进行故障排除的步骤