课堂API调用添加学生的表现很慢

时间:2020-08-18 21:20:51

标签: google-api google-api-dotnet-client google-classroom

我们正在实现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天内完成。

有什么方法可以加快速度吗?任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

恐怕您将不得不在这里进行一些并行处理。您可以使用.NET的并行选项,也可以编写一个接受一组类和学生的可执行文件,并运行它的多个副本(打包工作),但是不需要解决它。 >

Google可以一次处理多个类,并且您可以处理处理和内存要求。由于延迟取决于按顺序进行网络呼叫所花费的时间,因此您需要一种方法来同时进行多个网络呼叫,以便每组呼叫都可以自行等待。