Обновление загруженных данных в приложении apl колба restful - PullRequest
0 голосов
/ 11 февраля 2019

Я ищу лучший вариант для перезагрузки данных в развернутом приложении.Оптимальное значение определяется как, оно не должно приводить к 500 с и должно обновлять данные (не прерываться молча), не должно блокировать работу слишком долго, но не должно быть 500 с, и обновление является приоритетом.

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

api.add_resource(
Cars,
'/cars',
resource_class_kwargs={'carslist': carslist})

Проблема заключается в том, что каждые 24 часа или иногда чаще меняется список автомобилей.Я могу создать метод POST, с помощью которого я отправляю новый файл в приложение, или заставить его загрузить новую версию и т. Д. Мой вопрос, однако, если я разверну это с помощью gunicorn и скажу 8 рабочих, как я могу убедиться, что у каждого рабочего естьактуальный carslist.

В соответствии с документами для gunicorn, я также могу грациозно перезапустить gunicorn с помощью HUP.Итак, лучше ли перезапускать приложение и загружать новый carslist или как сделать запрос, по которому вызывается каждый работник?

Я использую gunicorn за nginx на докере, и это приложение не подключено к Интернету, поэтому безопасность не имеет значения, но я иногда вижу запросы на 10000 с в секунду.

1 Ответ

0 голосов
/ 11 февраля 2019

Существуют различные подходы к вашей задаче, и это зависит от того, что вы ограничиваете от того, насколько быстро работники должны догонять новые значения, как вы объявляете их при изменении этого значения и каковы ваши требования к производительности.Что эти решения разделяют, так это то, что легче управлять carlist, когда это объект класса с интерфейсом, подобным:

class CarlistManager:
    def __init__(self):
        super().__init__()
        self.carlist = self.update()

    def update(self):
        self.carlist = ...  # depends on where you store a carlist

    def get(self):
        if not self.is_up_to_date():
            self.update()
        return self.carlist

    def is_up_to_date(self):
        # depends on how do you prefer to check for a new file version

app = Flask("app")
app.carlist_manager = CarlistManager()
api.add_resource(Cars, '/cars',
resource_class_kwargs={'carslist': app.carlist_manager})

Если у вас есть БД, вы можете сохранить там некоторое значение, например, имя файласамый новый карлист, обновите его в новом опубликованном файле и проверьте, изменился ли он в is_up_to_date.Это позволяет вам изменять значение во время выполнения, не перезапуская любого работника.

...