Cloud PubSub to App Engine Проблема с памятью (и я должен перейти на DataFlow?) - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я запускаю «маленькое» приложение для колб (Google Engine App Engine), которое используется для интеграции приложений (оно слушает веб-хуки и вызывает другие API). Проблема в том, что я последовательно превышаю ограничение мягкой памяти после 35 - 45 запросов.

Объем памяти объединенных экземпляров: enter image description here

Поскольку я намерен увеличить нагрузку на эту систему на порядки, меня это беспокоит.

Мне кажется, есть три возможных решения, но я не знаю, с чего начать:

  1. Переключение на DataFlow: я уже использую Pub / Sub между двумя экземплярами App Engine, чтобы добавить более высокую согласованность, но, возможно, App Engine - не та платформа или платформа такого типа.
  2. Устранить утечку памяти: проблема здесь может заключаться в возможной утечке памяти, но я не могу найти правильные инструменты для анализа использования памяти на платформе App Engine (на моей локальной машине процесс Python колеблется около 51 МБ)
  3. Разделите систему на несколько микросервисов, чтобы уменьшить площадь для каждого экземпляра. (Поддерживать кодовую базу, вероятно, будет сложнее).

Любой совет или опыт очень приветствуются.

1 Ответ

0 голосов
/ 29 ноября 2018

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

Возможно, вы можете использовать Dataflow или Cloud Functions в вашем проекте. Если вы предоставите более подробную информацию о природе вашего варианта использования в отдельном вопросе, можно было бы оценить, могут ли эти варианты стать лучшей альтернативой вашему текущему подходу App Engine.

Наконец, разделение вашего приложения на несколько сервисов, вероятно, является лучшим долгосрочным решением вашей проблемы, поскольку это облегчит поиск утечки памяти, контроль затрат и общее обслуживание вашего приложения.

В документации App Engine есть несколько страниц, на которых обсуждаются лучшие практики проектирования микросервисов с использованием App Engine [1] [2] [3]. Надлежащие приложения на основе микросервиса позволяют, помимо прочих преимуществ, чистая регистрация и мониторинг , а также повышение надежности и масштабируемости приложения [1]. Эти преимущества, которые я упомянул здесь, важны для вас. Следуя схеме, описанной в [4], вы можете масштабировать свои услуги индивидуально и независимо друг от друга. Если вы считаете, что одна из ваших служб требует больше ресурсов, вы можете настроить параметры масштабирования, чтобы обеспечить оптимальную производительность для этой службы. Например, вы можете управлять количеством экземпляров, которые запускаются во время операций.

Вы можете использовать элементы приложения max_concurrent_requests и target_throughput_utilization, которые вы можете определить в файле конфигурации вашего App Engine, файле app.yaml. Смотри [5]. Чтобы уточнить, вы хотите уменьшить ваш max_concurrent_requests в вашем случае.

Обратите внимание, что, как обсуждалось в предыдущих комментариях, эта дорога может привести к повышению затрат. Если вы используете бесплатный уровень, вам нужно будет проверить [4] на наличие доступных вам ресурсов на этом уровне.

Что касается вопроса о том, что экземплярам не хватает памяти, если вы обнаружите, что это происходит не из-за утечки памяти, тогда другим решением будет использование другого instance_class, что означает, что вы можете создавать экземпляры App Engine с более высоким вычислить ресурсы (также более высокие затраты). Пожалуйста, смотрите [5] и [6].

[1] https://cloud.google.com/appengine/docs/standard/python/microservices-on-app-engine
[2] https://cloud.google.com/appengine/docs/standard/python/designing-microservice-api
[3] https://cloud.google.com/appengine/docs/standard/python/microservice-performance
[4] https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine
[5] https://cloud.google.com/appengine/docs/standard/python/config/appref
[6] https://cloud.google.com/appengine/docs/standard/#instance_classes

...