This was the first time we had multiple interns working on the same project during 3-month internship. We had 3 promising interns in varying stages of their education and the idea was for interns to learn as much as possible and to get hands-on experience with technologies that are in-demand, but aren’t taught in university. Things like deploying to AWS and integrating with many AWS services and Google services. On the other hand, interns were free to make decisions on some technologies like using Java SpringBoot on backend and React on frontend.
The project was to implement a social network web application similar to Meetup.com. This problem domain was chosen because it is familiar to anyone and we saw use-cases for many different technologies we wanted to use (so a bit backward approach than what should be done on a real project which is to choose technologies based on requirements not the other way around).
First half of the internship was dedicated to learning these technologies:
During this time, the project was a monolith application deployed using AWS Elastic Beanstalk and AWS Amplify with RDS for PostgreSQL. CI/CD pipeline consisted of GitHub repositories that would be automatically deployed using AWS CodePipeline and AWS CodeBuild services on each PR merge. Interns had an opportunity to do Code Reviews for each other. Project progress was tracked on Jira. DevOps work was done by the mentor of the internship, so interns could focus on feature development.
Second half of the internship was dedicated to learning advanced microservice concepts, so it involved a lot of learning and proof-of-concepts. Monolith application was split into 5 microservices:
Interns were given a choice how they are going to implement communication between services and they chose the event driven approach using message broker which is the most decoupled way of integration, but also the most complex. The technology that they had to familiarize themselves with was Kafka which was used as a message queue for communication between services. Also, Kafka Connect with Debezium connector was introduced for implementing Outbox pattern. Concepts that interns had to learn were:
This time around, AWS infrastructure was created using Infrastructure-as-Code with Terraform. Instead of deploying to AWS Elastic Beanstalk, microservices were deployed to Kubernetes (Amazon EKS Cluster) using ArgoCD. CI/CD pipeline is presented in more detail on the following image:
In the end, the architecture of the system looked like the following image:
This architecture was much more challenging to implement than simple monolithic architecture, but it had the advantage of high availability and scalability. Unlike the monolith application which ran entirely in AWS free-tier, this architecture was more expensive.
In conclusion, this was the first time we ran an internship with more than one intern and we were very satisfied with the results. However, there is a lot of room for improvement that we are going to implement for the next group of interns:
Cover photo credit Isometric Vectors by Vecteezy.