קוד א-סינכרוני
נכתב על ידי ליאור לביא, עודכן בתאריך 11/10/2021
כאשר אנחנו מריצים קוד ב-Apex הוא יכול לפעול באחת משתי דרכים:
- סינכרונית - הקוד רץ מיד לאחר שקראנו לו.
- א-סינכרונית - הקוד ירוץ בעתיד ב-Thread נפרד, כאשר ההחלטה מתי להריץ אותו מבוצעת על ידי השרת בהתאם לזמינות המשאבים בו ומיקום ה-Job בתור ההרצה.
ב-Salesforce ארבע שיטות מרכזיות להרצה א-סינכרונית:
קוד א-סינכרוני, למה זה טוב?
אחד היתרונות הבולטים של שימוש במתודות א-סינכרוניות הוא היכולת להריץ מתודה א-סינכרונית במקביל להמשך שימוש במערכת, ובכך לחסוך את זמן ההמתנה לסיומה. בתרשים הבא ניתן לראות דוגמה בה שלוש משימות עם זמני עיבוד שונים: המשימה הראשונה לוקחת 4 שעות, והשתיים האחרות לוקחות שעתיים כל אחת. באמצעות הפיכת המשימה הראשונה לא-סינכרונית אנחנו יכולים להריץ אותה ברקע ולהמשיך לעבוד על משימות 2 ו-3 מבלי להמתין לה, מה שמקצר את סך כל זמן הריצה לארבע שעות במקום שמונה. הזמנים בדוגמה הם להמחשה בלבד.
מתי נרצה להשתמש בקוד א-סינכרוני?
- כאשר נפנה לשירותים חיצוניים (Callouts to Web Services) - פנייה לשירותים חיצוניים עלולה לגרור המתנה למענה שיכולה לקחת מספר דקות. פנייה באמצעות מתודה א-סינכרונית לשירות חיצוני מאפשרת לנו להמשיך לעבוד מבלי שנצטרך להמתין ל-Response מהשירות החיצוני. בנוסף, במהלך ההמתנה לתשובה מהשירות החיצוני החיבור שלנו ל-Database נותר פתוח, וזהו מצב לא תקין ב-Salesforce.
- כאשר המשתמש שומר שינויים ברשומה אחת ושינויים אלו גוררים שינויים ברשומה אחרת. במקרה כזה לא נרצה שהמשתמש ימתין עד שפעולת העיבוד של הרשומה האחרת תסתיים, אלא שיוכל להמשיך לעבוד על הרשומה הנוכחית בה הוא נמצא, והשינויים ברשומה האחרת יבוצעו ברקע.
- כאשר נרצה להריץ תהליך שדורש Governor Limits גבוהים יותר ולא אכפת לנו שהתהליך לא יבוצע מיידית. הרצה א-סינכרונית ב-Salesforce מקבלת Limits גבוהים יותר.
- כאשר נרצה לעבד כמות גדולה מאוד של רשומות, אפילו מיליוני רשומות, על ידי תהליך שירוץ ברקע.
- כאשר נרצה לתזמן תהליך לרוץ בזמן מסוים.
- כאשר נרצה לפתוח Thread נפרד כדי להימנע משגיאת Mixed DML Operation.