πͺ Chapter 1: The Restaurant Without Celery (Synchronous Hell)
Imagine you own a restaurant with only one waiter (your web server). Here's what happens:
Customer 1 arrives: "I want a simple salad!"
- Waiter: "Coming right up!" Makes salad in 30 seconds
- Customer: Happy and leaves
Customer 2 arrives: "I want a whole roasted turkey!"
- Waiter: "Sure, but you'll need to wait here while I cook it..."
- Waiter disappears for 3 HOURS to roast the turkey
- Customers 3, 4, 5, 6... all arrive and wait... and wait... and WAIT!
Result: Your restaurant goes out of business because everyone leaves!
π½οΈ Chapter 2: The Smart Restaurant (With Celery)
Now you hire a chef (Celery worker) and install a kitchen pass (Redis message broker):
The New Workflow:
Customer 1: "I want a simple salad!"
- Waiter (FastAPI): Makes salad instantly "Here you go!"
Customer 2: "I want a whole roasted turkey!"
- Waiter: Writes order on paper "Your turkey is being prepared! Here's your receipt #123"
- Waiter: Slides order through kitchen pass to chef
- Chef (Celery): Starts cooking turkey in background
- Waiter: Continues serving other customers
Customer 3: "I want a burger!"
- Waiter: Makes burger quickly "Here you go!"
Later...
- Chef: Dings bell "Turkey #123 is ready!"
- Waiter: Delivers turkey to Customer 2
Result: Everyone is happy! Fast service for simple orders, background processing for complex ones.
π§ Chapter 3: The Kitchen Equipment (Technical Components)
The Waiter = FastAPI Server
- Takes orders (HTTP requests)
- Serves simple food immediately (quick database queries)
- Delegates complex cooking (heavy tasks) to the kitchen
The Kitchen Pass = Redis (Message Broker)
- Where order tickets (tasks) are stored
- Ensures no orders are lost
- Manages the queue of work
The Chef = Celery Worker
- Processes complex orders (video compression, email sending)
- Works independently from the waiter
- Can have multiple chefs (workers) for busy times
The Order Ticket = Task
# This is like writing an order ticket
compress_video.delay(input_path="video.mp4", output_path="compressed.mp4")
The Receipt = Task ID
# Customer gets a receipt to track their order
task_result = compress_video.delay(...)
print(f"Your order ID is: {task_result.id}")
π― Chapter 4: Different Types of Restaurant Orders (Task Types)
π₯ Fast Food (Synchronous Tasks)
- User registration
- Simple database queries
- Returning user profiles
- Served immediately by the waiter
π Slow Cooking (Asynchronous Tasks)
- Video compression (like roasting a turkey)
- Sending emails (like preparing a fancy dessert)
- Image processing (like making fresh bread)
- Report generation (like preparing a banquet)
β° Scheduled Meals (Periodic Tasks)
- Daily specials (reset user swipes at midnight)
- Weekly inventory (check expired subscriptions)
- Monthly deep cleaning (database maintenance)
ποΈ Chapter 5: Building Your Restaurant (Setup Process)
Step 1: Hire the Message System (Install Redis)
# Like installing a kitchen pass system
brew install redis
brew services start redis
Step 2: Train Your Chef (Configure Celery)
# api/utils/celery.py - This is your chef's training manual
from celery import Celery
app = Celery('techie-match')
app.config_from_object('api.utils.celery_config')
Step 3: Create the Menu (Define Tasks)
# api/utils/tasks/compress_video.py - Recipe for video compression
@app.task
def compress_video(input_path, output_path):
# This is like a recipe for roasting turkey
# Takes time but produces great results
pass
Step 4: Start the Restaurant (Run All Services)
# Terminal 1: Start the waiter
uvicorn main:app --reload
# Terminal 2: Start the chef
celery -A api.utils.celery worker --loglevel=info
# Terminal 3: Start the schedule manager
celery -A api.utils.celery beat --loglevel=info
π¨ Chapter 6: When Things Go Wrong (Common Problems)
Problem 1: Chef Can't Find Cooking Tools
ImportError: cannot import name 'SessionLocal' from 'api.db.db'
Translation: Chef is looking for a cooking tool in the wrong drawer!
Problem 2: Kitchen Pass is Broken
[ERROR] Can't connect to Redis
Translation: Orders can't reach the kitchen!
Problem 3: Chef is Overworked
TimeoutError: The operation timed out
Translation: Turkey is taking too long to cook!
π‘ Chapter 7: Best Practices (Restaurant Management)
1. Don't Make Customers Wait for Slow Food
# BAD: Making customer wait for turkey
def upload_video():
compress_video_now() # Customer waits 5 minutes!
return "Video uploaded"
# GOOD: Give customer a receipt
def upload_video():
task = compress_video.delay() # Customer gets receipt immediately
return f"Video is processing. ID: {task.id}"
2. Handle Kitchen Emergencies
try:
task_result = compress_video.delay()
result = task_result.get(timeout=300) # Wait max 5 minutes
except TimeoutError:
return "Kitchen is busy, please try again later"
3. Hire More Chefs When Busy
# Start multiple workers for busy times
celery -A api.utils.celery worker --concurrency=4
π Chapter 8: The Happy Ending
With your restaurant properly set up:
- Customers get fast service (good user experience)
- Complex orders are handled efficiently (video compression works)
- No one waits unnecessarily (async processing)
- Restaurant stays organized (scheduled maintenance tasks)
- Business grows successfully (scalable architecture)
Top comments (0)