gpt4 book ai didi

django - 什么 AWS 服务可以帮助加快缓慢的 Django View 功能

转载 作者:行者123 更新时间:2023-11-29 12:41:17 24 4
gpt4 key购买 nike

我有一个带有 Postgres 数据库的 Django 应用程序,由于数据库有数百万条记录,它有点脱离了我的客户端。话虽如此,有些 View 函数会进行多个数据库查询,因此速度非常慢。这是我的一个 View 函数的示例,它有点乱,因为我正在摆弄一些东西来寻找查询优化,我很抱歉。

def get_filters(request):
try:
post_data = request.body.decode("utf-8")
post_data = json.loads(post_data)
except Exception as e:
logging.error('There was an issue getting filter post data')
logging.error(e)

return HttpResponse(
json.dumps({'filters': {'makes': [], 'models': [], 'years': [], 'transmissions': [], 'fuel_types': []}}),
content_type='application/json')

dealer = post_data['dealer'] if 'dealer' in post_data else None
make_ids = post_data['make_ids'] if 'make_ids' in post_data else []
model_ids = post_data['model_ids'] if 'model_ids' in post_data else []
years = post_data['years'] if 'years' in post_data else []
condition = post_data['condition'] if 'condition' in post_data else None
price_min = post_data['price_min'] if 'price_min' in post_data else 0
price_max = post_data['price_max'] if 'price_max' in post_data else 10000000

# Catch Critical Error Where There Is No Dealer
if not dealer:
logging.error('Unable to find a Dealer')
return HttpResponse(
json.dumps({'filters': {'makes': [], 'models': [], 'years': [], 'transmissions': [], 'fuel_types': []}}),
content_type='application/json')
else:
try:
dealer = Dealer.objects.get(id=dealer)
except Exception as e:
logging.error(e)
return HttpResponse(
json.dumps({'filters': {'makes': [], 'models': [], 'years': [], 'transmissions': [], 'fuel_types': []}}),
content_type='application/json')


current_year = datetime.datetime.now().year
start_year = current_year - 30

# First get the make filters
vehicles = Vehicle.objects.filter(dealer=dealer)

if years:
vehicles = vehicles.filter(year__in=years)

filtered_make_names = vehicles.values_list('vehicle_make__name', flat=True)
filtered_makes = VehicleMake.objects.filter(name__in=filtered_make_names)

makes_map = [{
'name': make.name,
'count': vehicles.filter(vehicle_make=make, dealer=dealer).count(),
'id': make.id
} for make in filtered_makes
]

# Second get the model filters

filtered_model_names = vehicles.values_list('vehicle_model__name', flat=True)
filtered_models = VehicleMake.objects.filter(name__in=filtered_model_names)

dealer_models = VehicleModel.objects.filter(
name__in=filtered_models)

new_dealer_models = VehicleModel.objects.filter(name__in=vehicles.values_list('vehicle_model__name', flat=True))


if len(make_ids) > 0:
dealer_models = dealer_models.filter(make__id__in=make_ids)

# Get the actual filters
year_map = [{
'year': yr,
'count': Vehicle.objects.filter(year=yr, dealer=dealer).count()
} for yr in range(start_year, current_year) if Vehicle.objects.filter(year=yr, dealer=dealer).count() > 0][::-1]

models_map = [{
'name': model.name,
'count': Vehicle.objects.filter(vehicle_model=model, dealer=dealer).count(),
'id': model.id
} for model in dealer_models]

filter_map = {
"makes": makes_map,
"models": models_map,
"years": year_map,
"transmissions": [],
"fuel_types": []
}

return HttpResponse(json.dumps({'filters': filter_map}), content_type='application/json')

我想启动 AWS EC2 实例,并将我的代码从我现在拥有的服务器迁移到那里,并且想知道我可以将哪些 AWS 服务与它结合使用来使这些 View 功能更快,为什么?自动缩放是否对此有帮助,还是自动缩放仅在 CPU 达到特定点时才开始?

最佳答案

你需要弄清楚瓶颈是在你的数据库层,还是在你的网络层。

如果瓶颈是你的数据库层,那么在它自己的服务器上一个更大的数据库实例或者引入一个缓存层比如 memcache 或 redis 可能是合适的(django 有针对这两个的插件)

如果瓶颈是您的网站,那么负载均衡器、运行您网站的多个 ec2 实例和自动缩放组的组合可能是合适的。

但首先,您确实需要弄清楚瓶颈在哪里,这样您就不会花时间和金钱优化错误的东西。

关于django - 什么 AWS 服务可以帮助加快缓慢的 Django View 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com