Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
06-4. Channels 實戰案例 本章通過 5 個真實場景,展示 Django Channels 在生產環境中的實際應用。
1. 案例一:聊天室系統 場景描述 構建一個多房間聊天系統,支持:
多個聊天室 用戶加入/離開通知 在線用戶列表 歷史消息加載 完整實現 步驟 1:數據模型 # models.py from django.db import models from django.contrib.auth.models import User class ChatRoom(models.Model): """聊天室""" name = models.CharField(max_length=100, unique=True) slug = models.SlugField(unique=True) description = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class Message(models.Model): """聊天消息""" room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE, related_name='messages') user = models.ForeignKey(User, on_delete=models.CASCADE) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['created_at'] def __str__(self): return f'{self.
06-3. Channels 基礎概念 Django Channels 是 Django 的擴展,讓 Django 支持 WebSocket、長輪詢等實時通信協議。本章將深入探討其核心概念。
1. 什麼是 Channels? 定義 Django Channels 是一個讓 Django 支持 異步協議 的框架,特別是 WebSocket。
# 傳統 Django (WSGI):只支援 HTTP # 每個請求-響應是獨立的,無法保持長連接 用戶 → HTTP 請求 → Django → HTTP 響應 → 用戶 # 連接結束 ✂️ # Django Channels (ASGI):支援 WebSocket # 可以保持長連接,實現雙向通信 用戶 ⟷ WebSocket 連接 ⟷ Django Channels # 連接持續,可以隨時收發消息 ✅核心特性 WebSocket 支持:實時雙向通信 HTTP/2 支持:Server Push 長輪詢:兼容舊瀏覽器 異步處理:基於 asyncio 向後兼容:可與傳統 Django view 並存 2.
06-2. Celery 實戰案例 本章通過 7 個真實場景,展示 Celery 在生產環境中的實際應用。
1. 案例一:郵件發送系統 場景描述 電商平台需要發送多種郵件:訂單確認、發貨通知、促銷活動等。每天發送 10 萬封郵件。
問題分析 # ❌ 同步發送郵件的問題 def create_order(request): order = Order.objects.create(...) # 同步發送郵件,阻塞 2-3 秒 send_mail( subject=f'訂單 {order.id} 已確認', message='...', recipient_list=[order.user.email] ) return JsonResponse({'order_id': order.id}) # 問題: # - 用戶等待 2-3 秒才能看到響應 # - SMTP 服務器故障會導致訂單創建失敗 # - 高峰期可能超時Celery 解決方案 步驟 1:定義郵件任務 # tasks.py from celery import shared_task from django.core.mail import send_mail, EmailMultiAlternatives from django.template.loader import render_to_string from django.
06-1. Celery 基礎概念 Celery 是 Python 生態系中最流行的異步任務隊列,本章將深入探討其核心概念和運作原理。
1. 什麼是 Celery? 定義 Celery 是一個分布式任務隊列系統,用於處理異步任務和定時任務。
# 沒有 Celery 的同步處理 def create_order(request): order = Order.objects.create(...) send_email(order) # 阻塞 2 秒 generate_invoice(order) # 阻塞 5 秒 update_inventory(order) # 阻塞 1 秒 return JsonResponse({'order_id': order.id}) # 用戶等待:8 秒 ❌ # 使用 Celery 的異步處理 def create_order(request): order = Order.objects.create(...) send_email.delay(order.id) # 立即返回 generate_invoice.delay(order.id) # 立即返回 update_inventory.delay(order.id) # 立即返回 return JsonResponse({'order_id': order.id}) # 用戶等待:< 100ms ✅核心用途 異步任務:耗時操作不阻塞用戶請求 定時任務:Cron-like 定期執行任務 分布式計算:跨多台服務器分散計算負載 2.
05-3. 面試技巧與答題模板 本章提供實用的面試技巧、答題模板和模擬對話,幫助你在面試中脫穎而出。
1. 答題結構:STAR 方法 什麼是 STAR 方法? STAR 是回答行為問題的經典框架:
S - Situation (情境):描述背景和問題 T - Task (任務):你的職責是什麼 A - Action (行動):你採取了什麼行動 R - Result (結果):產生了什麼結果示例:遇到性能問題如何解決? ❌ 糟糕的回答:
“我優化了 Worker 配置,然後性能就變好了。”
問題:
沒有背景 沒有具體數據 沒有展示思考過程 ✅ 優秀的回答(STAR):
S - Situation(情境) “在上一家公司,我們的電商平台在促銷活動期間遇到性能瓶頸。具體表現是:
響應時間從平時的 100ms 增加到 2-3 秒 用戶投訴大量超時 服務器 CPU 使用率達到 95% 流量從平時的 500 QPS 增加到 3000 QPS” T - Task(任務) “作為後端負責人,我需要在 24 小時內解決性能問題,確保接下來 3 天的促銷活動順利進行。”
A - Action(行動) “我採取了以下行動:
05-2. 面試常見問題(進階) 本章整理 Gunicorn 相關的進階面試問題,涵蓋性能優化、問題排查、架構設計等高級主題。
1. 性能優化 Q1:如何優化 Gunicorn 的性能?請列舉 5 個以上的優化方法。 標準答案:
8 大優化方法:
1. 選擇正確的 Worker 類型 # gunicorn.conf.py # I/O 密集型 → Uvicorn Worker workers = 4 worker_class = 'uvicorn.workers.UvicornWorker' # CPU 密集型 → Sync Worker workers = 9 # (2 × CPU) + 1 worker_class = 'sync' # 混合型 → Gthread Worker workers = 4 threads = 10 worker_class = 'gthread'2. 啟用 preload_app 節省記憶體 preload_app = True # 記憶體節省 50-70% def post_fork(server, worker): # Worker Fork 後重新初始化資料庫連接 from django.