Я создаю сайт как игру.Я хочу обновлять статистику пользователей (золото и т. Д.) Каждые 5 минут.Для этого я настраивал cronjob каждые 5 минут, без проблем.Однако, похоже, что функции firebase могут «зависать», хотя на их сайте они работают около 5 мс.
Я только что обнаружил, что «покупаю» только тогда, когда запускается cronjob (функция запускается), я вижу, что"золото", вероятно, не обновляется, оно устанавливается сразу после того, как я начал покупать.
- Является ли моя функция даже приемлемой?
- Где может быть зависание?Это потому, что я перебираю (сейчас 100) фальшивых пользователей?
- Если так, то почему бы firebase сказать, что на это уходит в основном 5 мс?
- Есть ли способ убедиться, еслиПользователь обновляет так же, как функция собирается обеспечить, чтобы функция обновляла последнее значение?
import * as functions from 'firebase-functions';
import * as admin from "firebase-admin";
import {UnitsDTO} from '../../ProjectXFrontend/src/ModelsDTO/Unit/unitsDTO';
import {CurrencyDTO} from '../../ProjectXFrontend/src/ModelsDTO/Currency/CurrencyDTO';
admin.initializeApp();
export const test = functions.https.onRequest((reques , respon) => {
admin.database().ref('/LastUpdated').set(
admin.database.ServerValue.TIMESTAMP
).then().catch()
return respon.send(reques.ip);
});
export const GetTime = functions.https.onRequest((request , response) => {
return response.send({data: new Date()})
});
export const CalculateBasics = functions.https.onRequest((request , res) => {
if (request.ip === '195.201.26.157') {
CalculateBreeder();
return res.send('ok');
} else {
res.statusCode = 400;
return res.send(new Error('Bad request'))
}
});
export const CalculateIncome = functions.https.onRequest((request , res) => {
if (request.ip === '195.201.26.157') {
CalculateIncomePrivate();
return res.send('ok');
} else {
res.statusCode = 400;
return res.send(new Error('Bad request'))
}
});
function CalculateIncomePrivate() {
admin.database().ref('/users').once('value').then( snap => {
snap.forEach( child => {
const user = child.key // uid
admin.database().ref('users/' + user).once('value').then(snapUser => {
const units = new UnitsDTO();
const currency = new CurrencyDTO();
if (snapUser.hasChild('Units')) { // in units
units.worker = snapUser.child('Units').child('worker').val()
}
if (snapUser.hasChild('currency/gold')) { // gold
currency.goldDto = snapUser.child('currency/gold').val();
}
// calculate news
currency.goldDto.amount += units.worker.amount * units.worker.currencyPerTick;
// set the Income
admin.database().ref('users/' + user + '/currency/gold').set(currency.goldDto).then().catch(error => {console.error(error)})
// update time
admin.database().ref('/status/LastIncome').set(
admin.database.ServerValue.TIMESTAMP
)
.then(() => {
// return res.send('ok');
})
.catch(error => {
// res.statusCode = 500;
// return res.send(error)
});
}).catch(error => {
// res.statusCode = 500;
// return res.send(error);
});
})
}).catch(error => {
// res.statusCode = 500;
// return res.send(error);
})
}
Итак, ожидаемый результат, конечно, в том, что функция обновляет доход пользователя, что она и делает,однако кажется, что он "зависает" и не совсем корректно обновляется из-за того, что пользователь "покупает вещи" при запуске функций.