Amit Yadav
Amit Yadav

Reputation: 1

Firestore DB read/write latency is same from public route and private service connect endpoint in GCP

I have firestore DB in GCP. I was accessing the firestore DB via public route and the latency was around 300ms (280-300).

I create a private service connect endpoint to reduce the latency and access DB privately.

But event after PSC endpoint I'm getting same latency.

Below is my script to check endpoint latency, read and write latency.

const admin = require('firebase-admin');
const path = require('path');
const axios = require('axios');


// Initialize Firebase Admin SDK
const serviceAccount = require(path.resolve(__dirname, '/home/amityadav/sa.json')); 
// Replace with your own service account key path

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

console.log('Credentials After initializeApp:', serviceAccount.client_email);

const db = admin.firestore();
const collectionName = 'testCollection';
const documentId = 'testDoc';


const docRef = db.collection(collectionName).doc(documentId);
console.log('Firestore Path:', `projects/${serviceAccount.project_id}/databases/(default)/documents/${collectionName}/${documentId}`);


// Function to test network latency
async function testNetworkLatency(url) {
  const start = Date.now();
  try {
    await axios.get(url);
    const end = Date.now();
    return end - start;
  } catch (error) {
    console.error(`Error accessing ${url}:`, error);
    return -1;
  }
}


// Function to check if accessing DB privately or publicly
async function checkAccessMethod() {
  const privateUrl = 'http://metadata.google.internal'; // Known private endpoint
  const publicUrl = 'https://www.google.com'; // Public endpoint

  const privateLatency = await testNetworkLatency(privateUrl);
  const publicLatency = await testNetworkLatency(publicUrl);

  console.log(`Private Network Latency: ${privateLatency} ms`);
  console.log(`Public Network Latency: ${publicLatency} ms`);

  if (privateLatency > 0 && (privateLatency < publicLatency)) {
    console.log('Accessing Firestore privately.');
  } else {
    console.log('Accessing Firestore publicly.');
  }
}



// Function to write data to Firestore
async function writeToFirestore(data) {
  const startWrite = Date.now();
  try {
    await db.collection(collectionName).doc(documentId).set(data);
    const endWrite = Date.now();
    const writeLatency = endWrite - startWrite;
    console.log(`Write Latency: ${writeLatency} ms`);
  } catch (error) {
    console.error('Error writing to Firestore:', error);
  }
}

// Function to read data from Firestore
async function readFromFirestore() {
  const startRead = Date.now();
  try {
    const docRef = db.collection(collectionName).doc(documentId);
    const snapshot = await docRef.get();
    const endRead = Date.now();
    const readLatency = endRead - startRead;
    console.log(`Read Latency: ${readLatency} ms`);

    // Print the data fetched (optional)
    if (snapshot.exists) {
      console.log('Fetched Data:', snapshot.data());
    } else {
      console.log('No data found');
    }
  } catch (error) {
    console.error('Error reading from Firestore:', error);
  }
}

// Function to execute write and read operations every 2 seconds
async function executeOperations() {
  try {
    const testData = { message: 'Hello, Firestore!' };
    
    // Check if accessing DB privately or publicly
    await checkAccessMethod();

    // Write data to Firestore
    await writeToFirestore(testData);
    
    // Read data from Firestore
    await readFromFirestore();
  } catch (error) {
    console.error('Error executing operations:', error);
  }
}

// Start executing operations every 2 seconds
setInterval(executeOperations, 2000);

I give it a try from cloud shell instance.

Output from my VM shell

Output from Cloud shell

I wanted to achieve cloud shell latency (~80ms), Is it possible in GCP and If yes HOW ?

Upvotes: 0

Views: 45

Answers (1)

Amit Yadav
Amit Yadav

Reputation: 1

After struggeling for 2 days, I came to know that

My script is not connecting to firestore in same region, but in diffrent region (asia-south1). This was the reason behind the increased latency.

When I created firestore and VM in same region I got latency read=10ms and write=9ms.

Still not sure

  1. How to connect to firestore DB in a particuler region, Its only connecting to default DB.
  2. Why Its not respecting the "databaseId:" and "databaseURL" variables ?

Upvotes: 0

Related Questions