I'm Faizal from Pune, India. I am a Google certified associate cloud engineer and a full-stack developer with five years of experience in designing, developing, and deploying scalable, highly available, and secure applications on web 2.0 and 3.0 technology stack. I have solid expertise on web 2.0 technology such as React, Angular, Node, MongoDB, and SQL. Moreover, I have hands-on experience on web 3.0 technologies such as Ethereum, Polygon, Solidity, and IPFS.
Recently, I developed a cross-platform application for an American client in the domain of automobile servicing. It involved user authentication, scheduling automobile servicing appointments, pick-up and drop-off tracking, service history of a vehicle, and nudging users for regular servicing. We used React and React Native for the front end and Node.js and MongoDB for the back end, deployed on Microsoft Azure. This tech stack provided dynamic scalability, business continuity, and low operational cost to our client.
React and React Native: We needed to create a cross-platform application. The shared library between React and React Native reduced the time and effort needed for the front end, promoting reusability.
Node.js and MongoDB: Node.js scales well and integrates smoothly with MongoDB. MongoDB provides horizontal scaling with sharding out of the box.
Microsoft Azure: As a Microsoft Azure partner, we chose Azure to reduce costs for the client while providing dynamic scalability and business continuity.
v
Created a separate performance testing environment on Azure cloud.
Used Azure serverless functions for dynamic scalability.
Deployed load balancers to distribute load evenly.
Used JMeter to track performance and tweak the architecture based on assumed queries per second and requests per second.
It depends on the expected number of users. The queries per second and requests per second should be based on the user load, which affects both application and database layers. It’s a case-by-case basis rather than a fixed number.
Used Microsoft Azure serverless functions for dynamic scalability, allowing Azure to handle deployment and scalability.
Implemented horizontal scaling in MongoDB using sharding based on the state the car belonged to.
Created multiple read replicas to handle read queries, separating them from write transactions.
Atomicity: Ensures complete transactions; if one part fails, the entire transaction fails.
Consistency: Maintains the database in a valid state as per the constraints after a transaction.
Isolation: Concurrent transactions result in the same state as if executed sequentially.
Durability: Ensures committed transactions remain in the database despite failures.
Layering ensures separation of concerns, unit testability, and code reusability. A common approach is dividing the application into controller/routing layer, services/business logic layer, and repositories/data access layer. It’s crucial for maintainable and scalable code architecture.
WHERE: Adds conditions on rows in the table.
HAVING: Adds conditions on aggregations obtained from those rows.
ON: Defines join conditions between tables.
WHERE: Defines filter criteria on the joined rows.
An API gateway sits between clients and services, acting as a reverse proxy to route requests from clients to APIs. It handles authentication, monitoring, load balancing, SSL termination, caching, static response handling, and more. It encapsulates the internal structure of the application, providing a single entry point for clients.
We used Redis for in-memory caching to store frequently accessed data. For example, master data was loaded into Redis during service startup to reduce load on MongoDB read replicas.
Use Redis for faster access to frequently accessed, non-permanent data, and MongoDB for permanent, schema-less document storage. For example, we used Redis for leaderboards that change frequently but are accessed often, while MongoDB stored the permanent servicing data.
Node.js handles asynchronous operations by offloading I/O requests to separate threads. Once the operation is complete, an event is placed in the event queue, which the event loop continuously checks, ensuring efficient handling of concurrent operations.