我目前正在使用 Heroku 上的一个应用程序,它利用了多个测功机。不幸的是,我遇到了一个问题,这些测功机变得空闲、无响应,并且仅在 24 小时后终止。我正在寻找一种可以显着减少此空闲时间的解决方案。我的理想情况是,如果这些测功机空闲的时间较短,例如 1 小时、30 分钟甚至 2 小时,而不是当前的 24 小时,它们就会自动终止。有没有办法配置 Heroku 来实现这一点?
答案1
Heroku 不提供内置功能来自定义测功机的空闲超时设置。但是,您可以通过在应用程序中实现自定义脚本来解决此问题,该脚本跟踪活动并在测功机在指定的时间范围内处于空闲状态时关闭测功机。
我目前无法访问 Heroku。但这应该能让你接近你想要做的事情:
import requests
from time import sleep, time
# Put your Heroku API key and app name here
HEROKU_API_KEY = 'your_heroku_api_key'
APP_NAME = 'your_app_name'
# URL to manage your app's dynos
HEROKU_DYNOS_URL = f'https://api.heroku.com/apps/{APP_NAME}/formation'
# Headers for the Heroku API
HEADERS = {
'Content-Type': 'application/json',
'Accept': 'application/vnd.heroku+json; version=3',
'Authorization': f'Bearer {HEROKU_API_KEY}',
}
# Track idle time
last_activity_time = time()
IDLE_TIMEOUT = 3600 # 1 hour in seconds
def check_activity():
# Check if the app is idle (placeholder function)
return True # True if there's activity, False if idle
def scale_dynos(quantity):
# Scale dynos up or down
data = {
'updates': [
{
'type': 'web', # Type of dynos to scale (e.g., 'web' or 'worker')
'quantity': quantity, # Number of dynos to scale to
}
]
}
response = requests.patch(HEROKU_DYNOS_URL, headers=HEADERS, json=data)
if response.status_code == 200:
print("Dynos scaled successfully.")
else:
print("Failed to scale dynos:", response.text)
def monitor_dyno():
global last_activity_time
while True:
if check_activity():
last_activity_time = time()
else:
if time() - last_activity_time > IDLE_TIMEOUT:
print("Dyno has been idle for too long, scaling down...")
scale_dynos(0) # Scale down to 0 dynos
break
sleep(300) # Check every 5 minutes
if __name__ == "__main__":
monitor_dyno()