Начинающий, использующий среду 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);
}
}