With over 15 years of experience in software development and engineering, I am currently a Backend Developer at IBM, where I work on creating innovative and scalable cloud solutions using Golang and Docker. I am passionate about leveraging cloud technologies to deliver value to clients and stakeholders, and to solve complex business challenges.
As a certified ScrumMaster and a team leader, I have successfully led and managed multiple projects throughout the software development life cycle, using Agile methodology and best practices. I have also mentored and coached junior developers, and facilitated cross-functional collaboration and communication. I have a strong technical background and a working knowledge of NodeJs, Typescript, docker-compose, SnapTelemetry, and Modbus REST API. I am always eager to learn new skills and tools, and to explore new domains and opportunities.
Cloud Developer
IbmPrincipal Software Engineer
F5Senior Technical Lead
Infinite Computer SolutionsSenior Engineer
Continental Automotive ComponentsProject Lead
L&T Technology ServicesProject Lead
Persistent SystemsSystem Analyst
Atos IndiaSenior Software Engineer
Kpit Cummins Infosystems
DEX
.png)
Docker
.png)
Jenkins

Angular

GitHub

Linux

AWS Kinesis

Docker Swarm

Prometheus
I have approximately 16 years of experience in the industry. Out of that, almost 8 years, I've been working in Go lang, Kubernetes, Docker, and SysAdmin. Recently, I've gained exposure to Google Cloud. So these are the major technologies I've been working with. Other than this, the major projects I've worked on in Golang are mostly of two types: either those with high-frequency data coming in, which we transform into some form or other, or rest services. These are the projects I've worked on. We would need to make the process go smoothly, not just data from MongoDB without a hitch. For MongoDB, we have a method of indexing data. If a large volume of data is coming into MongoDB, we can index the data. Based on the index, we can actually identify the data very quickly, which prevents performance issues, and we can continue with operations without lag or issues on the application side.
So, basically, when designing an application to handle a large throughput of data, incorporating both mobile-driven and mobile caching, the application has to be designed in such a way that it can retrieve data by means of cache if not in MongoDB. So, basically, before even going to MongoDB, you can query the cache. And once you have the cached data, you can get the data and respond with that data. If not, then you can go to MongoDB. And with MongoDB also, you can optimize your queries to research based on indexing. Some sort of indexing, such as hashing, can be implemented, and that can actually help us out in incorporating a high throughput of data with MongoDB.
I can structure a Compass Go code base to follow solid principles while taking advantage of cooperatives, which is for scale resolution. A Compass Go code base can be structured in a way where the solid principles, specifically single responsibility, are defined, which can then be distributed to a specific structure, and that structure can have the implementation of the method inside the interface that defines the single responsibility. The Liskov substitution principle states that you can replace the structure with the interface it's implementing. For instance, I have a DB interface, so I can have multiple DB implementations in my code, and I can just use the interface instead of using their structure. With that, I can call the methods on that interface, and I should be able to achieve the same operation with any DB implementation in place. The SOLID principles are a set of guidelines for designing object-oriented code. S stands for single responsibility, O stands for open-closed, L stands for Liskov substitution, I stands for interface segregation, and D stands for dependency inversion. However, the dependency inversion principle does not directly apply to Golang. After implementing this Go code base, we can have the deployment files, resources files, service files, and environment files. We can also have the ingress, egress, and other files for the applications. Via that, we can deploy the application to a cluster in a specific namespace. The application can then be deployed and communicate with other applications using the egress ingress properties on the queue using the queue proxy. We can also define how many instances of an application would be running by default.
Audio voice condition going. What are we? To avoid a risk condition, what you can do is, whenever you're running an application, you can actually put it on the mutex section. So, basically, mutex lock and mutex unlock can actually help you avoid the risk conditions when writing to the MongoDB collection. That's one. Second thing, whenever you're running the application, you can actually introduce try-except blocks, which can actually tell you where the raise conditions are there, and you can resolve those raise conditions. So, these are the ways. Or maybe another way of resolving this would be, you can actually pass the data to the channel that you can define a channel for the data. And on that, you can listen to that channel, and then you can write the data which you're receiving via that channel to MongoDB. That way, it is, by default, mutually exclusive. That way, we can actually avoid risk conditions.
Is what we're scaling your MongoDB replica set in Kubernetes based on different workload patterns. Strategy. A strategy for automatically scaling your MongoDB replica set in Kubernetes based on different workload patterns. Okay. What can we do for this? So, basically, we can define the DB patterns in such a way that it creates a replica set, scaling among the replicas in Kubernetes. So, you can actually have some replicasets in place for the MongoDB by default. Or, let's outline a strategy for automatically scaling your MongoDB replica set in Kubernetes based on different workload patterns. What can be done for this? You can create a MongoDB replica set, have the default MongoDB run three instances, and then define how the replicas would be created and at what point the synchronization between the replicas would happen. Those frequencies have to be defined. Since you're defining a database, that database has to have some mechanism by which it can decide upon how the data is written. So, what you can do is deploy the MongoDB on the Kubernetes side. And then, based on the memory or data consumption on the node, you can define if you want to scale up or scale down. You can define that, and that's how you would create the replicas of the MongoDB runtime. And then you can keep monitoring the matrix of the MongoDB application via Prometheus or some monitoring system. Using Kubernetes, you can also do that. And, yeah, these could be some strategies. You can provide some sort of load testing or load testing validations as well.
There are more channels and more visibility even than a microservice. Going to build a scalable event-driven microservice architecture. So, basically, what you can do is you can create an application that can create goroutines based on the load of the application. Now, let's say I have to process a large volume of data; in that case, I can actually keep increasing the goroutines, or maybe you can do it the other way around. What you can do is have a set of goroutines that can run in parallel based on the system where they are being deployed. And then, you can scale that application if the load on the system of the application is, let's say, 80% or 85%. That's the threshold we can define. Based on that threshold, the application can create one more replica set and one more, it can scale up. After scaling up, it can actually handle the load being sent to that particular application. It can start handling the load on that other application as well. So, the replica of the current application, and that way, we should be able to scale the built application, which can actually have different channels and goroutines in place, and those can actually keep increasing or decreasing based on the load of the system.
Which pattern would you apply to ensure that Go services can communicate effectively with different database technologies in a Polygon persistence setup. The Google My Services can communicate effectively with different databases in a PolyWord processing setup. Right. In a PolyGuard processing setup. So, basically, if we have to have multiple database technologies in place inside the Go microservice, in that case, you can always have an interface in place, and you can hide the database implementations behind the interface, which ensures that you're communicating with the interface, not the specific database. You're communicating with the interface. Alternatively, we've ensured that Google services communicate with different databases in a PolyGuard persistence PolyGuard persistence setup. In a polygon process, it is. How would you do that? How would you do that? Perhaps what you can do is that when you don't need a Polygon process. Polygon means many. So, many database technologies in a persistent setup. What you can do is have a separate repository built. Maybe. If I'm correct, you can build different repositories for different databases like MongoDB, Postgres, Cassandra. You can have all those things set up in different repositories. When your application is starting up, you can use a factory to create those applications, and then you can use multiple databases in your application. I believe that's what you meant by this question.
Their approach to setting up a service mesh architecture. Approach to setting up. What is your approach to set up a service mesh architecture in Kubernetes to provide controlled network traffic for Golang microservices? So this mesh, that means you would be okay. When you say service mesh architecture, that means you have control over network traffic. Okay. Control network traffic means egress and ingress. So when you set up Kubernetes, when you set up your application on Kubernetes, you have to define egress and ingress policies. Ingress is something where you define how many applications can communicate with your application, and egress defines where all applications can go and communicate with. So who can communicate with your application is defined by ingress or incoming requests. And outgoing requests, also, you can define by means of egress. That means where the application can communicate to. So that way, you are restricting the traffic on the application by means of ingress and egress. So incoming traffic is restricted and outgoing traffic restricted by means of egress, if that is what it means.
Let's apply domain-driven design approach in Go to effectively work with Neo4j graph database. Fine. A domain-driven design approach can be applied in Go to effectively work with Neo4j graph database. How will you define it? Okay. I have an element of human design approach. And when design approach and Neo4j graph database are combined. So as the name suggests, Neo4j graph database deals with graphs. It could have some sort of data format, which it understands. So maybe what you can do is define some data models. Those data models can be leveraged by the Neo4j graph database to provide storage, and that can be defined in a separate repository. And then what you can do is in your application, you will use that Neo4j repository as your interface and you will be basically just calling the APIs on that to store the data.
I would utilize interfaces. Good apps are common functional services that can drive with different types of data, such as PostgreSQL. I'll interact with different types of data, like MongoDB. See, in this case, basically, what you can do is define the interfaces for specific purposes, like when you say MongoDB or PostgreSQL. So, you will have certain structured data that needs to go into PostgreSQL, and possibly some unstructured data that goes into MongoDB. So, maybe you can have two different interfaces in place for unstructured and structured data databases. Those kind of interfaces can be defined. Or, if in this case, it's going to be just one of the DBs we have in place, you can just define an interface for the DB and define the methods on top of it, then provide optimization inside those methods. And what you can do is use the interface in your places, like, let's just say you're creating a REST service where you have to store the data to the database. You just use our interface instance, and that using that, you would actually store the data to the database using the interface methods instead of calling the structure-specific methods on MongoDB or PostgreSQL. So, that's how you can basically leverage interfaces.