Подходит ли веб-сервер Tornado для приложения, часто вызывающего внешние веб-службы?

#performance #scalability #tornado

#Производительность #масштабируемость #tornado

Вопрос:

Я работаю над простым приложением (серверной частью для интерфейса в Flex), которое в большинстве сценариев выполняет следующее:

  • вызовите внешнюю веб-службу REST-ful
  • извлеките некоторые данные из локальной базы данных
  • обработать и вернуть оба результата

Выиграет ли мое приложение от того, что веб-сервер Tornado неблокирующий? Я имею в виду, с точки зрения масштабируемости и производительности. В чем здесь будет загвоздка?

Ответ №1:

О да. Это определенно принесет пользу.

Пока сервер занят выборкой внешних ресурсов, он может продолжать обслуживать другие вызовы, поскольку интерпретатор не заблокирован.

На обычных веб-серверах для достижения этой цели используется что-то вроде Gevent.

Кроме того, в Tornado 2.1 и выше шаг 1 и шаг 2 могут быть объединены, поскольку:

def get (self):

 http_client = AsyncHTTPClient()
response1, response2 = yield [gen.Task(http_client.fetch, url1),
                              gen.Task(http_client.fetch, url2)]