דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. הפעלת טרדים במכונה לשליחת הודעות

הפעלת טרדים במכונה לשליחת הודעות

מתוזמן נעוץ נעול הועבר ארכיון code613m
7 פוסטים 2 כותבים 405 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #1

    שלום

    יש לי אתגר בתוכנה שתפקידה לקחת רשומות מהדטה בייס ולשלוח הודעות ע"פ הרשומות.
    יש כרגע כ 4 סוגי הודעות
    1)פקס
    2)אימייל
    3)SMS
    4)הודעה קולית

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

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

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

    פורסם במקור בפורום CODE613 ב15/05/2014 13:20 (+03:00)

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

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      זה מאוד מאתגר הנושא.

      אני לא בטוח הבנתי הכל:

      1. יש טבלה בה יש הודעות ממתינות לשליחה.
      2. יש שדה כן/לא בטבלה שההודעה נשלחה.
      3. כל הודעה יש לה פרוצדורת שליחה שונה - מייל/פקס/SMS וגם עיבודים שונים של מערכת קבצים וכו'.

      אז אני מדמיין מחלקה כזאת:

      1. שדה מספרי (להלן LastId), מייצג את מזהה הרשומה האחרונה שנכנסה.

      2. מנהל Task - משהו שנקרא TaskScheduler. אפשר ליצור ממנו כמו טרידים עם שליטה על המספר הבו זמני של הביצוע.

        • אם יש הבדל רב בין העומס המותר לסוג תקשורת מסויים או סוג הודעה מסויים (למשל שפקס כבד למערכת יותר מSMS) אפשר לעשות קיבוץ לשורות
          לפי סוג ומנהל מתאים לכל סוג.
      3. פונקציית טעינה: שאילתה מהDB לשורות אשר לא נשלחו והID שלהם גדול מLastId - יצירה פר שורה של Task ע"י המנהל.

      4. טיימר לפונקציית הטעינה אפי' כל דקה.

      המושג Task הוא טריד ידידותי מאוד למפתחים. הוא מכיל בו הוראות מה לעשות בעת פעולה והוראת ריצה אסינכרונית (בברירת מחדל). כל עוד הוא לא מורץ הוא רק תופס את הזיכון של מס' שדותיו, וזה כמו מחלקה רגילה. אם הסקבילריות דורשת לדמיין שיהיו מליון רשומות שנטענות בו זמנית (ונקודת זמן אחת), אז יש מקום למנוע טעינת כל השורות ישירות לTask אלא לעשות תור FIFO - בדוט נט זה: Queue<T> ובסיום מאה Task לדוגמה, לטעון חזרה חדשים עד סיום התור.

      פורסם במקור בפורום CODE613 ב15/05/2014 15:05 (+03:00)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      1
      • א מנותק
        א מנותק
        ארכיטקט
        כתב ב נערך לאחרונה על ידי
        #3

        @דוד ל.ט.

        1. יש טבלה בה יש הודעות ממתינות לשליחה.

        נכון, אבל יש גם תאריך ושעה שבה ההודעה צריכה להישלח, וזה עוד תנאי לסינון.
        @דוד ל.ט.

        1. יש שדה כן/לא בטבלה שההודעה נשלחה.

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

        1. כל הודעה יש לה פרוצדורת שליחה שונה - מייל/פקס/SMS וגם עיבודים שונים של מערכת קבצים וכו'.
          .
          נכון מאוד.
          @דוד ל.ט.
        2. שדה מספרי (להלן LastId), מייצג את מזהה הרשומה האחרונה שנכנסה.

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

        1. מנהל Task - משהו שנקרא TaskScheduler. אפשר ליצור ממנו כמו טרידים עם שליטה על המספר הבו זמני של הביצוע.

        קצת חדש לי אני ראיתי משהו שנקרא Parallel שזאת לולאה פשוטה שעושה עבודה אסינכרונית ואפשר לשלוט על הבו זמניות.
        @דוד ל.ט.

        1. פונקציית טעינה: שאילתה מהDB לשורות אשר לא נשלחו והID שלהם גדול מLastId - יצירה פר שורה של Task ע"י המנהל.

        זה בעצם פונקציה שמכניסה ID חדשים לתור, והם כבר יטופלו בהמשך בלי צורך ליצור לולאה נוספת?@דוד ל.ט.

        המושג Task הוא טריד ידידותי מאוד למפתחים. הוא מכיל בו הוראות מה לעשות בעת פעולה והוראת ריצה אסינכרונית (בברירת מחדל). כל עוד הוא לא מורץ הוא רק תופס את הזיכון של מס' שדותיו, וזה כמו מחלקה רגילה. אם הסקבילריות דורשת לדמיין שיהיו מליון רשומות שנטענות בו זמנית (ונקודת זמן אחת), אז יש מקום למנוע טעינת כל השורות ישירות לTask אלא לעשות תור FIFO - בדוט נט זה: Queue<T> ובסיום מאה Task לדוגמה, לטעון חזרה חדשים עד סיום התור.

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

        ותודה בכל אופן על ההשתתפות. 🙂

        פורסם במקור בפורום CODE613 ב15/05/2014 15:15 (+03:00)

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

        תגובה 1 תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4
          • בעיית התאריך והשעה מצריכה אותך לדאוג שיהיה במסד אינדקס מוצלח לכך (לדעתי אינדקס על התאריך שעה מפולטר כלומר עם where שלא נשלח, אבל ייתכן שיותר זול אינדקס שמורכב משתי העמודות. בכל מקרה שהאינדקס "יכסה" את כל העמודות הנדרשות לתשובה) ואז המהירות תהיה דומה.

          • ההבדל בין paralel לtask שהצעתי זה בגלל שרציתי ל"שגר ולשכוח" ואילו Paralel עושה במקביל אבל ממשיכה רק אחרי שכולם גמרו.

          • פונקציית הטעינה נגמרת מייד ע"י סיום יצירת הTask פר שורה (מיידית). הTask ממתינים לריצה עד שהפונקציה תיגמר ואז הם מתחילים כולם בו זמנית - אבל בצורה מבוקרת - אחרי XXX שהתחילו המנהל חוסם את היתר, עד שאחד יפנה מקומו וכו'.

          • לא חשבתי שאתה מכיר לעומק את הבו זמניות בדוט נט, אבל ביקשת שניתן לך כיוון. בשביל ללמוד את הTask תתחיל להשתמש בזה בפרוייקט קטן, ותדמה מהירות נמוכה ע"י Sleep.

          פורסם במקור בפורום CODE613 ב15/05/2014 15:41 (+03:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          0
          • א מנותק
            א מנותק
            ארכיטקט
            כתב ב נערך לאחרונה על ידי
            #5

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

            פורסם במקור בפורום CODE613 ב15/05/2014 16:57 (+03:00)

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

            תגובה 1 תגובה אחרונה
            0
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6

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

              לא כ"כ הבנתי את הנקודה של המופעים.

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

              פורסם במקור בפורום CODE613 ב15/05/2014 17:30 (+03:00)

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              0
              • א מנותק
                א מנותק
                ארכיטקט
                כתב ב נערך לאחרונה על ידי
                #7

                @דוד ל.ט.

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

                זה לא בדיוק תוכנה נפרדת לשליחה, אלא תוכנה שמפעילה תוכנה, והתוכנה שמעבדת את החומר "כן" תעבוד עם טרד אבל מאוד פשוט, לולאה שפועלת נניח עד 10 צעדים במקביל וזה 2 שורות קוד לכתוב את זה.
                @דוד ל.ט.

                יש עוד פיצרים כמו אתחול מחדש בכישלון וכו' וזה באמת רלוונטי למקרה שלך קצת

                אוה זה חשוב.....
                @דוד ל.ט.

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

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

                פורסם במקור בפורום CODE613 ב15/05/2014 17:39 (+03:00)

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

                תגובה 1 תגובה אחרונה
                0

                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

                • התחברו או הירשמו כדי לחפש.
                • פוסט ראשון
                  פוסט אחרון
                0
                • דף הבית
                • קטגוריות
                • פוסטים אחרונים
                • משתמשים
                • חיפוש
                • חוקי הפורום