現在、無料トライアルモードでGoogleクラウドプロジェクトを進めています。私は、データベンダーからデータを取り出してデータストアに格納するためのcronジョブを持っています。私は数週間前にデータのカップルを取得するコードを書いたが、すべて正常に動作していたが、突然、私はエラー "DeadlineExceededError:HTTPリクエストに応答するための全体的な締め切りを超えた"最後の2日間。私はcronの仕事は60分後に私はなぜエラーを取得している任意のアイデア後にタイムアウトすることになっていると思う?私は希望cron job throwing DeadlineExceededError
クーロン・タスク
def run():
try:
config = cron.config
actual_data_source = config['xxx']['xxxx']
original_data_source = actual_data_source
company_list = cron.rest_client.load(config, "companies", '')
if not company_list:
logging.info("Company list is empty")
return "Ok"
for row in company_list:
company_repository.save(row,original_data_source, actual_data_source)
return "OK"
リポジトリコード
def save(dto, org_ds , act_dp):
try:
key = 'FIN/%s' % (dto['ticker'])
company = CompanyInfo(id=key)
company.stock_code = key
company.ticker = dto['ticker']
company.name = dto['name']
company.original_data_source = org_ds
company.actual_data_provider = act_dp
company.put()
return company
except Exception:
logging.exception("company_repository: error occurred saving the company
record ")
raise
RestClient
def load(config, resource, filter):
try:
username = config['xxxx']['xxxx']
password = config['xxxx']['xxxx']
headers = {"Authorization": "Basic %s" % base64.b64encode(username + ":"
+ password)}
if filter:
from_date = filter['from']
to_date = filter['to']
ticker = filter['ticker']
start_date = datetime.strptime(from_date, '%Y%m%d').strftime("%Y-%m-%d")
end_date = datetime.strptime(to_date, '%Y%m%d').strftime("%Y-%m-%d")
current_page = 1
data = []
while True:
if (filter):
url = config['xxxx']["endpoints"][resource] % (ticker, current_page, start_date, end_date)
else:
url = config['xxxx']["endpoints"][resource] % (current_page)
response = urlfetch.fetch(
url=url,
deadline=60,
method=urlfetch.GET,
headers=headers,
follow_redirects=False,
)
if response.status_code != 200:
logging.error("xxxx GET received status code %d!" % (response.status_code))
logging.error("error happend for url: %s with headers %s", url, headers)
return 'Sorry, xxxx API request failed', 500
db = json.loads(response.content)
if not db['data']:
break
data.extend(db['data'])
if db['total_pages'] == current_page:
break
current_page += 1
return data
except Exception:
logging.exception("Error occured with xxxx API request")
raise
あなたがブロックまたはレート制限されていないと仮定すると@momusが示唆するように、それぞれのセーブを実行するタスクをディスパッチ考えます'load'関数の' while'ループの繰り返しです。そうすれば、データストアの更新を開始する前に 'load'が完了するまで待つ必要はありません。また、それぞれのインスタンスで 'put()'を呼び出すのではなく、 'ndb.put_multi'を使うことも考えられます。 – snakecharmerb
関連(はい、私はそれが本当に別の質問であることを理解しています):https:// stackoverflow。com/questions/45594018/deadlineexceedederror-the-overall-for-the-http-request-for-the-http-request-w –
これらのcron要求を処理するサービスには、どのようなスケーリングとインスタンスタイプを使用しますか? –