הפרוייקט הכי רומנטי שכתבתי EVER

מערכת קוד פתוח ששולחת שירי אהבה לאשתי ומשלבת AI

מחבר אחיה חביבסקרפינג נעים חברים

בפוסט הזה אני הולך לספר קצת על הארכיטקטורה של הפרויקט האחרון שלי
״love-songs-serverless-sender״

 מה הפרויקט עושה?
בקצרה, הוא אוסף שירים שאני כותב לאישתי, שומר אותם ושולח אותם פעם בשבוע בזמן רנדומלי, כך שאני חייב לכתוב שיר מספיק בזמן. אם לא אספיק לכתוב שיר, הוא יעזר בOpenAi API כדי להסתלבט עליי בגוף שלישי עם אשתי.


כתבתי אותו בעקבות ייעוץ זוגי שעברתי עם אשתי, ובעקבות התעניינות שלי בטכנולוגיות serverless של AWS
הפרוייקט מנסה לממש ארכיטקטורת Event-Driven, שאכתוב עליה כאן בהמשך הפוסט


תיאור כללי בארבעה שלבים-

1. שמירה של השיר בדאטה בייס
התממשקתי לWhatsapp Business API כ client
ווצאפ נותן לי קליינט שאני תמיד משתמש בו לכתיבת שירים, כך שזה מתאים בול, וגם מייתר כתיבה של client

כשאני שולח שיר לבוט
הוא נשלח כwebhook לAPI Gateway של אמזון, משם פונקציות Lambda מטפלות בו, עושות לו ולידציה, שומרות בMongoDB ולאחר השמירה נשלח אליי מייל אישור


אגב- Lambda Function

זו דרך ממש מגניבה של AWS להפעיל קוד צד שרת בלי להתעסק כמעט בכלל בקינפוג של המערכת.
מה שנקרא בלועזית serverless
אתה כותב קוד שעושה איזשהו קסם,
מעלה אותו בפשטות לLambda, בוחר כיצד הוא יתעורר לחיים (מה יטריג אותו)
וAWS אחראית לדאוג לכל השאר (למשוך את הקוד כשהטריגר מופעל, להרים מכונה, להריץ את הקוד ולכבות את המכונה)
בגדול, כל הnode.js בפרוייקט הועלה כמספר של פונקציות Lambda, כל אחת אחראית לעשות משהו אחר

 

2. יצירת schedule בעזרת cronjob

השלב הבא קורה באופן קבוע (כל יום שני בשבוע)
מה שצריך לקרות בשלב הזה, זה שהמערכת תתעורר לחיים כל שבוע ותקבע, מתי ישלח השבוע השיר באופן רנדומלי.

לטובת העניין הזה יצרתי Cronjobs בעזרת שירות של אמזון שנקרא EventBridge.

EventBridge הוא שירות שעוזר להאזין לevents בשירותים של AWS או בשירותים שמתממשקים לAWS וגם לנהל Cronjobs.
Cronjobs, הוא כמו שעון מעורר קבוע, שעוזר ליצור איוונטים.
כמו המון שירותים של AWS  גם את EventBridge אפשר לחבר להמון שירותים אפשריים ולהפעיל אותם.

הCronjob שלי מעורר Lambda Function
שאחראית להחליט על זמן רנדומלי בו ישלח השיר שכתבתי
הLambda פונה לבסוף לAPI של EventBridge וקובעת schedule (כמו cornjob חד פעמי)
הוא יהיה אחראי להעיר את הLambda הבאה כשיגיע הזמן לשלוח את השיר.

3. בדיקה שאפשר לשלוח את השיר
אז כשמגיע הזמן EventBridge מתעורר, נותן פיהוק ואז..
מטריג את הLambda הבאה.
היא אחראית לבדוק אם אפשר כבר לשלוח את השיר.

וכאן יש אתגר קטן
כי מסתבר שWhatsapp Business לא מאפשרים לשלוח הודעות חופשיות סתם ככה
אלא אם כן הנמען משתתף באופן פעיל בהתכתבות, ושלח הודעה כלשהי בחזרה לבוט
מה שפותח חלון זמן של 24 שעות שבו אפשר להתכתב איתו באופן חופשי לגמרי A.K.A לשלוח שיר אהבה ארוך ומקורי.
מה שכן אפשר לעשות זה לשלוח טמפלייט מוכן, ולקוות שהנמען יחזיר תשובה, לאחר מכן יפתח אותו חלון זמן של 24 שעות.

אז אם הLambda מוצאת לנכון שהתקיימה שיחה ב24 שעות אחרונות, היא שולחת לSQS { שירות התורים הותיק של AWS } הודעה.
ההודעה הזאת תטריג את הLambda שאחראית על משיכת השיר מMongoDB.
ואם אי אפשר עדיין לשלוח, תשלח הודעה לתור לשליחת טמפלייט שיבקש מאשתי להגיב אליו.

4. משיכה של השיר ושליחת ההודעה המיוחלת
לאחר שהLambda הזאת מתעוררת, היא בודקת האם קיים שיר
אם כן, היא תשלח אותו לQueue (תור) שיטריג את הLambda ששולחת את ההודעות החופשיות
אם לא, תופעל הLambda השנייה, והפחות רצויה,
זו שעושה עליי קנוניה עם OpenAi Api כדי להסתלבט עליי בגוף שלישי עם אישתי.

כאן במאמר מוסגר, לא השתמשתי בכוונה בSDK של OpenAi, אלא ביצעתי קריאת  REST רגילה לAPI שלהם. זאת כדי להקטין את הגודל של הLambda מה שככלל אצבע, עשוי להקטין עלויות. כי הרי אין לי צורך בכל החבילה, כשאני עושה קריאה לאנדפוינט אחד בלבד.

ולבסוף מה שנשאר, זה לעדכן שהשיר שנשלח אכן נשלח, בMongoDB.


וזהו..

אלה קווים כלליים על הארכיטקרטורה של הפרויקט.
וכבר אספר על כמה קשיים שהיו תוך כדי עבודה.
אבל קודם כמה מילים על הארכיטקטורה.
 

ארכיטקטורה מבוססת איוונטים 

כפי שציינתי הפרויקט מממש ארכיטקטורה של Event Driven Design.
שאולי מתאימה גם היא לכמה פוסטים נפרדים.
אבל בקצרה, צורת העבודה הזו, משנה קצת את התפיסה של איך צריך לעבוד התהליך עבודה של שרת בקאנד.
לא עוד Flow סינכרוני, של Request Response.
מה שמפעיל כאן את הקוד הם איוונטים.

בפרק מפודקאסט ששמעתי לאחרונה, על הנושא, בועז זינמן מAWS מתארח ב״מפתחים מחוץ לקופסא״ בהנחיית שחר פולק ודותן טליתמן.
בועז טוען שם שהדרך להתחיל ללמוד את הארכיטקטורה הזאת היא עם Lamnbda Function.
ואני יכול רק להסכים איתו
את הפונקציות Lambda שלי בפרוייקט הטריגו כל מיני שירותים SQS, Api Gateway, EventBridge (EventBus, Schedule and Cronjob)

בקיצור ממש מגניב!

אתגרים

היו לי כמה אתגרים בבנייה של הפרוייקט הזה
1. Infra structure as Code, משתני סביבה, CI CD
בגלל שהפרוייקט הוא POC וזה הפרוייקט המשמעותי הראשון שלי בAWS, רציתי לעשות את הדברים בצורה ידנית בתור התחלה, כדי להבין מי נגד מי, ובחרתי קודם כל לגרום לדברים לעבוד לפני שאני מחפש פתרונות איך להעלות את כל הטוב הזה לענן בצורת קוד.
בשלב מסויים זה כבר יצר המון בלאגן, את הקוד כתבתי בIDE על המחשב, אבל המשכתי לערוך אותו גם בAWS מה שייצר הרבה פעמים חוסר סנכרון
כמו כן קשה ככה לנהל את משתני הסביבה
באותו הקשר CI CD טוב יכל לעזור לי להעלות את השינויים במהירות ולא בצורה ידנית

כל עוד מדובר בLambda אחת שתיים, הכל סבבה, אבל כשהגעתי כבר למעל 7 פונקציות זה נהיה קשה לסנכרן את השינויים.

עדיין לא סידרתי את העניין הזה ואם משיהו רוצה לעזור כאן מוזמנים לייעץ או לתרום קוד.

 

2. התעסקות אופרטיבית בAPI צד שלישי
למען האמת בתחום הזה יש אתגרים שעדיין לא התגברתי עליהם לחלוטין,
כדי לקבל את כל ההרשאות לעבודה עם ה API  של Meta צריך לעבור מספר תלאות.
קשה לאשר אצלם טמפלייטים וכו׳ וכו׳

בעבודה במסגרת של חברה, לפעמים מי שיטפל בעניינים האופרטיביים האלה זה בכלל לא צוות הפיתוח

עם הAPI של OpenAi קצת פחות מסובך, אבל כן צריך להכניס פרטי אשראי והשימוש הוא בתשלום, וזה לוקח אותנו לעניין הבא.

 

3. תשלום על שירותי ענן ושימוש בAPIs

זו גם התעסקות שכמעט ולא יוצא לי להתעניין בה בעבודה, בעקבות הפרוייקט, יצא לי להרהר בכך, ואפילו האזנתי לכמה פודקאסטים בנושא.
מאוד עניין אותי לדוגמא איך מחשבים את העלויות של שירותי הענן של אמזון, ויצא לי להאזין לתכנים של בועז זינמן בעקבות כך, ממליץ! (קישור בסוף הפוסט)

זה לא ממש אתגר בפיתוח קטן כל כך אבל כשחברה עושה סקייל זה ללא ספק משהו שצריך להתייחס אליו.

4. קשה לדבג את המערכת בEvent Driven Design
קשה לראות לוגים, או לפחות לא עושים את זה בדרך שאני רגיל לעבוד בה ביום יום. הFlow יכול לעבור דרך כמה פונקציות Lambda ולפעמים פשוט קשה להבין איפה בעניין נתקע.
 

זהו להיום
הפוסט הזה הוא מבחינתי כר פורה לכתיבה של פוסטים על הנושאים שהוזכרו כאן.
כמו טכנולגיות serverless, אכיטקטורה ועוד.

אם זה מעניין אותכם מזמנים לעקוב.

 

מועניינים לראות את הקוד להשתמש או אפילו לקחת בו חלק ולתרום? 
https://github.com/achiyahb/love-songs-serverless-sender

אודה על לחיצה על הStar

ואם אהבתם את הפוסט, מוזמנים לכתוב לי בתגובות לשתף או לתת לייק
ואם יש לכם הערות מוזמנים לכתוב לי בתגובות או בפרטי

 

קישורים-
לפרק של מפתחים מחוץ לקופסא על Event Driven Architecture
https://outside-the-box.dev/episodes/event-driven-architecture

תכנים נוספים שבועז מעלה לערוץ היוטיוב שלו כולל סדרת הרצאות בנושא עלויות ענן והרבה תכנים על serverless - קישור
תכנים נוספים תוכלו למצוא גם בבלוג שלו

זהו חברים וחברות, להתראות
הלכתי להשתמש בפרוייקט ולכתוב שיר אהבה לאשתי