【问题标题】:How do I poll a web service from a GAE service in short intervals?如何在短时间内从 GAE 服务轮询 Web 服务?
【发布时间】:2019-01-23 12:30:47
【问题描述】:

我正在开发一个依赖 GAE 服务的客户端应用程序。该服务需要通过以不到 1 分钟的间隔轮询远程 Web 服务来获取更新,因此 cron 作业可能不是这里的方法。

从 GAE 服务中,我需要每隔几秒钟轮询 Web 服务,然后更新客户端应用程序。所以分解一下:

  1. GAE 服务以 5 秒的间隔轮询远程 Web 服务。
  2. 如果进行了更改,请立即更新客户端应用程序。

第 2 步已经解决,但我正在努力寻找这种投票的好方法。我无法控制远程 Web 服务,因此我无法对此进行任何更改。

我查看了Task queue API,但文档明确说它是unsuitable for interactive applications where a user is waiting for the result

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: web-services google-app-engine google-cloud-datastore long-polling


    【解决方案1】:

    使用 cron 来安排一堆交错 etas 的任务队列任务

    def cron_job():  # scheduled to run every 5 minutes
        for i in xrange(0, 60*5, 5):
            deferred.defer(poll_web_service, _countdown=i)
    
    def poll_web_service():
        # do stuff
    

    或者,在这种频率水平下,您还不如有一个专门的实例。您可以使用手动扩展微服务来做到这一点,并且您可以让/_ah/start/ 的请求处理程序永不返回,这将让它永远运行(除了定期重启)。看到这个:https://cloud.google.com/appengine/docs/standard/python/how-instances-are-managed#instance_scaling

    def on_change_detected(params):
        queue = taskqueue.Queue('default')
        task = taskqueue.Task(
            url='/some-url-on-your-default-service/',
            countdown=0,
            target='default',
            params={'params': params})
        queue.add(task)
    
    class Start(webapp2.RequestHandler):
    
        def get(self):
            while True:
                time.sleep(5)
                if change_detected:  # YOUR LOGIC TO DETECT A CHANGE GOES HERE
                    on_change_detected()
    
    _routes = [
        RedirectRoute('/_ah/start', Start, name='start'),
    ]
    
    for r in _routes:
        app.router.add(r)
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2011-08-24
      相关资源
      最近更新 更多