• בלוג
  • מהו קוד אידמפוטנטי (ולמה שיהיה לכם אכפת)

מהו קוד אידמפוטנטי (ולמה שיהיה לכם אכפת)

18/09/2018

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

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

בשפת פייתון הפונקציה הבאה מקבלת מספר ומחזירה את סכום הספרות שלו:

def sum_digits(x):
    return sum([int(n) for n in str(x)])

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

x = 12
print(sum_digits(x))
print(sum_digits(x))
print(sum_digits(x))

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

event = Notification("Don't think twice it's alright")
notify_user('ynon@hotmail.com', event)
notify_user('ynon@hotmail.com', event)
notify_user('ynon@hotmail.com', event)

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

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

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

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