Как я могу сократить общее время выполнения моего запроса к Googles Directory API? - PullRequest
0 голосов
/ 25 апреля 2019

Начинающий, использующий среду nodejs.

Я использую приведенный ниже код для чтения всех учетных записей пользователей из домена G Suite клиентов через API-каталог Googles. Я делаю это, чтобы проверить, существует ли каждая учетная запись во внешней службе каталогов клиентов. Учетные записи, которых нет в этой службе каталогов, позже я отправлю в Google запрос на удаление через API каталогов.

Theres приблизительно 20000 пользователей в домене G Suite и из-за ограничения Googles максимального результата 500 учетных записей пользователей за запрос, будет сделано 40 запросов.

Я рассчитал весь процесс, и каждый запрос занимает примерно 2, иногда 3 секунды, прежде чем я получу ответ от Google, и поэтому весь процесс выполняется примерно за 1,5 минуты, иногда до 2 минут. Зацикливание объекта ответа и отправка каждой учетной записи пользователя в массив googleUsers занимает менее миллисекунды, так что пока это не проблема.

Сейчас я смотрю на различные способы сокращения общего времени выполнения, и мои первоначальные мысли касаются того, есть ли способ запустить следующий запрос к API каталога Googles до того, как предыдущий будет завершен и доставит все свои данные? В лучшем случае я могу выполнить все запросы более или менее одновременно и серьезно сократить время выполнения.

Кроме того, на самом деле я не нашел способ сделать это, я также вижу проблему в том, что мне нужен nextPageToken из предыдущего запроса, чтобы иметь возможность сделать новый запрос для следующего набора данных.

Могут ли потоки в nodejs решить мою проблему или как сделать этот код более эффективным?

const getGoogleUsers = async () => {
  try {
    const client = new JWT(key.client_email, undefined, key.private_key,
      ["https://www.googleapis.com/auth/admin.directory.user"], "DOMAINADMIN"
    );
    timer('Authorizeing...');
    await client.authorize();
    timer('Done...');
    const g = new GoogleApis();
    const service = g.admin("directory_v1");
    timer('Getting first 500 users...');

    const res = await service.users.list({
      //'Accept-Encoding': 'gzip',
      auth: client,
      domain: 'DOMAIN',
      maxResults: 500,
      projection: 'full',
      fields: 'nextPageToken,users(id,primaryEmail,name,isAdmin,isDelegatedAdmin,lastLoginTime,creationTime,archived,orgUnitPath,customSchemas)'
    });
    timer('Done...');
    let googleUsers = new Array();
    timer('Looping first 500 users...');
    res.data.users.forEach(user => {
      googleUsers.push({
        'id': user.id,
        'primaryEmail': user.primaryEmail,
        'name': 'name' in user ? user.name.fullName : '',
        'isAdmin': user.isAdmin,
        'isDelegatedAdmin': user.isDelegatedAdmin,
        'lastLoginTime': user.lastLoginTime,
        'creationTime': user.creationTime,
        'archived': user.archived,
        'orgUnitPath': user.orgUnitPath,
        'EXTERNALSYSTEMUserId': 'customSchemas' in user ? user.customSchemas.EXTERNALSYSTEM.userId : null
      })
    });
    timer('Done...');

    //Retrieve all users if more than 500
    let nextPageToken = res.data.nextPageToken;
    if (nextPageToken || typeof nextPageToken !== 'undefined') {
      while (nextPageToken) {
        timer('Getting next 500 users...');
        const res = await service.users.list({
          auth: client,
          domain: 'DOMAIN',
          maxResults: 500,
          projection: 'full',
          pageToken: nextPageToken,
          fields: 'nextPageToken,users(id,primaryEmail,name,isAdmin,isDelegatedAdmin,lastLoginTime,creationTime,archived,orgUnitPath,customSchemas)',
        });
        timer('Done');
        timer('Looping next 500 users...');

        res.data.users.forEach(user => {
          googleUsers.push({
            'id': user.id,
            'primaryEmail': user.primaryEmail,
            'name': 'name' in user ? user.name.fullName : '',
            'isAdmin': user.isAdmin,
            'isDelegatedAdmin': user.isDelegatedAdmin,
            'lastLoginTime': user.lastLoginTime,
            'creationTime': user.creationTime,
            'archived': user.archived,
            'orgUnitPath': user.orgUnitPath,
            'EXTERNALSYSTEMUserId': 'customSchemas' in user ? user.customSchemas.EXTERNALSYSTEM.userId : null
          })
        });
        timer('Done');
        nextPageToken = res.data.nextPageToken;
      }
    }
    timer('All done getting google users');
    return googleUsers;

  } catch (err) {
    console.log(err);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...