Skip to content

Commit

Permalink
feat(functions-load-balancing): update logic removing cron job
Browse files Browse the repository at this point in the history
  • Loading branch information
albertodigioacchino committed Jan 25, 2021
1 parent f6bdb75 commit bc171f5
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 109 deletions.
5 changes: 3 additions & 2 deletions packages/functions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"scripts": {
"lint": "eslint \"src/**/*\"",
"build": "tsc",
"watch": "tsc --watch",
"serve": "npm run build && firebase emulators:start --only functions",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
Expand All @@ -17,7 +18,7 @@
"firebase-admin": "^9.2.0",
"firebase-functions": "^3.11.0",
"axios": "^0.21.1",
"@pipeline/common": "file:./_packages_copy/common",
"@pipeline/common": "^0.2.0",
"express": "^4.17.1",
"lodash": "^4.17.20"
},
Expand All @@ -33,4 +34,4 @@
},
"private": true,
"version": "0.2.0"
}
}
5 changes: 0 additions & 5 deletions packages/functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,3 @@ if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'selectBestRTDBI
exports.selectBestRTDBInstance = require('./load-balancing/selectBestRTDBInstance').selectBestRTDBInstance;
}

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'scheduledSyncStatusJob') {
exports.scheduledSyncStatusJob = require('./load-balancing/syncStatusJob').scheduledSyncStatusJob;
}


Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import * as admin from "firebase-admin";
import {FirebaseCollection, RTDBInstance, RTDBPaths, Status} from "@pipeline/common";
import {PROJECT_ID} from "../utils/rtdb";
import FieldValue = admin.firestore.FieldValue;
import {RTDB_LOCATION} from "../utils/general";
import {moveGameFromRTDBToFirestore} from "./moveGameFromRTDBToFirestore";

const db = admin.firestore();
const logger = functions.logger;

const INSTANCE_ID = `${PROJECT_ID}-default-rtdb`
const INSTANCE_NAME = `${INSTANCE_ID}.europe-west1`

/**
* It triggers when the path /statuses/{userId} of that RTDB instance is updated.
Expand All @@ -26,7 +26,7 @@ const INSTANCE_ID = `${PROJECT_ID}-default-rtdb`
*
*/

export const onOnlineGameStatusUpdate = functions.database.instance(INSTANCE_ID).ref(`/${RTDBPaths.Statuses}/{userId}`)
export const onOnlineGameStatusUpdate = functions.database.instance(INSTANCE_NAME).ref(`/${RTDBPaths.Statuses}/{userId}`)
.onUpdate(async (snapshot, context) => {

const instanceId = INSTANCE_ID;
Expand All @@ -41,18 +41,18 @@ export const onOnlineGameStatusUpdate = functions.database.instance(INSTANCE_ID)
const gameId = nextStatus.gameId as string;

logger.log(`User ${userId} from game ${gameId} going from ${originalStatus.state} to ${nextStatus.state}`);

await db.collection(FirebaseCollection.RTDBInstances).doc(instanceId)
const docInstanceId = instanceId.split(`${PROJECT_ID}-`)[1];
await db.collection(FirebaseCollection.RTDBInstances).doc(docInstanceId)
.update({onlineOnGameCount: nextStatus.state === 'online' ?
FieldValue.increment(1) as any :
FieldValue.increment(-1) as any,
} as Partial<RTDBInstance>);
if (nextStatus.state === 'offline') {
const rtdb = admin.app().database(`https://${INSTANCE_ID}.${RTDB_LOCATION}.firebasedatabase.app`);
const rtdb = admin.app().database(`https://${INSTANCE_NAME}.firebasedatabase.app`);
const snap = await rtdb.ref(`/${RTDBPaths.Statuses}`).orderByChild('gameId').equalTo(gameId).get();
const statuses: Status[] = [];
snap.forEach(s => {
statuses.push(s.val())
statuses.push(s.val());
});
const onlineCount = statuses.filter((s: Status) => s.state === 'online').length;
logger.log(`Online user for game ${gameId}: ${onlineCount}`);
Expand Down
12 changes: 6 additions & 6 deletions packages/functions/src/load-balancing/selectBestRTDBInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as admin from "firebase-admin";
import {checkAuth} from "../utils/auth";
import {runTransactionWithRetry} from "../utils/db";
import {FirebaseCollection, Game, RTDBPaths} from '@pipeline/common';
import {RTDB_LOCATION} from "../utils/general";
import {PROJECT_ID} from "../utils/rtdb";
const db = admin.firestore();
const logger = functions.logger;

Expand Down Expand Up @@ -75,9 +75,9 @@ export const selectBestRTDBInstance = functions.region(
.orderBy('onlineOnGameCount', "asc").limit(1).get();
const bestRTDBInstanceDoc = bestRTDBInstanceQuery.docs[0];
const bestRTDBInstance = bestRTDBInstanceDoc.data();
const bestRTDBInstanceId = bestRTDBInstanceDoc.id;
const bestRTDBInstanceName = `${PROJECT_ID}-${bestRTDBInstanceDoc.id}.${bestRTDBInstance.region}`;

logger.log(`Selected instance ${bestRTDBInstanceId} with ${bestRTDBInstance.onlineOnGameCount} online on game users`);
logger.log(`Selected instance ${bestRTDBInstanceName} with ${bestRTDBInstance.onlineOnGameCount} online on game users`);

/*
if (bestRTDBInstance.onlineOnGameCount >= RTDB_THRESHOLD) {
Expand All @@ -87,7 +87,7 @@ export const selectBestRTDBInstance = functions.region(
}
*/

const rtdb = admin.app().database(`https://${bestRTDBInstanceId}.${RTDB_LOCATION}.firebasedatabase.app`);
const rtdb = admin.app().database(`https://${bestRTDBInstanceName}.firebasedatabase.app`);

const gameRef = db.collection(FirebaseCollection.Games).doc(gameId);

Expand All @@ -96,15 +96,15 @@ export const selectBestRTDBInstance = functions.region(
const game = gameDoc.data() as Game;
if (!game.rtdbInstance) {
transaction.update(gameRef, {
rtdbInstance: bestRTDBInstanceId,
rtdbInstance: bestRTDBInstanceName,
} as Partial<Game>);
await rtdb.ref(`/${RTDBPaths.Games}/${gameId}`).set({
...game,
})
}
});

res.status(200).send({bestRTDBInstanceId});
res.status(200).send({bestRTDBInstanceName});

} catch (e) {
logger.error(e);
Expand Down
87 changes: 0 additions & 87 deletions packages/functions/src/load-balancing/syncStatusJob.ts

This file was deleted.

3 changes: 0 additions & 3 deletions packages/functions/src/utils/general.ts

This file was deleted.

0 comments on commit bc171f5

Please sign in to comment.