فصل سوم: ارتباط بین سرویس‌ها

رویدادمحور با Kafka

فراتر از صف پیام ساده

Apache Kafka یک پلتفرم پردازش استریم رویداد است که برخلاف RabbitMQ که بیشتر برای صف کارها (task queue) طراحی شده، برای حجم بسیار بالای رویداد و نگهداری تاریخچه‌ی آن‌ها بهینه شده است. در Kafka، پیام‌ها در واحدهایی به نام Topic نگهداری می‌شوند و برخلاف بسیاری از صف‌های سنتی، پس از خوانده شدن توسط یک مصرف‌کننده حذف نمی‌شوند؛ می‌توانند برای مدت مشخصی (یا حتی برای همیشه) باقی بمانند و توسط چند مصرف‌کننده‌ی مستقل بارها خوانده شوند.

from kafka import KafkaProducer
import json

producer = KafkaProducer(
    bootstrap_servers="kafka:9092",
    value_serializer=lambda v: json.dumps(v).encode("utf-8"),
)
producer.send("order-events", {"order_id": 1234, "status": "created"})
producer.flush()

الگوی Event Sourcing و انتخاب بین ابزارها

این ویژگی نگهداری تاریخچه، Kafka را برای الگوهایی مثل Event Sourcing (ذخیره‌ی وضعیت سیستم به‌صورت دنباله‌ای از رویدادها به‌جای فقط وضعیت فعلی) و پردازش استریم داده‌ی حجیم (مثل تحلیل رفتار کاربر در لحظه) بسیار مناسب می‌کند. Kafka همچنین مقیاس‌پذیری افقی بسیار بالایی دارد و در شرکت‌هایی با میلیون‌ها رویداد در ثانیه استفاده می‌شود.

به‌طور خلاصه: برای صف کار ساده با نیاز به تأیید پردازش هر پیام، RabbitMQ سبک‌تر و ساده‌تر است؛ برای استریم رویداد حجیم، نیاز به بازخوانی تاریخچه، یا معماری مبتنی بر رویداد در مقیاس بزرگ، Kafka انتخاب طبیعی‌تری است. بسیاری از تیم‌ها با یکی از این دو شروع می‌کنند و فقط در صورت نیاز واقعی به سراغ دیگری می‌روند.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.