האם WhatsApp משתמש ב- RabbitMQ
האם WhatsApp משתמש ב- RabbitMQ
ה- RabbitMQ בנוי על ארלנג שפת תכנות לשימוש כללי והיא משמשת גם על ידי WhatsApp להודעות.
סיכום
WhatsApp משתמש ב- RabbitMQ, הבנוי על ארלנג, כתור ההודעות שלו למסירת הודעות.
בעת תכנון מערכת צ’אט בזמן אמת, חשוב לקחת בחשבון את התור המשמש פלטפורמות העברת הודעות פופולריות כמו WhatsApp ו- Facebook Messenger. אמנם זה אולי נראה הגיוני שיש תור לכל אדם או קפקא-טופי עבור כל משתמש, בהתחשב במיליארדי המשתמשים בפלטפורמות אלה, גישה זו תדרוש מספר לא מעשי של תורים או נושאים. עם זאת, נצפה כי WhatsApp ו- Messenger Messenger משתמשים בתור שנקרא “איריס” (בדומה לקפקא) למסירת הודעות.
קיימות מערכות פנימיות המאכלסות מסדי נתונים (כמו HBase ו- Myrocks) מתור ההודעות, אך מסדי נתונים אלה אינם מערכת המסירה העיקרית.
שאלות ותשובות
1. על מה נבנה RabbitMQ?
RabbitMQ בנוי על שפת התכנות הכללית של ארלנג.
2. איך WhatsApp משתמש ב- RabbitMQ?
WhatsApp משתמש ב- RabbitMQ כתור ההודעות שלה למסירת הודעות.
3. מה המטרה של תור העברת הודעות?
תור העברת הודעות משמש לניתוק רכיבי מערכת, ומאפשר לשלוח הודעות ביניהם באופן אסינכרוני.
4. האם ניתן להשתמש בתור לכל אדם למסירת הודעות ב- WhatsApp או Messenger?
אמנם תור לכל אדם עשוי להיראות הגיוני, אך הוא ידרוש מספר לא מעשי של תורים בהתחשב במיליארדי המשתמשים בפלטפורמות אלה.
5. איזה תור משמש WhatsApp ו- Facebook Messenger למסירת הודעות?
Whatsapp ו- Messenger בפייסבוק משתמשים בתור שנקרא “איריס” למסירת הודעות. “איריס” דומה לקאפקא.
6. מה הם כמה ממאגרי המידע המשמשים את WhatsApp לאחסון הודעות?
WhatsApp משתמש במאגרי מידע כמו HBase ו- Myrocks כדי לאחסן הודעות. מאגרי מידע אלה מאוכלסים מתור ההודעות.
7. הוא RabbitMQ מערכת המסירה העיקרית עבור WhatsApp?
לא, RabbitMQ אינה מערכת המסירה העיקרית עבור WhatsApp. הוא משמש כמתפוס העברת הודעות למסירת הודעות.
8. משלוח הודעות ב- WhatsApp ובפייסבוק מסנג’ר סינכרוני או אסינכרוני?
משלוח הודעות ב- WhatsApp ובפייסבוק Messenger הוא אסינכרוני, כלומר, הודעות נשלחות ומתקבלות ללא תלות זה בזה.
9. מהם היתרונות של שימוש בתור העברת הודעות כמו RabbitMQ?
שימוש בתור העברת הודעות כמו RabbitMQ מאפשר ניתוק רכיבים, מדרגיות משופרת ותקשורת אסינכרונית בין אלמנטים של מערכת.
10. יכול RabbitMQ לטפל בנפחים גבוהים של הודעות?
כן, RabbitMQ נועד לטפל בנפחים גבוהים של הודעות ומסוגל לספק אותם ביעילות ובאמינות.
11. מהן האלטרנטיבות ל- RabbitMQ ליישום תור העברת הודעות?
כמה חלופות ל- RabbitMQ כוללות זרמי Apache Kafka, ActiveMQ ו- Redis.
12. האם יש מגבלות לשימוש בתור העברת הודעות כמו RabbitMQ?
מגבלות מסוימות של שימוש בתור הודעות כמו RabbitMQ כוללות את הצורך להגדיר ולכוונן אותו כראוי לביצועים אופטימליים, אובדן הודעה פוטנציאלית אם לא מוגדר כראוי, והצורך בתשתיות נוספות לתמיכה בתור ההודעות.
13. האם ניתן להשתמש ב- RabbitMQ למטרות אחרות מלבד העברת הודעות?
כן, ניתן להשתמש ב- RabbitMQ למטרות אחרות מלבד העברת הודעות, כגון תזמון משימות, ארכיטקטורות מונעות אירועים וזרמת נתונים.
14. האם RabbitMQ תומך בהודעת התמדה?
כן, RabbitMQ תומך בהתמדה בהודעות, ומאפשר לאחסן ולאחזר הודעות אפילו במקרה של כשלים במערכת.
15. כיצד RabbitMQ מבטיח אמינות מסירת הודעות?
RabbitMQ מבטיח אמינות מסירת הודעות באמצעות תכונות כמו הכרת הודעות, מפרסם מאשר ועמידות תור.
האם WhatsApp משתמש ב- RabbitMQ
ה- RabbitMQ בנוי על ארלנג שפת תכנות לשימוש כללי והיא משמשת גם על ידי WhatsApp להודעות.
תור המשמש ב- WhatsApp או Messenger
תוך כדי חשיבה באמצעות עיצוב מערכת לצ’אט בזמן אמת, אני סקרן איזה סוג תור Whatsapp או FB Messenger משתמשים בצד השרת כדי להעביר את ההודעה למקבל. מה שחשבתי שהיה שם הוא תור לאדם/קפקא-טופי, כך שכאשר יש להגיש הודעה חדשה למשתמש A, ההודעה היא תור של A. עם זאת, יתכנו מיליארדי משתמשים (ל- FB יש 2 מיליארד משתמשים), האם זה אומר שאנחנו זקוקים לשני מיליארד תורים/נושאים (בקפקה מונח)? אם כן, באיזה תור יכול להתמודד עם זה באופן מופיע. כל תגובה מוזמנת! תודה!
שאל 25 ביוני 2019 בשעה 16:44
1,669 8 8 תגי זהב 23 23 23 תגי כסף 37 37 תגי ברונזה
אתה יכול למצוא תיעוד שמסגר נבנה מעל HBase, ועכשיו Myrocks. יש מערכות פנימיות שיאכלסו את מסדי הנתונים הללו מתור, כן, אבל זו לא מערכת המסירה העיקרית. קוד.פֶּנסיוֹן מָלֵא.com/core-data/..
26 ביוני, 2019 בשעה 3:08
@cricket_007 תודה על התגובות. כן, נראה ש- FB משתמשת באיריס (Kafka Like) כתור למסירה.
alifzl/yomkippur
התחייבות זו אינה שייכת לשום סניף במאגר זה, והיא עשויה להשתייך למזלג מחוץ למאגר.
החלף ענפים/תגיות
תגי סניפים
לא יכול היה להעמיס ענפים
אין מה להראות
לא יכול היה לטעון תגיות
אין מה להראות
שם כבר נמצא בשימוש
תג כבר קיים עם שם הסניף שסופק. פקודות GIT רבות מקבלות שמות תגיות וגם סניפים, ולכן יצירת סניף זה עלולה לגרום להתנהגות בלתי צפויה. האם אתה בטוח שאתה רוצה ליצור את הענף הזה?
בטל צור
- מְקוֹמִי
- מרחבי קוד
Https github cli
השתמש ב- Git או Checkout עם SVN באמצעות כתובת האתר האינטרנט.
לעבוד מהר עם ה- CLI הרשמי שלנו. למידע נוסף על ה- CLI.
נדרשת חתימה
אנא היכנס לשימוש ב- Codespaces.
השקת שולחן העבודה של GitHub
אם שום דבר לא קורה, הורד את שולחן העבודה של Github ונסה שוב.
השקת שולחן העבודה של GitHub
אם שום דבר לא קורה, הורד את שולחן העבודה של Github ונסה שוב.
הפעלת xcode
אם שום דבר לא קורה, הורד xcode ונסה שוב.
השקת קוד Visual Studio
מרחב הקוד שלך ייפתח לאחר שתוכן.
הייתה בעיה להכין את מרחב הקוד שלך, אנא נסה שוב.
התחייבות אחרונה
סטטיסטיקות GIT
קבצים
נכשלה לטעון מידע על התחייבות אחרונה.
הודעת התחייבות אחרונה
התחייב זמן
תקרא אותי.MD
יום קיפור הוא כלי אוטומציה של WhatsApp שמטרתו להיות פיתרון עקבי וקבוע לשימוש לא מסחרי ב- WhatsApp כבוט אוטומטי.
מה זה עושה?
- שלח/לקבל הודעה יחידה ביישום WhatsApp שהוגדר מראש ב- AVD (מכשיר וירטואלי אנדרואיד)
- צור רשימת קשר ב- AVD והשתמש בו לשליחה/קבלת דברים
- פשוטו כמשמעו זה יכול לעשות הכל עם AVD (זה יוצר אפשרויות רבות לשכנוע)
בראשון ראיתי את Yowsup את הבחירה היחידה שלי, אבל בגלל הבעיות המפורטות להלן שיניתי את דעתי כדי ליישם אותה בדרך אחרת:
- מגוון סוגיות קהילתיות (מקושרות כאן)
- יוסאפ הוא סוג API מסוג API המקיים אינטראקציה עם WhatsApp Restapi, ביחס לשיקולי הביטחון הגבוה של WhatsApp, זה היה רגיש מאוד ביחס למפגשים הפעילים הנוכחיים של כל משתמש וזה לא יהיה ידידותי במיוחד עם פתרונות סינכרוניים. (כפי שאתה בטח יודע את ההגבלות של השימוש בתצוגת האינטרנט של ה- WhatsApp שאומר שעלינו לקבל חיבור אינטרנט פעיל עקבי בטלפון בו זמנית)
- העצלנות שלי וגם מאתגרת את עצמי לעשות זאת בדרך הקשה
ובכן, תלות בפרויקט זה, הם די הרבה! ראשיתכם צריכים להיות בעלי דרישות זה לקיים:
מתקיני Windows נפתרים, אך זה יכול להיות השלכה במכונת לינוקס או MacOS (שניהם לא נבדקו)
תלות | תיאור / הורד קישורים |
---|---|
סטודיו אנדרואיד | סטודיו אנדרואיד עם API API 28 |
ג’אווה | Java JDK 11 |
Mysql | קהילת מתקין MySQL 8.X ומעלה |
פייתון 2.7 | פייתון 2.7 |
אפיום | V1.10 ומעלה |
RabbitMQ | הגרסה האחרונה של RabbitMQ |
דוור | הגרסה האחרונה של הדוור |
שיקולים: אתה יכול להשתמש ב- Conda Virenv עבור Python 2.7, אבל זה טיפה לי כאב ראש רציני (לא מומלץ)
הסיבה העיקרית בה השתמשתי ב- Python 2 לפרויקט זה היא שאפיום, לקוח מחבר MySQL ו- RabbitMQ לא היו קשורים יחד בגרסה 3.
קודם כל, היה סבלני בחלק זה. לקח לי דם ודמעות כדי לנגב את חרא התלות בביצוע משימה כל כך פשוטה.
1.מכשיר וירטואלי אנדרואיד
מנהל AVD של LUANCH של סטודיו אנדרואיד, הגדר מכשיר עם אנדרואיד 9.0 עם API 28 (בחר ושם מתאים ל- AVD מכיוון שאנו זקוקים לו בשלבים נוספים).
שימו לב שעליכם להתקין את WhatsApp דרך ה- AVD עצמו, אז בחרו בגרסה הנתמכת של PlayStore.
בדוק שיש לך משתני סביבה זה בחשבונך:
שם משתנה | ערך משתנה |
---|---|
Android_home | C: \ משתמשים \ fzl \ appdata \ local \ Android \ SDK |
Java_home | C: \ קבצי תוכנית \ Java \ JDK-11.0.2 |
Pythonpath | C: \ python27; C: \ python27 \ lib \ ארירי אתר; C: \ python27 \ lib; c: \ python27 \ dlls; c: \ python27 \ תסריטים |
תיקון | C: \ python27; c: \ python27 \ סקריפטים; c: \ python27 \ lib \ חבילות אתר; C: \ קבצי תוכנית \ Java \ JDK-11.0.2; C: \ קבצי תוכנית \ Java \ JDK-11.0.2 \ bin; |
אז עליך להתחיל את ה- AVD שלך, התקן את WhatsApp בזה, וגם לאשר את ה- ADB עם המכשיר שלך (חובה)
לשם כך עליך לבצע התקני ADB או ADB USB על מנת לבדוק את האוטוריזציה של ה- AVD.
ג:\ Users\ FZl\אppdata\ Lאוקל\אndroid\ SDK\ pכלי LATFORM: מכשירי ADB רשימת מכשירים המצורפים EMULATOR-5554
אם אתה רואה את התוצאה הלא מורשית, עליך לעקוב אחר קישור זה.
2.תצורת RabbitMQ
לאחר התקנת RaabitMQ, עליך להריץ את RabbitMQ-Plugin. ייתכן שיהיה צורך באורח את שירות RabbitMQ.
לאחר מכן אתה אמור להיות מסוגל לגשת ל- RabbitMQ Web-Gui עם http: // localhost: 15672/#/כתובת במחשב המקומי שלך. אם כן, צור משתמש חדש לפי הפקודות שלהלן והפוך אותו לניהול ArmanistArtor:
RabbitMQCTL add_user סיסמת שם משתמש הִיכים זה הופך את המשתמש למנהל RabbitMQCTL SET_USER_TAGS מנהל שם משתמש הִיכים זה מגדיר הרשאות למשתמש rabbitmqctl set_permissions -p / שם משתמש ".*" ".*" ".*"
התחבר עם אישורים שנוצרו לאחרונה וייבא את מפרטי התור שכבר מצורפים ברפו זה שנקרא RabbitMQ_CONF.JSON בסעיפי הגדרות הייבוא תחת סקירה כללית Menue.
זה יוצר את התצורות הדרושות עבור ה- RabbitMQ ומאפשר את ההפרשות הדרושות.
3.אפיום
פשוט הפעל את שרת Appium עם הגדרות ברירת המחדל. Appium-Caple-Camatimities ” כבר משובץ בקוד. TL; DR: אין מה לעשות בצעד הזה.
4.Mysql
התקן את המהדורה הקהילתית של MySQL, צור חשבון DB מתאים והגדר את הפעלת השירות באופן אוטומטי כאשר מערכת ההפעלה מתחילה.
5.התקן את תלות הפיתון
כל שעליך לעשות הוא להפעיל PIP התקנה – תלות.txt על מנת לפתור את התלות של ספריות משומשות.
אתה עלול להתמודד עם גרסה מוגזמת של ספריית MySQLDB אשר ניתנת לפיתרון בהתקנת זה וזה. שמור על התקנת הפיתון 2.גרסת X של הספריות שהוזכרו.
6.צור ספריות לקבצי היומן
צור את הספריות והקבצים כמו שהוא’S שהוזכר להלן:
הִיכים ספריות ג:\ vAr\ lOG [מדריך] ג:\ vAr\ lOG\ whatsapp_api [ספרייה] הִיכים קבצי יומן ג:\ vAr\ lOG\אפאי.log c:\ vAr\ lOG\ whatsapp_single_consumer.log c:\ vAr\ lOG\ wHatsApp_Single_Worker.log c:\ vAr\ lOG \
7.הגדר את יום כיפור’S קובץ תצורה
עבור אל yomkippur-master \ configs \ config.CFG והזן את הדברים הבאים.
(אל תשנה שום דבר אלא אם כן אתה יודע מה אתה עושה)
[mysql] מארח = 127.0.0.שם משתמש 1 ='שם המשתמש שלך ב- MySQL' סיסמה ='סיסמת MySQL שלך' מסד נתונים = WhatsApp [RabbitMQ] IP = 127.0.0.1 ipqueuename = ipaddr.שם משתמש בתור ='שם המשתמש שלך ב- RabbitMQ' סיסמה ='סיסמת ה- RabbitMQ שלך' [queue_name] single_message = whatsapp_singlemessage_queue broadcasc
הפעל את הראשי.py ו- add_new_contact_producer.PY בשני סביבת מסוף/CMD נפרדת.
אם לא ראית שום שגיאה, אתה טוב ללכת.
- וודא ששרת MySQL פועל
- וודא ש- RabbitMQ Sect הוא Runnig
- הפעל את Appium עם הגדרות Defualt
- הפעל את התסריטים האלה
Python Main.PY PYTHON ADD_NEW_CONTACT_PRODUCER.PY PYTHON SONGIN_MESSAGE_PRODUCER.PY
- הפעל את Postman וצור פקודות הודעה נחשקות מהרשימה שלהלן:
הוספת איש קשר באפליקציית אנשי הקשר של גוגל
שליחת הודעה יחידה באמצעות WhatsApp
פיתוח ותורם?
רוצה לתרום? גדול! אל תהסס להפיל אותי ב.fazeli95 [at] gmail [dot] com או פשוט צור בקשת משיכה.
כל הרכיבים המשמשים בפרויקט זה הם קוד פתוח ויש להם רישיון MIT וניתן להשתמש בו בכל מוצר שאינו סדיר
על אודות
מתווך הודעות WhatsApp עם RabbitMQ, AVD ו- Appium
מבוא ל- RabbitMQ
כאן נלמד מהי RabbitMQ, שימושים ב- RabbitMQ ומדוע עלינו להשתמש ב- RabbitMQ ביישומים שלנו עם דוגמאות.
מה זה RabbitMQ?
RabbitMQ הוא AMQP מתווך העברת הודעות והוא המתווך הפופולרי ביותר של קוד פתוח ומתווך ההודעות החוצה פלטפורמות.
RabbitMQ הוא גם דרך להחליף את הנתונים בין יישומי פלטפורמה שונים כמו הודעה שנשלחה מ .נֶטוֹ ניתן לקרוא את היישום על ידי א צוֹמֶת.JS יישום או ג’אווה יישום.
ה- RabbitMQ בנוי על ארלנג שפת תכנות לשימוש כללי והיא משמשת גם על ידי WhatsApp להודעות.
מה זה AMQP?
פרוטוקול תור ההודעה המתקדם (AMQP) הוא פרוטוקול שכבת יישום רגיל פתוח עבור מכוונת הודעות והתכונות של AMQP הן כיוון הודעות, תור, ניתוב (כולל נקודה לנקודה ופרסום ומנוי), אמינות ואבטחה.
זה פותח על ידי JPMorgan ו- Imatix Corporation. AMQP תוכנן עם המאפיינים העיקריים הבאים כיעדים:
- בִּטָחוֹן
- מהימנות
- יכולת פעולה הדדית
- תֶקֶן
- לִפְתוֹחַ
RabbitMQ קל וקל לפריסה בחצרים הזמינים והוא תומך בפרוטוקולי העברת מסרים מרובים. ניתן לפרוס את RabbitMQ בתצורות מבוזרות ופדרציה כדי לעמוד בדרישות בעלות זמינות גבוהה בהיקף גבוה.
להלן הייצוג הציורי של האופן בו RabbitMQ ישמש כמתווך בין השולח לצרכן ביישומים שלנו.
מדוע ומתי להשתמש ב- RabbitMQ?
עכשיו ימים שרוב האנשים יבצעו משימות מרובות ביישום יחיד כמו שליחת מיילים או SMS, דוחות וזה ייצר עומס כבד על היישום, כך שאם תפרד את המשימות הללו, נקבל יותר מקום (זיכרון) לשרת בקשות נוספות.
על ידי שימוש ב- RabbitMQ, אנו יכולים להסיר עבודה כבדה מיישומי האינטרנט שלנו כגון שליחת דוחות בפורמט Excel או PDF’S או שליחת דוא”ל, SMS או משימה אחרת כמו להפעיל כמה יישומים אחרים כדי להתחיל לעבד.
RabbitMQ הוא קוד פתוח ומתווך הודעות חוצה פלטפורמות כך שהוא’קל לשימוש עם שפות רבות כגון .רשת, ג’אווה, פייתון, רובי, צומת.JS.
RabbitMQ נתמכו ספריות לקוחות
RabbitMQ יתמוך במספר מערכות הפעלה ושפות תכנות. RabbitMQ סיפקה ספריות לקוחות שונות לביצוע שפות תכנות.
- .נֶטוֹ
- ג’אווה
- מסגרת אביב
- אוֹדֶם
- פִּיתוֹן
- PHP
- Obstive-C ו- SWIFT
- JavaScript
- ללכת
- פרל
עיצוב מערכת: WhatsApp
בואו נעצב WhatsApp כמו שירות הודעות מיידי, בדומה לשירותים כמו WhatsApp, Facebook Messenger ו- WeChat.
מה זה WhatsApp?
WhatsApp הוא אפליקציית צ’אט המספקת שירותי הודעות מיידיות למשתמשים שלה. זהו אחד היישומים הניידים המשומשים ביותר בכוכב הלכת המחבר בין 2 מיליארד משתמשים ב -180 מדינות. WhatsApp זמין גם באינטרנט.
דרישות
המערכת שלנו צריכה לעמוד בדרישות הבאות:
דרישות פונקציונליות
- צריך לתמוך בצ’אט אחד על אחד.
- צ’אטים קבוצתיים (מקסימום 100 אנשים).
- צריך לתמוך בשיתוף קבצים (תמונה, וידאו וכו ‘.).
דרישות לא פונקציונליות
- זמינות גבוהה עם חביון מינימלי.
- המערכת צריכה להיות מדרגית ויעילה.
דרישות מורחבות
- נשלח, נמסר וקרא קבלות של ההודעות.
- הצג את התקופה האחרונה שנראתה של המשתמשים.
- הודעות לדחוף.
הערכה ואילוצים
נתחיל עם האומדן והאילוצים.
הערה: הקפד לבדוק כל קנה מידה או הנחות הקשורות לתנועה עם המראיין שלך.
תְנוּעָה
נניח שיש לנו 50 מיליון משתמשים פעילים מדי יום (DAU) ובממוצע כל משתמש שולח לפחות 10 הודעות ל -4 אנשים שונים בכל יום. זה נותן לנו 2 מיליארד הודעות ביום.
50 m i l l i o n × 20 m e s s a g e s = 2 b i l l i o n / d a y 50 \ space מיליון \ פעמים 20 \ הודעות חלל = 2 \ מיליארד שטח / יום 50 mi ll i o n × 20 m ess a g es = 2 bi ll i o n / d a y
הודעות יכולות גם להכיל מדיה כגון תמונות, סרטונים או קבצים אחרים. אנו יכולים להניח ש -5 אחוזים מההודעות הם קבצי מדיה המשותפים למשתמשים, מה שנותן לנו 200 מיליון קבצים נוספים שהיינו צריכים לאחסן.
5 p e r c e n t × 2 b i l l i o n = 200 m i l l i o n / d a y 5 \ space אחוז \ פעמים 2 \ מיליארד שטח = 200 \ שטח שטח ליום / יום 5 p erce n t × 2 bi ll i o n = 200 mi ll i o n / d a y
מה יהיו בקשות בשנייה (RPS) למערכת שלנו? 2 מיליארד בקשות ליום מתורגמות לבקשות 24K בשנייה.
2 B I L L I O N (24 שעות R S × 3600 S E C O N D S) = ∼ 24 K R E Q U E S T S / S E C O N D \ FRAC<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ sim 24k \ בקשות שטח / שנייה (24 שעות RS × 3600 SECO N D S) 2 BI LL I O N = ∼ 24 K re Q U ES T S / SECO N D2>
### אחסון אם אנו מניחים שכל הודעה בממוצע היא 100 בתים, אנו נדרוש כ -200 ג’יגה -בייט של אחסון מסד נתונים בכל יום.
2 B i l l i o n × 100 b y t e s = ∼ 200 גרם b / d a y 2 \ מיליארד שטח \ פעמים 100 \ שטח בתים = \ sim 200 \ חלל gb / day 2 bi ll i o n × 100 b y t es = ∼ 200 gb / d a y y y y y y y y y y y y y y y y y y y y y y y y y i
לפי הדרישות שלנו, אנו גם יודעים שכ -5 אחוז מההודעות היומיומיות שלנו (100 מיליון) הן קבצי מדיה. אם נניח שכל קובץ הוא 50 קילוגרם בממוצע, אנו נדרוש 10 TB אחסון בכל יום.
100 מ ‘I L L I O N × 100 K B = 10 T B / D A Y 100 \ Space מיליון \ פעמים 100 \ שטח kb = 10 \ שטח Tb / Day 100 Mi ll i o n × 100 K B = 10 TB / D A y
ובמשך 10 שנים אנו נדרשים אחסון של כ- 38 PB.
(10 T B + 0.2 T b) × 10 y e a r s × 365 d a y s = ∼ 38 p b (10 \ space tb + 0.2 \ חלל tb) \ פעמים 10 \ שנות שטח \ פעמים 365 \ ימי שטח = \ sim 38 \ חלל pb (10 tb + 0.2 Tb) × 10 Ye a rs × 365 d a ys = ∼ 38 pb
### רוחב הפס כמערכת שלנו מטפלת ב -10.2 TB של חדירה בכל יום, אנו נדרשים רוחב פס מינימלי של כ 120 מגה -בייט לשנייה.
10.2 T B (24 שעות R S × 3600 S E C O N D S) = ∼ 120 M B / S E C O N D \ FRAC<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ sim 120 \ שטח MB/שנייה (24 שעות RS × 3600 SECO N D S) 10.2 TB = ∼ 120 מגהבייט / SECO N D10.2>
### הערכה ברמה גבוהה הנה הערכתנו ברמה הגבוהה:
סוּג | לְהַעֲרִיך |
---|---|
משתמשים פעילים מדי יום (DAU) | 50 מיליון |
בקשות לשנייה (RPS) | 24K/s |
אחסון (ליום) | ~ 10.2 TB |
אחסון (10 שנים) | ~ 38 pb |
רוחב פס | ~ 120 מגה -בייט/שניות |
עיצוב מודל נתונים
זהו מודל הנתונים הכללי המשקף את הדרישות שלנו. יש לנו את השולחנות הבאים: משתמשים טבלה זו תכיל את המידע של המשתמש כגון שם, PhoneNumber ופרטים אחרים. הודעות כפי שהשם מרמז, טבלה זו תאחסן הודעות עם מאפיינים כמו סוג (טקסט, תמונה, וידאו וכו ‘.), תוכן וחותמות זמן למסירת הודעות. להודעה תהיה גם צ’אט תואם או GroupID . צ’אט טבלה זו מייצגת בעצם צ’אט פרטי בין שני משתמשים ויכולה להכיל מספר הודעות. משתמשים_ צ’אט טבלה זו ממפה משתמשים וצ’אטים כמשתמשים מרובים יכולים לקיים צ’אטים מרובים (N: M יחסי) ולהיפך. קבוצות טבלה זו מייצגת קבוצה בין מספר משתמשים. users_groups טבלה זו ממפה משתמשים וקבוצות כמשתמשים מרובים יכולים להיות חלק מקבוצות מרובות (N: M יחסי) ולהיפך.
באיזה סוג מסד נתונים עלינו להשתמש?
אמנם מודל הנתונים שלנו נראה די יחסי, אך איננו בהכרח צריכים לאחסן את הכל במסד נתונים יחיד, מכיוון שזה יכול להגביל את המדרגיות שלנו ולהפוך במהירות לצוואר בקבוק. אנו נתפצל את הנתונים בין שירותים שונים שיש להם בעלות על טבלה מסוימת. אז נוכל להשתמש במסד נתונים יחסי כמו PostgreSQL או מסד נתונים של NOSQL מבוזר כמו Apache Cassandra למקרה השימוש שלנו.
עיצוב API
הבה נעשה עיצוב API בסיסי לשירותים שלנו:
קבל את כל הצ’אטים או הקבוצות
ממשק API זה יקבל את כל הצ’אטים או הקבוצות עבור משתמש נתון .
קבל הכל((זהות המשתמש: Uuid): לְשׂוֹחֵחַ[] | קְבוּצָה[]
הזן מצב מסך מלא
צא מצב מסך מלא
פרמטרים מזהה משתמש (UUID): מזהה של המשתמש הנוכחי. החזרות תוצאה (צ’אט [] | קבוצה []): כל הצ’אטים והקבוצות שהמשתמש הוא חלק ממנו.
קבל הודעות
קבל את כל ההודעות למשתמש בהתחשב בערוץ (צ’אט או מזהה קבוצתי).
getMessages((זהות המשתמש: Uuid, ערוץ: Uuid): הוֹדָעָה[]
הזן מצב מסך מלא
צא מצב מסך מלא
פרמטרים מזהה משתמש (UUID): מזהה של המשתמש הנוכחי. מזהה ערוץ (UUID): מזהה הערוץ (צ’אט או קבוצה) שממנה יש לאחזר הודעות. החזרות הודעות (הודעה []): כל ההודעות בצ’אט נתון או בקבוצה.
לשלוח הודעה
שלח הודעה ממשתמש לערוץ (צ’אט או קבוצה).
לשלוח הודעה((זהות המשתמש: Uuid, ערוץ: Uuid, הוֹדָעָה: הוֹדָעָה): בוליאני
הזן מצב מסך מלא
צא מצב מסך מלא
פרמטרים מזהה משתמש (UUID): מזהה של המשתמש הנוכחי. מזהה ערוץ (UUID): מזהה הערוץ (צ’אט או קבוצה) המשתמש רוצה לשלוח הודעה. הודעה (הודעה): ההודעה (טקסט, תמונה, וידאו וכו ‘.) שהמשתמש רוצה לשלוח. החזרות תוצאה (בוליאנית): מייצג אם המבצע היה מוצלח או לא.
הצטרף או לעזוב קבוצה
שלח הודעה ממשתמש לערוץ (צ’אט או קבוצה).
להצטרף לקבוצה((זהות המשתמש: Uuid, ערוץ: Uuid): בוליאני לעזוב קבוצה((זהות המשתמש: Uuid, ערוץ: Uuid): בוליאני
הזן מצב מסך מלא
צא מצב מסך מלא
פרמטרים מזהה משתמש (UUID): מזהה של המשתמש הנוכחי. מזהה ערוץ (UUID): מזהה הערוץ (צ’אט או קבוצה) המשתמש רוצה להצטרף או לעזוב. החזרות תוצאה (בוליאנית): מייצג אם המבצע היה מוצלח או לא.
עיצוב ברמה גבוהה
עכשיו בואו נעשה תכנון ברמה גבוהה של המערכת שלנו.
ארכיטקטורה
אנו נשתמש בארכיטקטורת שירותי מיקרו מכיוון שהיא תקל על קנה מידה אופקי ופירוק את השירותים שלנו. לכל שירות תהיה בעלות על מודל הנתונים שלו. בואו ננסה לחלק את המערכת שלנו לכמה שירותי ליבה. שירות משתמש זהו שירות מבוסס HTTP המטפל בדאגות הקשורות למשתמש כמו אימות ומידע על משתמשים. שירות צ’אט שירות הצ’אט ישתמש ב- WebSocket. אנו יכולים גם להשתמש במטמון כדי לעקוב אחר כל החיבורים הפעילים סוג של מפגשים כמו שיעזרו לנו לקבוע אם המשתמש מקוון או לא. שירות הודעה שירות זה פשוט ישלח הודעות דחיפה למשתמשים. זה יידון בפירוט בנפרד. שירות נוכחות שירות הנוכחות יעקוב אחר הסטטוס האחרון שנראה של כל המשתמשים. זה יידון בפירוט בנפרד. שירות מדיה שירות זה יטפל במדיה (תמונות, סרטונים, קבצים וכו ‘.) העלאות. זה יידון בפירוט בנפרד. מה עם תקשורת בין-שירות וגילוי שירות? מכיוון שהארכיטקטורה שלנו מבוססת על שירותי מיקרו, השירותים יתקשרו גם זה עם זה. באופן כללי, REST או HTTP מבצעים ביצועים טובים אך אנו יכולים לשפר עוד יותר את הביצועים באמצעות GRPC שהוא קל יותר ויעיל יותר. גילוי שירות הוא דבר נוסף שנצטרך לקחת בחשבון. אנו יכולים להשתמש גם ברשת שירות המאפשרת תקשורת מנוהלת, ניתנת לצפייה ובטוחה בין שירותים בודדים. הערה: למידע נוסף על REST, GraphQL, GRPC ואיך הם משווים זה לזה.
העברת הודעות בזמן אמת
כיצד אנו שולחים וקובעים ביעילות? יש לנו שתי אפשרויות שונות: דגם משיכה הלקוח יכול להעביר מדי פעם בקשת HTTP לשרתים כדי לבדוק אם יש הודעות חדשות. ניתן להשיג זאת באמצעות משהו כמו סקרים ארוכים. דגם דחיפה הלקוח פותח חיבור ממושך עם השרת וברגע שנתונים חדשים יהיו זמינים הוא יידחף ללקוח. אנו יכולים להשתמש ב- WebSocket. גישת מודל המשיכה אינה ניתנת להרחבה מכיוון שהיא תיצור תקורה של בקשה מיותרת בשרתים שלנו ורוב הזמן התגובה תהיה ריקה, ובכך לבזבז את המשאבים שלנו. כדי למזער את החביון, השימוש במודל הדחיפה עם WebSocket. כמו כן, WebSockets מספקים תקשורת דופלקסית מלאה, בניגוד לאירועים שנמצאו בשרת (SSE) שהם רק חד כיווניים. הערה: למידע נוסף על סקרים ארוכים, WebSockets, אירועי שרת (SSE).
נראה לאחרונה
כדי ליישם את הפונקציונליות האחרונה שנראתה, אנו יכולים להשתמש במנגנון פעימות לב, כאשר הלקוח יכול להעביר מעת לעת את השרתים המציין את חיותו. מכיוון שזה צריך להיות תקורה נמוכה ככל האפשר, אנו יכולים לאחסן את חותמת הזמן הפעילה האחרונה במטמון כדלקמן:
מַפְתֵחַ | ערך |
---|---|
משתמש א | 2022-07-01T14: 32: 50 |
משתמש ב | 2022-07-05T05: 10: 35 |
משתמש ג | 2022-07-10T04: 33: 25 |
זה ייתן לנו את הפעם האחרונה שהמשתמש היה פעיל. פונקציונליות זו תטופל על ידי שירות הנוכחות בשילוב עם Redis או Memcached כמטמון שלנו. דרך נוספת ליישם זאת היא לעקוב אחר הפעולה האחרונה של המשתמש, ברגע שהפעילות האחרונה חוצה סף מסוים, כגון “המשתמש לא ביצע שום פעולה ב -30 השניות האחרונות”, אנו יכולים להראות למשתמש כבלתי מקוון ונראה לאחרונה עם חותמת הזמן האחרונה שהוקלטה. זו תהיה גישת עדכון עצלנית יותר ועשויה להועיל לנו על פעימות לב במקרים מסוימים.
התראות
לאחר שליחת הודעה בצ’אט או בקבוצה, נבדוק תחילה אם הנמען פעיל או לא, נוכל לקבל מידע זה על ידי לקחת את החיבור הפעיל של המשתמש ונראה לאחרונה בחשבון. אם הנמען אינו פעיל, שירות הצ’אט יוסיף אירוע לתור הודעות עם מטא נתונים נוספים כמו פלטפורמת ההתקנים של הלקוח שתשמש לנתב את ההודעה לפלטפורמה הנכונה בהמשך. לאחר מכן שירות ההודעות יצרוך את האירוע מתור ההודעות ויעביר את הבקשה ל- Firebase Cloud Messaging (FCM) או שירות הודעות Apple (APNS) על בסיס פלטפורמת המכשירים של הלקוח (Android, iOS, Web, וכו ‘). אנו יכולים להוסיף תמיכה בדוא”ל ו- SMS. מדוע אנו משתמשים בתור הודעה? מכיוון שרוב תורי ההודעות מספקים הזמנה הטובה ביותר למאמץ המבטיח שהודעות נמסרות בדרך כלל באותו סדר כמו שנשלחו וכי הודעה מועברת לפחות פעם אחת שהיא חלק חשוב בפונקציונליות השירות שלנו. אמנם זה נראה כמו מקרה שימוש קלאסי של רישום פרסום, אך למעשה זה לא כמכשירים ניידים ודפדפנים יש כל דרך משלהם לטפל בהודעות דחיפה. בדרך כלל, התראות מטופלות חיצונית באמצעות העברת העננים של Firebase (FCM) או שירות הודעות דחיפה של Apple (APN) שלא כמו Fan Mane-Out שאנו רואים בדרך כלל בשירותי Backend. אנו יכולים להשתמש במשהו כמו Amazon SQS או RabbitMQ כדי לתמוך בפונקציונליות זו.
לקרוא קבלות
טיפול בקבוצות קריאה יכול להיות מסובך, למקרה שימוש זה נוכל לחכות לאישור איזשהו אישור (ACK) מהלקוח כדי לקבוע אם ההודעה נמסרה ולעדכן את שדה ה- DispartDat המתאים. באופן דומה, נסמן את הודעת ההודעה שנראתה ברגע שהמשתמש יפתח את הצ’אט ונעדכן את שדה חותמת הזמן המתאים לתאם.
לְעַצֵב
כעת, לאחר שזיהינו כמה רכיבי ליבה, בואו נעשה את הטיוטה הראשונה של עיצוב המערכת שלנו.
עיצוב מפורט
הגיע הזמן לדון בפירוט החלטות העיצוב שלנו.
חלוקת נתונים
- חלוקה מבוססת חשיש
- חלוקה מבוססת רשימה
- חלוקה מבוססת טווח
- חלוקה מורכבת
הגישות לעיל עדיין יכולות לגרום לנתונים לא אחידים ולהפצת עומס, אנו יכולים לפתור זאת באמצעות hashing עקבי.
מטמון
ביישום העברת הודעות, עלינו להקפיד להשתמש במטמון מכיוון שמשתמשים שלנו מצפים לנתונים האחרונים, אך משתמשים רבים יבקשו את אותן הודעות, במיוחד בצ’אט קבוצתי. לכן, כדי למנוע דוקרני שימוש מהמשאבים שלנו אנו יכולים למטמון בהודעות ישנות יותר.
בחלק מהצ’אטים הקבוצתיים יכולים להיות אלפי הודעות ושליחת זה ברשת תהיה ממש לא יעילה, כדי לשפר. החלטה זו תועיל למשתמשים עם רוחב פס מוגבל של רשת מכיוון שהם לא יצטרכו לאחזר הודעות ישנות אלא אם כן יתבקשו.
באיזו מדיניות פינוי מטמון להשתמש?
אנו יכולים להשתמש בפתרונות כמו Redis או Memcached ו- Cace?
לפחות נעשה שימוש לאחרונה (LRU) יכול להיות מדיניות טובה למערכת שלנו. במדיניות זו אנו משליכים תחילה את המפתח הכי פחות ששימש.
כיצד להתמודד עם החמצת המטמון?
בכל פעם שיש פספוס של מטמון, השרתים שלנו יכולים להכות ישירות במסד הנתונים ולעדכן את המטמון עם הערכים החדשים.
לפרטים נוספים, עיין במטמון.
גישה ואחסון מדיה
כידוע, רוב שטח האחסון שלנו ישמש לאחסון קבצי מדיה כמו תמונות, סרטונים או קבצים אחרים. שירות המדיה שלנו יטפל בגישה וגם לאחסון של קבצי המדיה של המשתמש.
אבל היכן נוכל לאחסן קבצים בקנה מידה? ובכן, אחסון אובייקטים זה מה שאנחנו מחפשים. חנויות אובייקטים מפרקות קבצי נתונים לחתיכות הנקראות אובייקטים. לאחר מכן הוא מאחסן את האובייקטים האלה במאגר יחיד, שניתן לפרוס על פני מערכות רשתות מרובות. אנו יכולים להשתמש גם באחסון קבצים מופץ כגון HDFS או Glusterfs.
עובדה מהנה: WhatsApp מוחק מדיה בשרתים שלה לאחר שהורדת על ידי המשתמש.
אנו יכולים להשתמש בחנויות אובייקטים כמו Amazon S3, Azure Blob Storage או Storage Cloud Google למקרה שימוש זה.
רשת מסירת תוכן (CDN)
רשת מסירת תוכן (CDN) מגדילה את זמינות התוכן ויתירות תוך הפחתת עלויות רוחב הפס. באופן כללי, קבצים סטטיים כמו תמונות וסרטונים מוגשים מ- CDN. אנו יכולים להשתמש בשירותים כמו Amazon Cloudfront או CloudFlare CDN למקרה שימוש זה.
שער API
מכיוון שנשתמש בפרוטוקולים מרובים כמו HTTP, WebSocket, TCP/IP, פריסת מספר רב של L4 (שכבת הובלה) או L7 (שכבת יישום) מאזני עומס בנפרד עבור כל פרוטוקול יהיה יקר. במקום זאת, אנו יכולים להשתמש בשער API התומך בפרוטוקולים מרובים ללא בעיות.
API Gateway יכול גם להציע תכונות אחרות כמו אימות, הרשאה, הגבלת קצב, מצערת וגרסת API אשר ישפרו את איכות השירותים שלנו.
אנו יכולים להשתמש בשירותים כמו Amazon API Gateway או Azure API Gateway למקרה שימוש זה.
לזהות ולפתור צווארי בקבוק
הבה נזהה ונפתור צווארי בקבוק כמו נקודות כישלון בודדות בעיצוב שלנו:
- “מה אם אחד מהשירותים שלנו מתרסק?”
- “איך נפיץ את התנועה שלנו בין הרכיבים שלנו?”
- “איך נוכל להפחית את העומס במסד הנתונים שלנו?”
- “כיצד לשפר את זמינות המטמון שלנו?”
- “האם שער API לא יהיה נקודת כישלון אחת?”
- “איך נוכל להפוך את מערכת ההודעות שלנו לחזקה יותר?”
- “איך נוכל להפחית את עלויות האחסון במדיה”?
- “האם לשירות צ’אט יש אחריות רבה מדי?”
כדי להפוך את המערכת שלנו לגמישה יותר אנו יכולים לעשות את הדברים הבאים:
- הפעלת מקרים מרובים של כל אחד מהשירותים שלנו.
- הצגת מאזני עומסים בין לקוחות, שרתים, מסדי נתונים ושרתי מטמון.
- שימוש בשכפול קריאה מרובה עבור מסדי הנתונים שלנו.
- מספר מקרים ושכפול עבור המטמון המופץ שלנו.
- אנו יכולים לקבל העתק המתנה של שער ה- API שלנו.
- בדיוק ברגע שההזמנה של המסירה וההודעות מאתגרת במערכת מבוזרת, אנו יכולים להשתמש במתווך הודעות ייעודי כמו אפאצ’ה קפקא או נאט כדי להפוך את מערכת ההודעות שלנו לחזקה יותר.
- אנו יכולים להוסיף יכולות עיבוד מדיה ודחיסה לשירות המדיה כדי לדחוס קבצים גדולים הדומים ל- WhatsApp שיחסוך שטח אחסון רב ויפחית את העלות.
- אנו יכולים ליצור שירות קבוצתי הנפרד משירות הצ’אט כדי לפרק עוד יותר את השירותים שלנו.
מאמר זה הוא חלק מהקורס שלי במערכת הקוד הפתוח הזמין ב- GitHub.
Karanpratapsingh / Design
למד כיצד לעצב מערכות בקנה מידה ולהתכונן לראיונות עיצוב מערכות
קורס עיצוב מערכות
היי, ברוך הבא לקורס. אני מקווה שהקורס הזה יספק חווית למידה נהדרת.
קורס זה זמין גם באתר שלי וכספר אלקטרוני ב- Leanpub. אנא השאירו ⭐ כמוטיבציה אם זה היה מועיל!
תוכן העניינים
- מתחילים
- מהו עיצוב מערכות?
- IP
- מודל OSI
- TCP ו- UDP
- מערכת שמות דומיין (DNS)
- איזון עומסים
- אשכול
- מטמון
- רשת מסירת תוכן (CDN)
- פרוקסי
- זמינות
- מדרגיות
- אִחסוּן
- מסדי נתונים ו- DBMS
- מסדי נתונים של SQL
- מסדי נתונים של NOSQL
- מסדי נתונים של SQL לעומת NOSQL
- שכפול מסד נתונים
- אינדקסים
- נורמליזציה ודורמליזציה
- מודלים של עקביות חומצה ובסיס
- משפט כובע
- משפט Pacelc
- עסקאות
- עסקאות מופצות
- חרדה
- Hashing עקבי
- פדרציית מסד הנתונים
- ארכיטקטורה N-Tier
- מתווכי הודעות
- תורי הודעה
- פרסום-מנוי
- אוטובוס שירות ארגוני (ESB)
- מונוליטים ושירותי מיקרו
- ארכיטקטורה מונעת אירועים (EDA)
- מקור אירועים
- הפרדת אחריות פיקוד ושאילתה (CQRS)
- שער API
- מנוחה, GraphQL, GRPC
- סקרים ארוכים, WebSockets, אירועי שרת (SSE)