שלוש שאלות שקובעות את הדפוס - לא הכלי
הטעות הנפוצה בבחירת אינטגרציה ל-Salesforce היא להתחיל מהכלי: MuleSoft, Platform Events, Bulk API או Webhook פשוט. הכלי הוא תוצאה, לא נקודת מוצא. שלוש שאלות קובעות את הדפוס הנכון:
- כמה מהר הצד השני חייב לדעת? שנייה, דקה, שעה או יום - ההבדל בין Real-Time ל-Batch.
- מי הבעלים של הנתון בכל רגע נתון? אם התשובה אינה חד-משמעית, שום דפוס טכני לא יפתור את הבעיה.
- מה קורה כשהצד השני לא זמין? תשובה ל"נחכה שוב" היא לא תשובה - צריך התנהגות מוגדרת: Retry, תור, או כישלון גלוי.
מי שעונה על השלוש האלה לפני שבוחר טכנולוגיה, כמעט תמיד מגיע לאותה מסקנה שהיה מגיע אליה ארכיטקט מנוסה - רק בלי לשלם על ניסוי וטעייה בייצור. הרחבה על החיבור בין החלטה זו לארכיטקטורה הכוללת מופיעה במדריך ארכיטקטורת CRM.
מפת הדפוסים: מתי כל אחד מתאים
| דפוס | זמן תגובה טיפוסי | דוגמת שימוש טיפוסית | עלות תחזוקה | הסיכון המרכזי |
|---|---|---|---|---|
| Request-Reply סינכרוני | מילישניות עד שניות | בדיקת אשראי לפני אישור עסקה במסך | בינונית | Timeout תוקע את המשתמש |
| Fire-and-Forget | מיידי בשליחה, ללא המתנה לתוצאה | שליחת אירוע ליצירת Task במערכת אחרת | נמוכה-בינונית | כשל שקט ללא ניטור |
| Batch תקופתי | שעות עד יממה | סנכרון קטלוג מוצרים פעם ביום מ-ERP | נמוכה | פערי זמן בין המערכות |
| CDC (Change Data Capture) | שניות עד דקות | עדכון סטטוס הזמנה שמשפיע על תמיכה | בינונית-גבוהה | עומס על ה-Event Bus בשינויים מרובים |
| Event-Driven (Platform Events / Pub-Sub) | שניות | הודעה על אירוע עסקי לכמה צרכנים במקביל | גבוהה בהקמה, נמוכה בתחזוקה | דורש משמעת Schema ו-Versioning |
הטבלה היא נקודת פתיחה לדיון, לא פסיקה סופית. מערכת אחת יכולה, ולעיתים חייבת, להשתמש בכמה דפוסים במקביל לפי סוג הנתון.
למה Latency לא מספיק כדי להחליט
הטעות השנייה הנפוצה: להחליט לפי Latency בלבד ולהתעלם מעקביות (Consistency). דפוס מהיר שמעדכן רק צד אחד ומשאיר את הצד השני "כמעט מסונכרן" יוצר בעיה חמורה יותר מדפוס איטי אבל עקבי - כי המשתמשים לומדים לא לסמוך על הנתון, ואז עוקפים את המערכת.
השאלה הנכונה היא זוגית: כמה מהר נדרשת התגובה, וכמה חמור מצב שבו שני הצדדים לא מסונכרנים לרגע. תהליך תמחור שמוצג ללקוח דורש גם מהירות וגם עקביות מלאה - שם נדרש Request-Reply סינכרוני עם Timeout מוגדר וטיפול מפורש בכישלון. עדכון "מספר צפיות במאמר" יכול לחיות בשקט עם איחור של דקות - שם Fire-and-Forget או CDC מספיקים.
בעלות על נתונים: החלטה שקודמת לכל דפוס
לפני שבוחרים איך הנתון עובר בין המערכות, צריך להכריע איפה הוא "אמיתי". שדה שמתעדכן בשתי מערכות בלי בעלים מוגדר יוצר לולאת סנכרון: A שולח ל-B, B מעדכן ומשדר בחזרה ל-A, A שולח שוב. זה לא תרחיש קיצון - זה התוצאה הצפויה של סנכרון דו-כיווני ללא כלל הכרעה.
כלל עבודה מעשי: לכל שדה משותף קובעים Owner יחיד. אם יש צורך עסקי אמיתי בעריכה משני הצדדים (למשל שירות לקוחות מעדכן כתובת גם ב-Salesforce וגם ב-ERP), מוסיפים כלל Conflict Resolution מפורש - Timestamp אחרון מנצח, או שדה אחד קובע והשני להצגה בלבד. ניהול הרשאות סביב אותם שדות רגישים נדון במדריך מודל ההרשאות ב-Salesforce.
טיפול בכשל: הבדיקה שרוב הפרויקטים מדלגים עליה
כמעט כל אינטגרציה עוברת בדיקת Happy Path. מעטות עוברות בדיקה שיטתית של שלושת תרחישי הכשל האלה:
- המערכת השנייה לא זמינה בזמן השליחה - האם ההודעה נשמרת בתור ונשלחת שוב, או אובדת?
- ההודעה מגיעה פעמיים (בעיה נפוצה ב-Retry אוטומטי וב-Event Bus) - האם הצד המקבל יוצר רשומה כפולה?
- ההודעה מגיעה בסדר שגוי - האם עדכון סטטוס "בוטל" שמגיע לפני "אושר" גורם לתוצאה שגויה?
מערכת שלא בנויה כ-Idempotent (מזהה ייחודי לכל הודעה + בדיקה אם כבר טופלה) תיכשל בדיוק בשני התרחישים הראשונים, ולרוב תחת עומס - כלומר בדיוק כשהעסק הכי תלוי בה. מגבלות ה-API וההתמודדות עם Throttling בהקשר הזה מפורטות במדריך Salesforce API Limits.
מסגרת החלטה: מהשאלה העסקית לדפוס
| שאלה שנשאלת ראשונה | אם התשובה "כן" | אם התשובה "לא" |
|---|---|---|
| האם משתמש ממתין למסך לתוצאת האינטגרציה? | Request-Reply סינכרוני עם Timeout מוגדר | ממשיכים לשאלה הבאה |
| האם נדרש עדכון תוך דקות בודדות של שינוי בודד? | CDC או Platform Event | ממשיכים לשאלה הבאה |
| האם כמה צרכנים שונים צריכים לדעת על אותו אירוע? | Event-Driven עם Pub-Sub | ממשיכים לשאלה הבאה |
| האם נוח לעבד נפח גדול בחלון זמן קבוע? | Batch תקופתי | לבחון Fire-and-Forget עם תור |
זו נקודת פתיחה לדיון בישיבת ארכיטקטורה, לא נוסחה ממצה - יש תמיד מקרי גבול (למשל נפח עצום שדורש CDC אך גם Batch Reconciliation יומי כרשת ביטחון).
תרחיש להמחשה: רשת מרפאות פרטיות עם עשרים סניפים
נניח רשת מרפאות המפעילה Salesforce לניהול פניות מטופלים ומערכת חיוב נפרדת (Billing) שאינה יכולה להיות מוחלפת בשלב זה. הדרישה: כשמטופל משלים תור, יש לעדכן את מערכת החיוב מיידית, וכשחיוב מתעדכן (למשל תשלום התקבל), Salesforce צריך לשקף זאת כדי שנציג השירות לא יבקש תשלום כפול.
הבחירה הראשונית של הצוות הייתה Batch לילי דו-כיווני - פשוט להקמה, אך יצר פער של עד 24 שעות שבו נציגים ראו מידע לא מעודכן וגרם לתלונות. הפתרון שנבחר בפועל: כיוון אחד (השלמת תור מ-Salesforce לחיוב) עבר ל-Fire-and-Forget עם תור הודעות ו-Retry אוטומטי, כי אין צורך שהמשתמש ימתין. הכיוון השני (אישור תשלום מהחיוב ל-Salesforce) עבר ל-CDC, כי מדובר בשינוי נקודתי שצריך להגיע תוך דקות. Batch לילי נשאר רק כמנגנון Reconciliation - השוואה יומית שמאתרת פערים ומתריעה, לא כערוץ העדכון העיקרי.
התוצאה: זמן העדכון ירד משעות לדקות, ומנגנון ה-Reconciliation תפס שני מקרים של הודעות שאבדו בחודש הראשון - בדיוק התפקיד שלו.
סיכונים ופעולות מניעה ספציפיות לאינטגרציה
| סיכון | איך הוא נראה בפועל | פעולת מניעה |
|---|---|---|
| חוסר Idempotency | רשומות כפולות אחרי Retry או תקלת רשת | מזהה ייחודי להודעה + בדיקת קיום לפני יצירה |
| מקור אמת לא מוגדר | לולאת סנכרון או עדכון "מנצח" אקראי | Owner מוגדר לכל שדה + כלל Conflict Resolution |
| Point-to-Point ללא שכבת אינטגרציה | כל שינוי סכימה במערכת אחת שובר חיבור אחר | שכבת Middleware/API עם חוזה גרסאות מפורש |
| ניטור טכני בלבד | האינטגרציה "ירוקה" אך הזמנות חסרות בפועל | מדד Reconciliation עסקי, לא רק Uptime טכני |
| התעלמות מ-Governor Limits | האינטגרציה קורסת דווקא בעומס שיא | תכנון Bulkification ו-Backoff מראש, לא כתגובה |
Checklist לבחירת דפוס אינטגרציה
- ☐ הוגדר זמן תגובה נדרש במספרים, לא במילה "מהר"
- ☐ הוגדר Owner יחיד לכל שדה משותף בין המערכות
- ☐ נבדק מה קורה כשהצד השני לא זמין - ותועד
- ☐ נבדק מה קורה כשהודעה מגיעה פעמיים
- ☐ נבדק מה קורה כשהודעות מגיעות שלא בסדר
- ☐ קיים מנגנון Reconciliation גם כשהדפוס העיקרי אסינכרוני
- ☐ מגבלות API ו-Governor Limits נבדקו מול נפח צפוי בעומס שיא
- ☐ הוגדרו מדדי הצלחה עסקיים ולא רק טכניים
מדדים לבדיקה שוטפת של האינטגרציה
לאחר ההשקה כדאי לעקוב אחרי שלושה עד ארבעה מדדים בלבד: שיעור הודעות שהצליחו בניסיון ראשון, זמן קצה-לקצה בפועל מול ה-SLA שהוגדר, פערי Reconciliation יומיים בין המערכות, וקרבה למגבלות API. עלייה עקבית באחד מהם - ולא רק חריגה חד-פעמית - היא האיתות לבחון מעבר לדפוס אחר, לפני שהמערכת נכשלת בייצור. שיקולי זהות והרשאות גישה בין מערכות מפורטים במדריך SSO וזהות ב-Salesforce.
סיכום
בחירת דפוס אינטגרציה נכונה לא מתחילה בשאלה "איזה כלי", אלא בשלוש שאלות: כמה מהר צריך תגובה, מי הבעלים של הנתון, ומה קורה כשמשהו נכשל. Real-Time מתאים כשמשתמש ממתין לתוצאה; CDC ו-Event-Driven מתאימים לעדכון מהיר של שינוי בודד או להפצה למספר צרכנים; Batch מתאים לנפח גדול בחלון זמן קבוע. בכל דפוס, Idempotency, בעלות מוגדרת על נתונים ומנגנון Reconciliation הם לא "נחמד שיהיה" - הם התנאי לכך שהאינטגרציה תעמוד בעומס אמיתי ולא רק בדמו.
מקורות מקצועיים
- Salesforce Integration Patterns — https://architect.salesforce.com/docs/architect/fundamentals/guide/integration-patterns.html
- Salesforce Data Integration Decision Guide — https://architect.salesforce.com/docs/architect/decision-guides/guide/data-integration.html
- HPI Pro – ארכיטקטורת CRM — https://hpi.pro/crm-architecture
- HPI Pro – אינטגרציות ודאטה — https://hpi.pro/integrations-data
