Published on

I've Got a Feeling: My ITViec Clone is the Real Deal.

Authors
  • avatar
    Name
    Jack Nguyen
    Twitter

Imagine a platform that revolutionizes the way IT professionals find jobs. I led a team of nine developers to build a system that is not only efficient but also highly scalable.

Disclaimer:

  1. This project is only for learning purposes. If you use the code for anything illegal, that’s on you, not me.
  2. The code base isn’t optimal. We didn’t have much time, so don’t expect it to run seemlessly in real-life scenarios.
  3. The system design is pretty solid! With some small fixes, it could work for a big user base. But it's all about the system design, our code base doesn't reflect my design.
Table of Contents

Introduction: The Rise of IT’s Việc in Vietnam

Have you heard of ITViec? If not, it’s like the Tinder of tech jobs in Vietnam — swipe through job listings and find your perfect match. It’s super popular and has helped connect tons of people with their dream jobs. Inspired by this, we decided to make our own version, but with some, let’s say, “creative” coding choices.

Cover Image

Requirements: The Big Ideas We Started With

After lots of coffee and brainstorming, here’s what we decided the system should do:

Functional Requirements:

For Users:

  1. Authentication: Log in or sign up

  2. Blog: A place to post job news, tips, or random thoughts.

  3. Profile/Settings:

    • Update preferences, cover letters, about sections, and education.
    • Upload CVs (and lose track of which one you uploaded).
  4. Companies:

    • Create company pages to show off their culture and perks.
    • Let employees leave reviews (honest ones, hopefully :)) ).
    • Manage applications from job seekers.
  5. Jobs:

    • Search for jobs easily.
    • Apply for jobs.
    • Manage posted jobs.
    • Get email notifications after applying and accepting (because everyone loves email spam).

For Admins:

  1. Manage blogs.
  2. Manage companies.
  3. Manage jobs
  4. Manage users (or block them if needed).

Non-Functional Requirements:

  1. Handle 1 million daily active users (DAU)
  2. (We’ll figure out the rest as we go.)

Architecture: How We Built This Thing

1. Database: We threw together some tables and relationships with SQL schema. It’s a bit messy, but it works (mostly).

Cover Image

2. Architecture: We went for a microservices approach. Imagine a puzzle where the pieces don’t quite fit but somehow hold together.

Cover Image

How the ITViec Clone Scales Like a Pro

So, you’ve got millions of people looking for jobs, uploading their CVs, and hoping to land their dream gig. This system design isn’t just about surviving the chaos; it’s about thriving in it. Let’s break it down into workflows—because who doesn’t love workflows?—and look at how this setup makes sure nothing crashes and burns.

1. Searching for Jobs

Imagine a million people searching for jobs all at once. That’s a lot of "Find me a remote software engineer role, please!" requests. Instead of bombarding Elasticsearch (which, let’s face it, can get grumpy under pressure), Redis swoops in like a superhero. It keeps the frequently searched results in memory for 5 minutes, so users get their results instantly—like fast food for job seekers. And when someone posts a new job, Redis politely steps aside and refreshes its cache. No stale results here!

Redis might handle the "popular kid" searches, but Elasticsearch does the heavy lifting for the nitty-gritty stuff—like filtering jobs by 15 different criteria. It’s fast, powerful, and optimized for making sense of all those "Remote jobs in IT: Page 3" queries. But to avoid frying its circuits, jobs aren’t indexed the second they’re posted. Instead, a Job Processing Service batches them up and sends updates like clockwork.

2. Applying for Jobs: Upload, Send, Done

Uploading CVs can be a nightmare for servers—just imagine thousands of massive PDF files clogging up the pipes. This system cleverly avoids that by using Amazon S3 pre-signed URLs. Users upload their CVs directly to the cloud, bypassing the app servers entirely. It’s like skipping the line at a busy café and heading straight to the counter. Fast, smooth, no waiting.

Redis isn’t just about search caching—it’s also the brain behind session management. Whether a user is uploading their CV or browsing jobs, Redis keeps track of their session so everything stays lightning-fast and seamless.

3. Real-Time Job Syncing (Because Nobody Likes Outdated Info)

Think of the user database and job database like two busy highways. Partitioning splits the traffic—one highway for user_id and another for job_id. It’s a smart way to avoid traffic jams when millions of users are applying for jobs or browsing listings.

Bonus: the database can scale like a pro when the user base explodes.

CDC for Peace of Mind - No, not that CDC. Here, it’s Change Data Capture, making sure that whenever a job gets updated, Elasticsearch gets the memo. It’s like having a buddy who always texts you the latest news, so you’re never out of the loop.

4. Notifications and Email: The Unsung Heroes

Notifications are a delicate business—imagine applying for a job and not getting a confirmation email. Chaos, right? Kafka queues handle all notifications, making sure they’re sent without hiccups, even during peak hours. If something fails, Kafka gives it another go. No missed emails here!

Email Workers (The Overachievers) - These guys handle the grunt work of actually sending out the emails. If a delivery fails (blame spam filters or network gremlins), they retry until the message gets through. Persistence is key!

5. Scaling for the Big Leagues

  • Decoupled Microservices: Every major feature—job search, admin tools, notifications—gets its own microservice. Think of it like a team of specialists: each one knows their job and can scale out independently if things get busy. Need more search power? Just scale the search service. Easy.
  • Caching: Redis pops up again here because caching is the secret sauce to make everything fast. Whether it’s search results or session data, Redis ensures no one has to wait too long for anything.
  • Batch Processing: Instead of dumping every new job directly into Elasticsearch and potentially setting it on fire, the Job Processing Service splits tasks like indexing, deduplication, and parsing into small, manageable chunks.

6. Keeping the System from Crumbling Under Pressure

When millions of users load your site, you don’t want them waiting forever for static files like images or scripts. That’s where the Content Delivery Network (CDN)—in this case, Cloudflare—shines. It delivers files from servers close to users, cutting down load times and keeping everything snappy.

Load balancers are the unsung heroes here, directing traffic evenly across all the services. They make sure no single service gets overwhelmed—because nobody wants to deal with a crash in the middle of job hunting.

User Guide + Video Demo

We wanted to show off a full video demo, but, well, things didn’t go as planned. So, for now, just picture something awesome with a few bugs sprinkled in. We promise it’s cooler than it sounds.

There are a bunch of features that haven't had a video demo for them yet, even though they are fully integrated in the soure code like:

  1. Manage Candidates (after job seekers applied)
  2. Email Notifaction (with template)
  3. Company Page (with reviews)
  4. Login/Register
  5. ...

Read more at User Guide (Vietnamese) here: https://drive.google.com/file/d/1L21-LPtiSKg5FOI9dwvKot9TfQ8C9S6P/view?usp=sharing

  1. Search/Apply Jobs + Employer Page

  2. Profile + Settings + Blog

  3. Company Management

  4. Blog Management

Github Repo

Repo: https://github.com/nguyenphucbao68/capstone-project


And that’s it! This project is a mix of ambition, chaos, and just a tiny bit of genius. Feel free to download the code, play around, and most importantly, have fun. And if you find bugs, just blame the deadline. Cheers!