|
Rajesh Kumar Oodles

Rajesh Kumar (Backend-Sr. Lead Development)

Experience:6+ yrs

Rajesh Kumar is a highly skilled and experienced Backend Developer with years of expertise in Node.js. He possesses practical experience in working with tools and frameworks like Angular, React, MySQL, PostgreSQL, MongoDB, and Jest, as well as a deep understanding of cloud platforms such as AWS, GCP, and Azure. Rajesh is proficient in various critical software development skills, including API building and implementation, web services, automated testing implementation, and code enhancements. He has successfully contributed to multiple client projects, including Serviceo chat App, Phyrstech, Unikaksha, Nowcast, and many others, delivering exceptional results. Rajesh has excellent analytical skills and enjoys learning new technologies.Additionally, he likes to travel and explore new places in his free time.

Rajesh Kumar Oodles
Rajesh Kumar
(Sr. Lead Development)

Rajesh Kumar is a highly skilled and experienced Backend Developer with years of expertise in Node.js. He possesses practical experience in working with tools and frameworks like Angular, React, MySQL, PostgreSQL, MongoDB, and Jest, as well as a deep understanding of cloud platforms such as AWS, GCP, and Azure. Rajesh is proficient in various critical software development skills, including API building and implementation, web services, automated testing implementation, and code enhancements. He has successfully contributed to multiple client projects, including Serviceo chat App, Phyrstech, Unikaksha, Nowcast, and many others, delivering exceptional results. Rajesh has excellent analytical skills and enjoys learning new technologies.Additionally, he likes to travel and explore new places in his free time.

LanguageLanguages

DotEnglish

Bilingual

DotHindi

Fluent

Skills
Skills

DotPython

60%

DotClient Handling

60%

DotWebhooks

60%

DotHTML, CSS

80%

DotRedis

80%

DotReactJS

80%

DotJavascript

100%

DotMySQL

80%

DotFullstack

100%

DotStripe API

60%

DotElectronJS

60%

DotReact Native

80%

DotAngular/AngularJS

80%

DotPostgres

80%

DotPayment Gateway Integration

60%

DotNode Js

100%

DotWebSocket

60%

DotNo SQL/Mongo DB

80%

DotRESTful API

60%

DotDevOps

80%

DotMern Stack

100%

DotProject Management

60%
ExpWork Experience / Trainings / Internship

Oct 2020-Present

Sr. Lead Development

Gurugram


Oodles Technologies

Gurugram

Oct 2020-Present

Aug 2019-Sep 2020

Software Engineer

Delhi


Globalhunt India Pvt Ltd

Delhi

Aug 2019-Sep 2020

Jan 2019-Aug 2019

Software Engineer

Noida


ANSIT Services Pvt Ltd

Noida

Jan 2019-Aug 2019

Jan 2018-Jan 2019

Software Engineer

Remote


Freelancer

Remote

Jan 2018-Jan 2019

EducationEducation

2014-2018

Dot

MDU

Bachelor In Technology-Computer Science Engineering

certificateCertifications
Dot

AWS Developer Associate

AWS

Issued On

Aug 2021

Top Blog Posts
Meeting Conference With Ant Media

In this blog post, we shall discuss different types of video conferencing solutions in Ant Media Server.

 

Stream-Based SFU Video Conference

This is the first implemented solution in AMS. It works with WebRTC streams directly.

  1. When a participant joins a room, they will send a join request to AMS for the room.
  2. AMS responds with the stream ID(stream_id) for the participant and the list of the other participant's stream IDs(stream_id) in the room.
  3. He/She will start to publish a WebRTC stream with his stream ID(stream_id).
  4. He/She sends WebRTC play requests for each stream ID he gets one by one.
  5. The information for the newly joined/left participants he/she should get room info (which contains the stream IDs of the room) periodically and compare the returning current stream IDs with the previous list he has.
  6. He/She sends play requests for new stream IDs, and stops requests for removed IDs.
  7. The calling leave method in Ant Media is enough to leave the room. (no need to send a stop request for each ID). 
  8. Stream-based SFU Video Conference solution works in the clustered mode. Publish and all play request sent by a participant is forwarded to the same node in the cluster. So, there is no need to make the origin-edge distinction in such type of a cluster.

 

Also, Read Delegation Pattern and The By Keyword
 

Track-Based SFU Video Conference

This is a recent conference solution in AMS. It works with WebRTC tracks instead of streams. Users can find more about multitrack streaming in this blog post.

  1. When a participant joins a room, he/she sends a join request to AMS for the room.
  2. AMS responds with the stream ID(stream_id) for the participant.
  3. He/She starts to publish a WebRTC stream with his stream ID(stream_id).
  4. He/She sends only one WebRTC play request for the room ID.
  5. AMS sends the notification in the app for the newly joined/left participants. (Used for UI).
  6. The calling leave method is enough to leave the room and leave the meeting.

 

Also, Read How To Improve Angular Application Performance
 

 

MCU Video Conference

In an MCU Video conference, the user will get only 1 output stream for 1 room. This stream contains the merged video and mixed audio. The drawback of this type of conference is that users will hear your own audio in the mixed audio. So MCU is used in addition to other types of video conference solutions to get a single stream to record or share the video/ audio players(not participants) for the room.
Users can enable this Video Conference by sending a join request with the mode="mcu" parameter. Users can also check the conference.html sample page for JS SDK. To stop hearing of their own audio, users can customize this page by playing the merged video but not a mixed audio. Instead of mixed audio, you can play audio streams for each participant individually.

 

Category: ERP Solutions
Header Bidding: An Advanced Programmatic Advertising Technique

Header bidding is an advanced programmatic and more secure advertising technique that allows publishers to offer their ad inventories to multiple ad exchanges and ad networks simultaneously. Essentially header bidding is a programmatic auction where bid requests are sent to multiple demand partners(ad exchanges and ad networks) in real time, maximizing the value of ad inventory. 

 

Challenges To Displaying Ads

  • Not able to display multiple Ads: The player cannot play various ads while watching original content as it happens on Youtube. 
  • Faster loading time: Header bidding decreases the time that sells an impression and renders an ad on the page(website). It also improves user experience and SEO results. 

 

How To Create a Header Bidding Tag?

1)Create bidders in Google Ad Manager

  • Sign in to Google Ad Manager.
  • Click Delivery > Bidders.
  • Click on the Header bidding tab.
  • Click New bidder.
  • In “Select a bidder”, search for the bidder and select one bidder.
  • In “Enable header bidding”, click on the "Continue" button.
  • Click Delivery > Yield groups.
  • Click on New yield group.
  • Enter a unique yield group Name that will use for reporting.
  • Select the Banner ad format.
  • Select the Web inventory type.
  • Click Add yield partner.
  • Select any yield partner from the dropdown.
  • Select the Header bidding integration type.
  • Click Save.

 

2)Create bidders in Adbutler

  • Do sign in with a username and password on the admin panel.
  • Create a Publishers -> Your Publishers.
  • Click on Header Bidding Setup.
  • Copy the script and place it in any editor.
  • Go to the zone section for which you want to use Header Bidding.
  • Click on Header Bidding Tags.
  • Copy the code from the Zone Entry field and place it in the header script where it says ZONE ENTRIES GO HERE

 

How To Use a Header Bidding Tag To Show Ads?

1)Copy the script from the ad exchange and paste it into the head section in HTML.


if (!window.AdButlerHB){(function(){var s = document.createElement("script");s.async = true; s.type = "text/javascript";s.src = 'https://ads.com/hb_app.js';var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(s, n);}());}
var AdButlerHB = AdButlerHB || {}; AdButlerHB.cmd = AdButlerHB.cmd || [];
AdButlerHB.timeout = 700;
AdButlerHB.cmd.push(function(){

AdButlerHB.registerAuction('abhb_91097_1', [[300,250]],59604456, 18455170, "ads.com");

AdButlerHB.requestAuctions();
});

2)Copy the div code from the ad exchange and paste it into the section in HTML where you want to display ads.      

     <div id="abhb_91097_1"></div>

          

Conclusion

Header Bidding tag is the well suitable and most appropriate way to display multiple ads on the website. It also increases the website load time with ads. It also provides better ad management from the ad exchange server. It gives location-wise ads and also displays ads according to user suggestions.  

 

At Oodles ERP, we provide custom ERP software development services to help cross-industry enterprises achieve their business goals. Our team has more than a decade of experience in building custom ERP solutions using open-source platforms like Odoo, ERPNext, OFBiz, and more. To learn more about our ERP application development services, reach out at [email protected]

An Introduction To VAST Tag and Its Significance

A VAST tag (Video Ad Serving Template) is a script that allows video players and ad exchange servers to communicate with each other in an effective way. Ad exchange servers generate these VAST tags. A VAST tag gives instructions to video players on how to retrieve an ad, when to render the ad (means after the content start, in mid of the content, and at end of the content), and the type of ad media (like video, images), along with the ad length, format, duration, tracking information, and pricing(pricing of the content when user see the ad). Using XML schema, VAST transfers metadata from the master video ad slot source in a format readable by humans and computers, making them an accessible tag type for video ads. When a video player understands VAST, it is able to play all third-party video ads that are mentioned in the ad exchange server also other ads, regardless of the publisher's ad server or ad network.

 

Challenges In Playing Ads

  • Not able to play multiple Ads: The player cannot play various ads while watching original content as it happens on Youtube. 
  • Time frame video ads: Maintaining time frame advertisements in a video player without using plugins is not possible. Also, these things should be managed from some ads exchange.

 

How To Create a VAST Tag?

1)Create a VAST Tag in Google Ad Manager

  • Sign into Google Ad Manager using your Username and Password
  • Click on Inventory >> Ad Units
  • Locate the ads unit options and click on Tags
  • Fill out the option for each section like Tag type, Tag Option, and Tag Results, clicking continue after each step
  • Click on Copy Tag

 

2)Create a VAST Tag in Adbutler

  • Do sign in with a username and password on the admin panel.
  • Create a VAST campaign.
  • Add media items to the campaign.
  • Create a VAST zone where you want to display the advertisements.
  • Assign the VAST campaign to the VAST zone.
  • Copy the vast tag from the zone.

 

How To Use a VAST Tag To Play Ads On The Video Player (videojs)

1)Videojs player requires a videojs-vast-vpaid package to play.  Do the following steps.

  • Do npm i videojs-vast-vpaid --save for Angular, Reactjs. 
  • Use CDN of videojs-vast-vpaid for others.

2)Use the following code in Angular, and Reactjs.     

             videojs.vastClient({
                adTagUrl: "ad exchange vast tag url"
           });

3)Use the following code for others. Use this code directly in the video tag.

           data-setup='{ "plugins": { "vastClient": { "adTagUrl": "ad exchange vast tag url" } } }'

          

Conclusion

VAST(Video ad serving template) tag is the well suitable and most appropriate way to display multiple ads within a time frame on a video player. It also gives options to manage to skip ads and know more information about particular ads.

 

We, at Oodles, provide complete enterprise software solutions to help enterprises sail through their routine operational challenges. Our end-to-end ERP application development services cater to the diverse industry-specific needs of our clients with a focus on solving complex business problems. Contact us at [email protected] for more detail. 

Developing SEO Friendly Application Using Angular

In this blog, we will learn how to make Angular projects SEO-friendly. SEO is one of the most important things for a web application. I know you may have questioned whether we can use search engine sitemaps. Angular is a single-page application and browser rendered (by default) which loads the content dynamically in one HTML file. Whenever search engines search the website, they only see one HTML file which is the main HTML file, hence it will fail to make the website SEO friendly.

So whenever you want to make angular SEO friendly you can use this functionality of angular. In this functionality, we are converting Angular projects from browser rendering to server-side rendering.

 

Challenges I Face On Angular Without SSR

  • Content invisible for bots - Angular does not reload the pages unless the user does so. It does change the metadata of the pages dynamically which is entirely Javascript based. Basically, Search engine crawlers are not supported Javascript changes files. Due to this Angular failed to render the right content or metadata.
  • Loading speed limitationAnother significant limitation of Angular apps that makes them SEO- friendly is speed. Angular apps are easy to scale, user-friendly, and powerful. Most angular sites first load blank screens for some odd seconds before rendering the actual home page.
  • Getting only one preview- Whenever I share any page of my project to any social media platform, it only shows the default angular page preview. We are updating the meta and title on the page dynamically, however it does not show changes on social media networks.

 

The Solution To Make Angular Apps SEO-Friendly

 

Dynamically Rendering

The Major limitation for Angular websites regarding SEO is that it fetches data via API calls and doesn't have many HTML files for google to crawl. An easy solution to this problem is to make a dynamic rendering tool that can help to create static HTML files which can be easily crawlable, and consumable.

 

Setup titles and metadata

Search engine crawlers collect data from the titles and metadata available on the web page. For adding metadata and title dynamically, we need to use Meta, Title from @angular/platform-browser.  Inject Meta and title in the component where you want to title and meta data.

import { Component } from "@angular/core";
import { Meta, Title } from "@angular/platform-browser";

@Component({
    selector: 'app-movie',
    templateUrl: './movie.component.html'
})
export class MovieComponent {
    constructor(
        private _Title: Title,
        private _Meta: Meta
    ) {


        this._Title.setTitle('From Movie Component ...');
        this._Meta.updateTag(
            { name: 'og:title', content: "From Movie Component ..." }
        );
        this._Meta.updateTag(
            { property: 'og:thumbnail', content: 'https://assets.snappages.site/global/assets/theme/church/children_02.jpg' }
        );
        this._Meta.updateTag(
            { property: 'og:url', content: 'https://assets.snappages.site/global/assets/theme/church/children_02.jpg' }
        );
        this._Meta.updateTag(
            { property: 'og:image', content: 'https://assets.snappages.site/global/assets/theme/church/children_02.jpg' }
        );
    }
}

The above code will update the data of the title and of all meta tags.

 

Angular Universal or Server Side Rendering

A normal Angular application executes or runs in the browser, and renders pages in the DOM as per the response to the user's actions. Angular Universal (server-side rendering) executes on the server, generating individual static application pages that get bootstrapped on the client side. It means that the application renders more quickly, giving users a chance to view the application layout before it becomes fully interactive.

 

Implement Angular Universal or Server Side Rendering 

 

​​1) Create New Angular App

       ng new project_name --style=scss --routing=true

 

2) Install Angular Universal

      ng add @nguniversal/express-engine --clientProject project_name

When we run the above command, it creates some files and also makes updates in some files inside the "src" folder.

index.html                             // <-- app web page
main.ts                                  // <-- bootstrapper for client app
main.server.ts                       // <-- * bootstrapper for server app
style.css                                // <-- styles for the app
app/  …                                   // <-- application code
      app.server.module.ts     // <-- * server-side application module
server.ts                                // <-- * express web server
tsconfig.json                        // <-- TypeScript base configuration
tsconfig.app.json                // <-- TypeScript browser application configuration
tsconfig.server.json            // <-- TypeScript server application configuration
tsconfig.spec.json              // <-- TypeScript tests configuration

 

3) Test application 

     npm run build:ssr && npm run serve:ssr

 

Conclusion

Server-side rendering in angular makes the browser SEO-friendly and decreases the page load time. When we share any angular server-side rendered page on social media, it displays the preview of that page, loads images, and displays titles.  

 

At Oodles ERP, we provide end-to-end ERP application development services to help enterprises sail through their routine operational complexities. To learn more about our custom ERP application development services, reach out at [email protected].

Scaling WebSocket Servers

What is Horizontal Scaling?
Horizontal scaling means scaling out refers to adding additional nodes or machines to your infrastructure according to new demands. Adding more servers is the only solution if the server does not have the capacity and capability to perform actions. A load balancer will be required to distribute the traffic to multiple microservice instances.

We need scaling or horizontal scaling when the user base increases and the server is not able to handle user requests. To give better and high performance to users we need to increase the capacity of the server. So, it is necessary to provide such a feature to increase/decrease the number of servers whenever require to meet the user’s demand.

 

Quick Recap

We implemented NodeJs, express js, and Redis Pub/Sub for the WebSocket server. Communication between the web application and mobile application(android,ios) (frontend) and WebSocket server is via WebSocket, while communication between the microservices (backend) and WebSocket server is via API and publish-subscribe messaging pattern.

 

What Are The Issues and Solutions?

The design work which we did earlier was perfectly fine in a setup where we only have a single instance of each microservices. However, having a single instance is not practically correct for the production environment. Generally, we deploy microservices with multiple replicas or instances for high availability and high performance in the production environment. There are some issues when we try to horizontally scale the multiple WebSocket microservice servers or backend microservices.

 

Issue #1: Messages are lost due to the load balancer

When we add APIs for backend microservices to send messages to the WebSocket server for unidirectional real-time communication, the load balancer helps to handle traffic redirection when scaling more WebSocket servers or instances.

An instance of the web application or mobile application establishes a WebSocket connection to instance B. When the backend server tries to send messages to the web application or mobile application, the load balancer redirects the API request to instance A. In this case instance, A does not have a socket connection to that particular instance of the web application or mobile application, so messages will be lost.

 

Solution for Issue #1: Broadcast messages using Redis Pub/Sub

We can introduce a broadcasting channel using the Redis publish-subscribe messaging pattern where all messages received from the backend microservices will be broadcasted to all WebSocket server instances. This ensures that all web applications or mobile application instances (frontend) will receive that message via WebSocket from the WebSocket server.

 

Issue #2: Messages are processing duplicately because multiple backend subscribers to a single topic

 

We used Redis Pub/Sub to handle bidirectional real-time communication between the WebSocket server instances and backend microservices. When we scale up the many WebSocket servers and backend microservices, Redis Pub/Sub receives duplicate messages.

 

Take a look at the message flow in each direction in bidirectional real-time communication.

  • Message Flow: Microservices to frontend application (no duplicate message processing) → Main requirement for all instances of the WebSocket server to receive the messages as each frontend application establishes a WebSocket connection with only a single WebSocket server instance. So, when messages flow from the backend microservices to the frontend application (backend service → WebSocket server → frontend application(web/mobile)), only one instance of the frontend application will receive the message, which is the correct behavior of the application.
  • Message Flow: Frontend application to microservices (duplicate messages processing) → When messages are flowing from the frontend application to the backend microservices (frontend(web/mobile) → WebSocket server → backend microservice), we would expect only one instance or microservice of the backend to process the message. So, all backend microservices as subscribers will receive the message, resulting in the message being processed multiple times, which is incorrect behavior of the application.

 

Solution for Issue #2: Redis Pub/Sub with consumer groups

We shall use the concept of Consumer Groups which is introduced by Redis Streams. In this, only one subscriber receives the message for processing. This Redis stream service ensures that there will be no duplicated message processing as only one backend microservice instance will receive the message.

 

Conclusion

We take all the design considerations on how to scale the WebSocket server in a microservice architecture horizontally. Firstly, we are using Redis publish-subscribe messaging patterns to ensure that there is no message loss or duplicated message processing in the process of real-time communication between the web application and mobile application and also in backend microservices.

 

We, at Oodles, provide complete ERP application development services to help enterprises sail through their routine operational challenges. Our development team uses the latest tech stack and agile methodologies to build custom enterprise solutions at cost-effective rates. To learn more about our custom iERP development services, drop us a line at [email protected].

Banner

Don't just hire talent,
But build your dream team

Our experience in providing the best talents in accordance with diverse industry demands sets us apart from the rest. Hire a dedicated team of experts to build & scale your project, achieve delivery excellence, and maximize your returns. Rest assured, we will help you start and launch your project, your way – with full trust and transparency!