我正在寻找在已部署的应用程序中重新加载数据的最佳选择。 Best的定义是,不得导致500s,并且必须更新数据(不会默默地失败),不应阻塞工作时间太长,但是请勿将500s和更新作为优先级。
该应用程序是受CPU限制的应用程序,我正在通过添加更多的工作程序和内核进行扩展。该应用会在启动时通过
加载list
或dict
api.add_resource(
Cars,
'/cars',
resource_class_kwargs={'carslist': carslist})
问题在于,每24小时或更频繁地,汽车列表会发生变化。我可以制作一个POST方法,将新方法发送到应用程序,或使其加载新版本等。但是我的问题是,如果我将其与gunicorn一起部署并说8个工作人员,我如何确保每个工作人员都拥有最新的carslist
。
根据gunicorn文档,我还可以使用HUP
优雅地重新启动gunicorn。因此,重新启动应用程序并使其加载新的carslist
是最好的选择吗?或者我该如何请求每个工作者被调用?
我在docker上的nginx后面使用了gunicorn,并且该应用程序没有面向互联网,因此安全性不是问题,但有时确实会在一秒钟内看到10000s的请求。
答案 0 :(得分:1)
有不同的方法来执行任务,这取决于您对员工需要多快地赶上新价值,如何在此价值发生变化时宣布它们以及对性能的要求有何限制。这些解决方案的共同之处在于,当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})
:
{
"test": [
1,
2,
3,
4
]
}
如果您有数据库,则可以在其中存储一些值,例如最新清单的文件名,在新发布的文件上对其进行更新,并检查is_up_to_date中是否已更改。这样,您就可以在运行时中更改值,而无需重新启动任何工作程序。