בפרויקט הזה אתגרתי את עצמי לבנות מאפס מערכת שמדמה תהליך הזמנה של מוצרי בנייה, תוך שימוש בארכיטקטורה שכבתית, הפרדה בין שירותים, וחלק מהעקרונות של Domain-Driven Design ו-Event-Driven Architecture.
הרעיון המרכזי
במקום לבנות מערכת אחת גדולה, חילקתי את הפתרון לכמה חלקים עצמאיים:
- Products Service - אחראי על קטלוג מוצרים וניהול מלאי.
- Orders Service - אחראי על יצירת הזמנות, אישור הזמנות וניהול סטטוסים.
- Client Simulator - ממשק שמדגים את הפעולות המרכזיות במערכת.
כל שירות רץ כיחידה עצמאית עם API משלו. השירותים מתקשרים ביניהם בצורה מבוזרת, כאשר פעולות שדורשות תגובה מיידית מתבצעות דרך HTTP/REST, ופעולות בין שירותים עוברות בצורה אסינכרונית דרך RabbitMQ.
תקשורת בין השירותים
ה-Client Simulator מדבר עם השירותים דרך REST כדי לבצע פעולות כמו יצירת הזמנה, צפייה בפרטי מוצר או עדכון פריטים. במקביל, תהליכים פנימיים כמו אישור הזמנה, הפחתת מלאי ועדכוני סטטוס עוברים דרך RabbitMQ.
עקרונות שניסיתי ליישם
DDD חלקי - יצרתי שכבות ברורות והשתמשתי בממשק IDomainEventPublisher
כדי להעביר אירועים פנימיים משכבת הלוגיקה אל שכבת ה-API בלי להצמיד את הלוגיקה לתשתית.
Event-Driven חלקי - RabbitMQ משמש להעברת מסרים בין השירותים, למשל בתהליך אישור הזמנה והפחתת מלאי. המטרה כאן לא הייתה לבנות מערכת Enterprise מלאה, אלא להבין את העקרונות דרך יישום אמיתי.
Docker Compose - כל השירותים, מסדי הנתונים ו-RabbitMQ רצים יחד בסביבה מקומית אחת, כדי לדמות סביבת עבודה מלאה בצורה פשוטה להרצה.
מה למדתי מהפרויקט?
הפרויקט עזר לי להבין טוב יותר את המחיר והערך של מיקרו-שירותים: מצד אחד הפרדה, גמישות ומודולריות; מצד שני יותר תיאום, יותר תשתית ויותר חשיבה על תקשורת, עקביות וניטור.
זה היה פרויקט מאתגר ומהנה, בעיקר כי הוא הכריח אותי לחשוב על מערכת כמכלול: API, נתונים, הודעות, תהליכים, UI, Docker, תקלות ושינויים עתידיים.
טכנולוגיות
.NET Core | MVC | Docker | REST APIs | SignalR | EF Core | MS SQL | Structured Logging | AutoMapper | Background Worker | RabbitMQ | Optimistic Concurrency | Partial DDD | Partial Event-Driven Architecture