Jane Doe
Pro Plan
Adding a message queue to your system provides several key benefits:
Decoupling
Asynchronous Processing
Load Leveling (Buffering)
Scalability
Reliability and Durability
Retry and Error Handling
Event-Driven Architecture Support
Transaction Support
Reduced Coupling Time Dependencies
Monitoring and Analytics
Create standard Flask project & install dependencies. While here create the files which'll hold our message queue logic.
mkdir system_design_message_queuecd system_design_message_queuepython3 -m venv venvsource venv/bin/activatepip3 install Flask flask_sqlalchemy rq redis rq_dashboardtouch app.py task_queue.py models.py worker.pyThe app entrypoint. We instantiate the queue on line 13-14 & then use it on lines 27-28.
1from flask import Flask, request, jsonify2from redis import Redis3from rq import Queue4import rq_dashboard5 6from models import db, Message7 8app = Flask(__name__)9app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///messages.db"10app.config.from_object(rq_dashboard.default_settings)11 12db.init_app(app)13redis_conn = Redis()14queue = Queue(connection=redis_conn)15 16with app.app_context():17 db.create_all()18 19 20@app.route("/add_message", methods=["POST"])21def add_message():22 data = request.get_json()23 if not data or "content" not in data:24 return jsonify({"error": "Content is required"}), 40025 26 content = data["content"]27 job = queue.enqueue("task_queue.save_message", content)28 return jsonify({"message": "Message enqueued", "job_id": job.get_id()}), 20229 30 31@app.route("/messages", methods=["GET"])32def get_messages():33 messages = Message.query.all()34 return jsonify(35 [{"id": m.id, "content": m.content, "timestamp": m.timestamp} for m in messages]36 )37 38 39if __name__ == "__main__":40 app.run(debug=True)This is the worker which'll handle the processing of business logic from the queue(assuming we call task_queue.save_message). Read the RQ Docs to learn more about how it works.
1def save_message(content):2 from app import app, db, Message3 4 with app.app_context():5 message = Message(content=content)6 db.session.add(message)7 db.session.commit()A simple SQLAlchemy model for persisting our messages to disk.
1from flask_sqlalchemy import SQLAlchemy2from datetime import datetime3 4db = SQLAlchemy()5 6class Message(db.Model):7 id = db.Column(db.Integer, primary_key=True)8 content = db.Column(db.String(255), nullable=False)9 timestamp = db.Column(db.DateTime, default=datetime.utcnow)python3 app.pyrq worker # new windowrq-dashboard # new windowcurl -X POST http://127.0.0.1:5000/add_message \ -H "Content-Type: application/json" \ -d '{"content": "Hello from Flask Queue!"}' { "job_id": "092f6680-67ac-4da6-bc0e-c05171b908b6", "message": "Message enqueued"}
You should not see that you can add messages to the queue using a simple curl request. It took relatively little code. Nice~!