Я пишу скрипт python, который выполняет следующие действия.Python MongoDB запрашивает данные сегмента в куски
запрос по MongoDB базы данных анализа и совокупные результаты загрузки данных в таблицу ServiceNow через REST API
Скрипт работает, однако, набор данных слишком велик, а время ОСТАЛЬНЫЕ транзакций через 60 секунд (соединение закрывается сервером ServiceNow в пункте назначения).
Мне нужно будет сегментировать данные в куски и отправлять отдельные транзакции REST для каждого блока данных, чтобы гарантировать, что полный набор данных отправляется через POST без превышения предела таймаута.
Как я могу достичь этой цели, изменив сценарий ниже?
#!/usr/bin/env python
from config import *
import os, sys
mypath = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(mypath, "api-python-client"))
from apiclient.mongo import *
from pymongo import MongoClient
import json
import requests
from bson.json_util import dumps
client = MongoClient(mongo_uri)
#Create ServiceNow URL
svcnow_url = create_svcnow_url('u_imp_cmps')
#BITSDB Nmap Collection
db = client[mongo_db]
#Aggregate - RDBMS equivalent to Alias select x as y
#Rename fields to match ServiceNow field names
computers = db['computer'].aggregate([
{"$unwind": "$hostnames"},
{"$project" : {
"_id":0,
"u_hostname": "$hostnames.name",
"u_ipv4": "$addresses.ipv4",
"u_status": "$status.state",
"u_updated_timestamp": "$last_seen"
}}
])
j = dumps({"records":computers})
#print(j)
#Set proper headers
headers = {"Content-Type":"application/json","Accept":"application/json"}
#Build HTTP Request
response = requests.post(url=svcnow_url, auth=(svcnow_user, svcnow_pwd), headers=headers ,data=j)
#Check for HTTP codes other than 200
if response.status_code != 200:
print('Status:', response.status_code, 'Headers:', response.headers, 'Response Text', response.text, 'Error Response:',response.json())
exit()
#Decode the JSON response into a dictionary and use the data
print('Status:',response.status_code,'Headers:',response.headers,'Response:',response.json())
ОБНОВЛЕНИЕ: У меня есть план, но я не уверен, как его реализовать.
- Установите курсор на фиксированный размер партии 1000 записывает каждое
- Когда партия полна, создать выход JSON и отправить данные через запросы
- В цикле: продолжать захватывая новую партию и отправку каждая партия к месту назначения до полного набора данных достигается
https://docs.mongodb.com/v3.0/reference/method/cursor.batchSize/
в принципе я думаю, что я могу решить эту проблему путем создания партий и loopin g через партии, с новым вызовом API каждый раз. Пожалуйста, дайте мне знать, есть ли у кого-нибудь идеи, если это хороший план и как реализовать решение. Благодарю.
Кто-нибудь есть какие-либо предложения, по крайней мере там, где начать? Я застрял. Спасибо. – pengz