הפעלת טרדים במכונה לשליחת הודעות
-
שלום
יש לי אתגר בתוכנה שתפקידה לקחת רשומות מהדטה בייס ולשלוח הודעות ע"פ הרשומות.
יש כרגע כ 4 סוגי הודעות
1)פקס
2)אימייל
3)SMS
4)הודעה קוליתכל ההודעות מרוכזות לצורך העניין בטבלת Messages ונוצרים בטבלה הזאת כל הזמן רשומות חדשות.
כל הודעה שנשלחה בהצלחה, יש עדכון במסד נתונים.
על מנת שהמערכת תעבוד ביעילות, אני צריך לכאורה טרדים שיעבדו במקביל, כי בן אדם לא צריך לקבל SMS או אימייל שלוקח מאית שניה, עד שכבוד הפקסים יסיימו את עבודתם.
כעת מכיוון שהדטה בייס מכניס כל הזמן רשומות חדשות לטבלת ההודעות, אני צריך להחזיק אוסף ייחודי לכאורה מסוג זה של ID כך בפסיקת שעון של 5 דקות נניח, ייכנסו כל ה ID החדשים, ואני בטוח שלא תהיינה כפילויות הואיל ומה שכבר קיים לא יחזור על עצמו.מה שאני רוצה מהפורום?? הצעות. איך להתמודד עם מפלצת כזאת, מדובר באלפי עד עשרות אלפי רשומות מידי חודש, כאשר יש ימים של עומס יתר, ואני רוצה להגיע למקסימום יעילות (גם שהתוכנה הזאת לא תתפוס לי חצי מהזיכרון של השרת) איזה טרדים לעשות, מה מי מו, כל תרומה תתקבל בברכה. יש שם עבודות רבות תוך כדי שליחת הודעה, מסוג של המרת קבצים מפורמט לפורמט, יצירת קבצים פיזית על הדיסק הקשיח ומחיקתם לאחר מכן, אבל יש דברים שכמעט לא לוקחים משאבים כגון SMS שזה בסך הכל לשלוח מחרוזת (שאמנם מעובדת היטיב במחלקה מיוחדת, אבל לא נראה לי זולל משאבים כ"כ) איך לחלק את העבודה בצורה שוויונית והגיונית.
תודה לכולם.עריכה: כמו"כ יש לדאוג שלא יישלחו פקסים בשבת וגם לא בלילה מאוחר, הבעיה שברגע שזה נמצא בחסות של windows אין לדעת מה יעלה בגורלו אם יש אלף פקסים בתור.
פורסם במקור בפורום CODE613 ב15/05/2014 13:20 (+03:00)
-
זה מאוד מאתגר הנושא.
אני לא בטוח הבנתי הכל:
- יש טבלה בה יש הודעות ממתינות לשליחה.
- יש שדה כן/לא בטבלה שההודעה נשלחה.
- כל הודעה יש לה פרוצדורת שליחה שונה - מייל/פקס/SMS וגם עיבודים שונים של מערכת קבצים וכו'.
אז אני מדמיין מחלקה כזאת:
-
שדה מספרי (להלן LastId), מייצג את מזהה הרשומה האחרונה שנכנסה.
-
מנהל Task - משהו שנקרא TaskScheduler. אפשר ליצור ממנו כמו טרידים עם שליטה על המספר הבו זמני של הביצוע.
- אם יש הבדל רב בין העומס המותר לסוג תקשורת מסויים או סוג הודעה מסויים (למשל שפקס כבד למערכת יותר מSMS) אפשר לעשות קיבוץ לשורות
לפי סוג ומנהל מתאים לכל סוג.
- אם יש הבדל רב בין העומס המותר לסוג תקשורת מסויים או סוג הודעה מסויים (למשל שפקס כבד למערכת יותר מSMS) אפשר לעשות קיבוץ לשורות
-
פונקציית טעינה: שאילתה מהDB לשורות אשר לא נשלחו והID שלהם גדול מLastId - יצירה פר שורה של Task ע"י המנהל.
-
טיימר לפונקציית הטעינה אפי' כל דקה.
המושג Task הוא טריד ידידותי מאוד למפתחים. הוא מכיל בו הוראות מה לעשות בעת פעולה והוראת ריצה אסינכרונית (בברירת מחדל). כל עוד הוא לא מורץ הוא רק תופס את הזיכון של מס' שדותיו, וזה כמו מחלקה רגילה. אם הסקבילריות דורשת לדמיין שיהיו מליון רשומות שנטענות בו זמנית (ונקודת זמן אחת), אז יש מקום למנוע טעינת כל השורות ישירות לTask אלא לעשות תור FIFO - בדוט נט זה: Queue<T> ובסיום מאה Task לדוגמה, לטעון חזרה חדשים עד סיום התור.
פורסם במקור בפורום CODE613 ב15/05/2014 15:05 (+03:00)
-
@דוד ל.ט.
- יש טבלה בה יש הודעות ממתינות לשליחה.
נכון, אבל יש גם תאריך ושעה שבה ההודעה צריכה להישלח, וזה עוד תנאי לסינון.
@דוד ל.ט.- יש שדה כן/לא בטבלה שההודעה נשלחה.
כן, זה למעשה שדה int עם כמה אופציות, אבל לצורך הענין רק ערך אחד מעיד על הודעה שצריכה להישלח והוא משתנה כאשר ההודעה נשלחה
@דוד ל.ט.- כל הודעה יש לה פרוצדורת שליחה שונה - מייל/פקס/SMS וגם עיבודים שונים של מערכת קבצים וכו'.
.
נכון מאוד.
@דוד ל.ט. - שדה מספרי (להלן LastId), מייצג את מזהה הרשומה האחרונה שנכנסה.
אי אפשר לסמוך על זה הואיל וה ID אינם עוקבים, כי ייתכן הודעה שנוצרה לפני חודש, עם תאריך ושעה לחודש קדימה, והID שלה נמוך במיוחד מההודעות שנוצרו לאחרונה.
@דוד ל.ט.- מנהל Task - משהו שנקרא TaskScheduler. אפשר ליצור ממנו כמו טרידים עם שליטה על המספר הבו זמני של הביצוע.
קצת חדש לי אני ראיתי משהו שנקרא Parallel שזאת לולאה פשוטה שעושה עבודה אסינכרונית ואפשר לשלוט על הבו זמניות.
@דוד ל.ט.- פונקציית טעינה: שאילתה מהDB לשורות אשר לא נשלחו והID שלהם גדול מLastId - יצירה פר שורה של Task ע"י המנהל.
זה בעצם פונקציה שמכניסה ID חדשים לתור, והם כבר יטופלו בהמשך בלי צורך ליצור לולאה נוספת?@דוד ל.ט.
המושג Task הוא טריד ידידותי מאוד למפתחים. הוא מכיל בו הוראות מה לעשות בעת פעולה והוראת ריצה אסינכרונית (בברירת מחדל). כל עוד הוא לא מורץ הוא רק תופס את הזיכון של מס' שדותיו, וזה כמו מחלקה רגילה. אם הסקבילריות דורשת לדמיין שיהיו מליון רשומות שנטענות בו זמנית (ונקודת זמן אחת), אז יש מקום למנוע טעינת כל השורות ישירות לTask אלא לעשות תור FIFO - בדוט נט זה: Queue<T> ובסיום מאה Task לדוגמה, לטעון חזרה חדשים עד סיום התור.
כפי שכתבתי זה חדש לי, אצטרך לקרוא חומר (מומלץ בעברית, בשביל מושגים חדשים לגמרי אני לא אוהב לקרוא בשפות זרות)
ותודה בכל אופן על ההשתתפות.
פורסם במקור בפורום CODE613 ב15/05/2014 15:15 (+03:00)
-
-
בעיית התאריך והשעה מצריכה אותך לדאוג שיהיה במסד אינדקס מוצלח לכך (לדעתי אינדקס על התאריך שעה מפולטר כלומר עם where שלא נשלח, אבל ייתכן שיותר זול אינדקס שמורכב משתי העמודות. בכל מקרה שהאינדקס "יכסה" את כל העמודות הנדרשות לתשובה) ואז המהירות תהיה דומה.
-
ההבדל בין paralel לtask שהצעתי זה בגלל שרציתי ל"שגר ולשכוח" ואילו Paralel עושה במקביל אבל ממשיכה רק אחרי שכולם גמרו.
-
פונקציית הטעינה נגמרת מייד ע"י סיום יצירת הTask פר שורה (מיידית). הTask ממתינים לריצה עד שהפונקציה תיגמר ואז הם מתחילים כולם בו זמנית - אבל בצורה מבוקרת - אחרי XXX שהתחילו המנהל חוסם את היתר, עד שאחד יפנה מקומו וכו'.
-
לא חשבתי שאתה מכיר לעומק את הבו זמניות בדוט נט, אבל ביקשת שניתן לך כיוון. בשביל ללמוד את הTask תתחיל להשתמש בזה בפרוייקט קטן, ותדמה מהירות נמוכה ע"י Sleep.
פורסם במקור בפורום CODE613 ב15/05/2014 15:41 (+03:00)
-
-
קיבלתי עכשיו המלצה מעניינת לעבוד עםסרביס של וינדווס, כאשר התוכנה שבפועל שולחת את החומר מופעלת בנפרד, והיא עצמה בעלת מספר מופעים מרובה בכל פעם כשנכנסים רשומות חדשות לתור, הסרביס ינהל את זה. כל הכאב ראש מוטל על וינדווס ואין לי שום צורך לנהל טרד ולא חצי טרד.... מה שכן זה דורש ממני לעדכן את הדטה בייס על כל רשומה שהיא נמצאת בטיפול של תהליך כלשהו, נו נו, מחיר ששווה לשלם...
פורסם במקור בפורום CODE613 ב15/05/2014 16:57 (+03:00)
-
הרעיון היחיד שאני שומע כאן זה להשתמש בתוכנה נפרדת לשליחה, והיא עצמה תפעל ללא טרידים כלל (קצת חבל כי זה ייקח לה הרבה זמן).
לא כ"כ הבנתי את הנקודה של המופעים.
הנקודה האם התוכנה תהיה סרביס או תוכנה רגילה בלתי נראית, היא חסרת משמעות לענייננו.
סרביס, זה "של וינדוס" בדיוק כמו כל תוכנה אחרת שלך. ההבדל בין סרביס לתוכנה רגילה זה סה"כ העדר משתמש גרפי וריצה פר מכונה ולא פר USER. יש עוד פיצרים כמו אתחול מחדש בכישלון וכו' וזה באמת רלוונטי למקרה שלך קצת, אבל זה לא מוריד ממך שום דאגה מהסוג שהעלית פה באשכול.פורסם במקור בפורום CODE613 ב15/05/2014 17:30 (+03:00)
-
@דוד ל.ט.
הרעיון היחיד שאני שומע כאן זה להשתמש בתוכנה נפרדת לשליחה, והיא עצמה תפעל ללא טרידים כלל (קצת חבל כי זה ייקח לה הרבה זמן).
זה לא בדיוק תוכנה נפרדת לשליחה, אלא תוכנה שמפעילה תוכנה, והתוכנה שמעבדת את החומר "כן" תעבוד עם טרד אבל מאוד פשוט, לולאה שפועלת נניח עד 10 צעדים במקביל וזה 2 שורות קוד לכתוב את זה.
@דוד ל.ט.יש עוד פיצרים כמו אתחול מחדש בכישלון וכו' וזה באמת רלוונטי למקרה שלך קצת
אוה זה חשוב.....
@דוד ל.ט.אבל זה לא מוריד ממך שום דאגה מהסוג שהעלית פה באשכול.
הדאגה העיקרית שלי, זה הכנסה של עוד אלמנטים לתור של ביצוע משימות, ומבחינתי זה לעצור את הלולאה הפועלת ולהפעיל אותה מחדש (כי אני עוד לא יודע לעשות דברים יותר טובים בלי לימוד מעמיק, וכבר התרסת בי בעבר שכל דבר שלוקח יותר מיום עבודה הריני מאשים בכך את מייקרוסופט {כי בעולם הקוד הפתוח אין את מי להאשים :lol: :lol: :lol: :lol: }) בכל אופן העצלות עדיין מהוה משקל משמעותי כאן, שאם אפשר לתכנת בצורה פשטנית מאוד, בלי להיכנס לעומק מושגי הטרדים, אז למה לא בעצם....
פורסם במקור בפורום CODE613 ב15/05/2014 17:39 (+03:00)