Devobin
48 subscribers
22 photos
3 videos
13 links
Download Telegram
Channel created
#Devocook

⚛️ Atomic Operations در جنگو: وقتی `save()` نجات نمی‌دهد

🧠 قسمت 1: مشکل کجاست؟
با view_count = 10 و دو کاربر همزمان:
product = Product.objects.get(id=1)
product.view_count += 1
product.save()

نتیجه: 11 (باید 12 باشد). Race Condition در محیط همزمان حتمی است.

⚛️ قسمت 2: راه حل اتمیک
استفاده از F expressions:
from django.db.models import F
Product.objects.filter(id=1).update(view_count=F('view_count') + 1)

این کار اتمیک و بدون تداخل است.

🧩 قسمت 3: مثال‌ها
# افزایش موجودی
Product.objects.filter(id=1).update(stock=F('stock') + 5)
# انتقال موجودی
Order.objects.filter(id=1).update(total_price=F('sub_total') + F('tax'))
# شرط مقایسه
Product.objects.filter(stock__gt=F('min_threshold'))


⚠️ قسمت 4: تله مهم – ترکیب با `save()`
#  اشتباه
product.view_count = F('view_count') + 1
product.save() # F آبجکت ذخیره می‌شود، نه مقدار

راه درست:
product.view_count = F('view_count') + 1
product.save(update_fields=['view_count'])
product.refresh_from_db()



❤️ @devobin
2👍1
#devocook

📍 کجا از میکروسرویس با Django استفاده کنیم؟

پروژه خیلی بزرگ شده و چند تیم روی آن کار می‌کنند
نیاز به دیپلوی و مقیاس‌دهی مستقل هر بخش دارید (مثل سرویس پرداخت)
می‌خواهید از فناوری‌های مختلف کنار Django استفاده کنید
خطای یک سرویس نباید کل سیستم را از کار بیندازد
پروژه کوچک یا متوسط است؟ مونولیت هنوز بهترین انتخاب است.

🚀 میکروسرویس با Django: از مونولیت به مقیاس‌پذیری

جنگو به تنهایی فریمورک مونولیتیک است، اما می‌تواند پایه عالی برای میکروسرویس باشد.


رویکرد درست:
هر سرویس یک پروژه Django + DRF مستقل است که:
دیتابیس خودش را دارد
با بقیه سرویس‌ها از طریق REST، gRPC یا Message Broker (RabbitMQ) ارتباط برقرار می‌کند
جداگانه دیپلوی و اسکیل می‌شود
مثال:
سرویس کاربران (Accounts)
سرویس سفارشات (Orders)
سرویس پرداخت (Payments)
ابزارهای کلیدی:
Django REST Framework
JWT برای احراز هویت
RabbitMQ / Redis برای ارتباطات ناهمگام
Docker + Kubernetes برای دیپلوی
API Gateway (Kong یا Traefik)
چالش‌های مهم:
تراکنش‌های توزیع‌شده
لاگ و نظارت متمرکز (ELK + Prometheus + Grafana)

@devobin
1