Как я могу опрашивать веб-сервис из сервиса GAE за короткие промежутки времени? - PullRequest
0 голосов
/ 23 января 2019

Я разрабатываю клиентское приложение, которое опирается на сервис GAE. Эта служба должна получать обновления, опрашивая удаленную веб-службу с интервалом менее 1 минуты, поэтому задания cron, вероятно, не подходят для этого.

Из службы GAE мне нужно опросить веб-службу с интервалом в пару секунд, а затем обновить клиентское приложение. Итак, чтобы разбить его:

  1. Служба GAE опрашивает удаленную веб-службу с интервалами в 5 секунд.
  2. Если внесено изменение, немедленно обновите клиентское приложение.

Шаг 2 уже решен, но я изо всех сил пытаюсь найти хороший способ опроса такого рода. У меня нет контроля над удаленным веб-сервисом, поэтому я не могу вносить в это какие-либо изменения.

Я посмотрел на Task queue API, но в документации конкретно сказано, что это unsuitable for interactive applications where a user is waiting for the result

Как лучше всего решить эту проблему?

1 Ответ

0 голосов
/ 24 января 2019

Используйте 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)
...