0%
در حال بارگذاری...

جستجو در سایت

درس ۷ سطح پیشرفته: سیستم‌های توزیع‌شده، Message Queue پیشرفته، Event Sourcing، CQRS و Saga Pattern در پایتون

پایتون | Python پیشرفته

سلام معمار سیستم‌های توزیع‌شده در پایتون! به درس هفتم سطح پیشرفته رسیدی — جایی که دیگه فقط یه برنامه‌نویس یا DevOps نیستی، یه **معمار سیستم‌های مقیاس‌پذیر و مقاوم در برابر خطا** می‌شی. تو این درس قراره یاد بگیری چطور سیستم‌هایی بسازی که مثل بانک‌ها، صرافی‌ها، فروشگاه‌های آنلاین بزرگ (دیجی‌کالا، اسنپ، آپارات) و پلتفرم‌های جهانی (نتفلیکس، اوبر) کار می‌کنن: سیستم‌های توزیع‌شده با Message Queue پیشرفته، Event Sourcing، CQRS و Saga Pattern. وقتی این درس تموم بشه، می‌تونی به هر مصاحبه‌ای بری و با اعتماد به نفس کامل بگی: «من معماری توزیع‌شده، Event-Driven و Saga Pattern رو در مقیاس واقعی پیاده کردم!» آماده‌ای که وارد دنیای واقعی معماری نرم‌افزار بشی؟ بریم که یکی از پیشرفته‌ترین مباحث رو یاد بگیری!

چرا سیستم توزیع‌شده در پایتون و چرا الان نیازش داری؟

وقتی برنامه‌ات بزرگ می‌شه، یه سرور دیگه کافی نیست. باید به ده‌ها یا صدها سرور تقسیم کنی. اما مشکل اینجاست:

    • سرورها ممکنه کرش کنن
    • داده‌ها باید همگام باشن</li&amp;gt;<li&gt;تراکنش‌ها باید atomic باشن
    • <l

i>سیس

    • تم باید ۲۴/

۷

    در دسترس باشه

اینجا معماری‌های پیشرفته مثل Event Sourcing، CQRS و Saga وارد می‌شن.

Message Queue پیشرفته با RabbitMQ و Redis Streams

import pika
import json

# Producer
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='order_queue', durable=True)

def publish_order(order_data):
    channel.basic_publish(
        exchange='',
        routing_key='order_queue',
        body=json.dumps(order_data),
        properties=pika.BasicProperties(delivery_mode=2)  # persistent
    )

publish_order({"user_id": 123, "amount": 990000, "items": ["لپ‌تاپ"]})
# Consumer
def callback(ch, method, properties, body):
    order = json.loads(body)
    print(f"پردازش سفارش {order['user_id']}")
    # پردازش پرداخت، ارسال ایمیل و ...
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(queue='order_queue', on_message_callback=callback)
channel.start_consuming()

Event Sourcing — هرگز داده رو آپدیت نکن، فقط رویداد ذخیره کن!

به جای ذخیره وضعیت فعلی (current state)، همه رویدادها (events) رو ذخیره می‌کنی و وضعیت رو از رویدادها می‌سازی.

class OrderEvent:
    def __init__(self, order_id, event_type, data):
        self.order_id = order_id
        self.event_type = event_type
        self.data = data
        self.timestamp = datetime.utcnow()

events = []

def apply_event(state, event):
    if event.event_type == "created":
        state["status"] = "pending"
        state["amount"] = event.data["amount"]
    elif event.event_type == "paid":
        state["status"] = "paid"
    return state

# ذخیره رویداد
events.append(OrderEvent(1, "created", {"amount": 990000}))
events.append(OrderEvent(1, "paid", {}))

# بازسازی وضعیت
current_state = {}
for event in events:
    if event.order_id == 1:
        current_state = apply_event(current_state, event)

print(current_state)  # {'status': 'paid', 'amount': 990000}

CQRS — جداسازی خواندن و نوشتن

Command (نوشتن) و Query (خواندن) رو جدا می‌کنی تا هر کدوم بهینه بشن.

class CommandSide:
    def create_order(self, order_data):
        # ذخیره در Write DB (PostgreSQL)
        # publish event به Kafka/RabbitMQ
        pass

class QuerySide:
    def get_order_dashboard(self):
        # خواندن از Read DB (مثلاً materialized view یا Elasticsearch)
        return dashboard_data

# در FastAPI
@app.post("/orders/")
async def create_order(command: OrderCommand, command_side=Depends(get_command_side)):
    return command_side.create_order(command)

@app.get("/dashboard")
async def dashboard(query_side=Depends(get_query_side)):
    return query_side.get_order_dashboard()

Saga Pattern — تراکنش توزیع‌شده بدون 2PC

وقتی پرداخت موفق بود اما ارسال کالا شکست خورد، چطور rollback کنی؟ با Saga!

class OrderSaga:
    def __init__(self, order_id):
        self.order_id = order_id
        self.steps = ["reserve_inventory", "process_payment", "ship_order"]
    
    async def execute(self):
        for step in self.steps:
            try:
                await self.call_service(step)
            except Exception:
                await self.compensate(step)
                raise
    
    async def compensate(self, failed_step):
        compensating_steps = self.steps[:self.steps.index(failed_step)][::-1]
        for step in compensating_steps:
            await self.call_compensating_service(step)

۱۲ تمرین آتشین برای تبدیل شدن به معمار سیستم

    1. RabbitMQ با ۳ queue و retry mechanism
    2. Event Store کامل با append-only
    3. CQRS کامل با Write DB و Read DB جدا
    4. Saga برای سفارش آنلاین با ۴ سرویس
    5. Kafka producer/consumer با Python
    6. Event Sourcing برای حساب بانکی
    7. CQRS + Materialized View با Redis
    8. Saga Orchestration vs Choreography مقایسه کن
    9. Outbox Pattern برای reliability
    10. Transaction Log با Debezium</li><li>Event-Driven Dashboard با WebSocket
    11. کلاس کامل DistributedTransactionManager بساز</li>&lt;/</ol>

    ol><h

      1. ۴>پروژه

    نهایی در

        1. st-style-type: none;”>
            <li

        styl

          1. e=”list

          &lt;/li>&lt;/ol>-style-ty<ol>pe: none;”>&lt;ol&gt;س: سیستم سفارش توزیع‌شده همانند بانک

          • Order Service → Event publish
          • Payment Service → Saga step
          • Inventory Service → Reserve + Compensate
          • Notification Service → Event consumer</li>
          • Event Store + Read
          • Model
          • <li

      1. >RabbitMQ + Retry + Dead
      2. <li

    style=”list-style-type:

      none;”>

      • Letter&lt;/li>

      • Observability کامل از درس قبل</li>
      • </ul>

  1. </ol&g

t;

جمع‌بندی و قدم بعدی

تبریک می‌گم معمار سیستم توزیع‌شده در پایتون! تو الان می‌تونی سیستم‌های بانکی، صرافی، فروشگاه بزرگ و پلتفرم‌های Event-Driven واقعی بسازی. درس بعدی (درس ۸) آخرین درس سطح پیشرفته است و درباره **Machine Learning در تولید، MLOps، Model Serving، Drift Detection و A/B Testing** خواهد بود — جایی که هوش مصنوعی رو در تولید واقعی مستقر می‌کنی. پروژه سفارش توزیع‌شده رو توی GitHub آپلود کن و با افتخار بگو: «من معماری توزیع‌شده و Saga Pattern بلدم!»

ارسال نظر جدید

گزارش دیدگاه