我们正在实现BatchRequest,以将学生发送到Students/Create的API端点。我们将它们设置如下:
创建BatchRequest
var batch = new BatchRequest(service);
然后我们创建一个回调函数:
BatchRequest.OnResponse<Student> callback = (studentResponse, error, i, message) =>
{
if (error != null)
{
this.context.LogMessage($"Error Adding: Student '{student.StudentEmail} - {student.SectionKey} \r\n {message}'");
}
else
{
studentLinksAdded.Add(studentResponse);
this.context.LogMessage($"Student '{student.StudentEmail}-{student.SectionKey}' was added.");
}
};
然后我们创建一个CreateRequest,这里使用的sectionkey是创建课程时使用的别名(“ d:别名键”)
Student toAdd = new Student()
{
UserId = StudentEmail
};
CoursesResource.StudentsResource.CreateRequest studentCreate = service.Courses.Students.Create(toAdd, sectionKey);
然后排队:
batch.Queue<Student>(studentAddRequest, callback);
最后检查我们是否达到400(创建课程时发现的不可思议的数字具有一定的速率限制,以避免报价问题)或总记录(批量处理其余请求),然后触发调用API。
if (batch.Count % 400 == 0 || totalRecordToProcess == currentRecordProcessed)
{
for (int i = 0; i < 3; ++i)
{
try
{
List<Task> tasks = new List<Task>();
tasks.Add(batch.ExecuteAsync());
tasks.Add(Task.Delay(TimeSpan.FromMinutes(1.25)));
Task.WaitAll(tasks.ToArray());
i = 3;
}
catch (Exception e)
{
if (i == 2)
{
throw e;
}
}
Task.WaitAll(Task.Delay(TimeSpan.FromMinutes(.5)));
}
批处理的WaitAll延迟是为了同意每分钟不发送太多请求(配额)。最后的WaitAll将在请求保证节流30秒之间延迟。
速度指标:
每100批次中有15.21、15.48、15.29(分钟)
因此,如果我们有〜230k的学生记录要添加到课程中,则将在8天内完成。
有什么方法可以加快速度吗?任何帮助将不胜感激。
谢谢!
答案 0 :(得分:0)
恐怕您将不得不在这里进行一些并行处理。您可以使用.NET的并行选项,也可以编写一个接受一组类和学生的可执行文件,并运行它的多个副本(打包工作),但是不需要解决它。 >
Google可以一次处理多个类,并且您可以处理处理和内存要求。由于延迟取决于按顺序进行网络呼叫所花费的时间,因此您需要一种方法来同时进行多个网络呼叫,以便每组呼叫都可以自行等待。