מדוע אינטגרציית DeBank API נתקלת במגבלות ובכפילויות
תיק הארנק מורכב מטוקנים ביתרה, פוזיציות מושקעות בפרוטוקולים, סטייקינג וחובות בגין הלוואות. כדי לאסוף את זה במסך אחד, שכבת התצוגה פונה אל DeBank עבור כל כתובת. בזרימה של עשרות אלפי ארנקים, השירות החיצוני מתחיל להשיב בסירובים או להחזיר תשובה חלקית.
צוואר הבקבוק הראשון — מגבלות בקשות. כל עוד יש מעט כתובות, סריקה לפי לוח זמנים עוברת במלואה; עם גידול בעומס, חלק מהכתובות לא מתעדכנות, ושכבת התצוגה מציגה יתרות מיושנות. המשתמש רואה סכום שכבר אינו נמצא בכתובת, ומקבל לפיו החלטות.
השני — כפילויות פעולות. סקר חוזר לאחר ניתוק החיבור, הפעלה מחדש של משימה תקועה או שני עדכונים במקביל לאותה כתובת יוצרים פוזיציות מוכפלות: אותה הפקדה נספרת פעמיים. זה נסגר לא בחזרה על הבקשה, אלא בכתיבה אידמפוטנטית עם מפתח לפי כתובת, פרוטוקול ומזהה פוזיציה.
השלישי — שגיאות של השירות החיצוני: סירובים קצרים ותשובות חלקיות. אם שכבת התצוגה פונה למקור חיצוני בכל הצגת עמוד, עיכוב בצד השירות הופך לעיכוב אצל המשתמש, והעומס על שכבת התצוגה גדל עם מספר המסכים הפתוחים.
לכן התשובות נשמרות במטמון לפי כתובת וחלון זמן, ונתונים חלקיים מוצגים עם סימון מפורש עד העדכון המוצלח הבא.
אנחנו מפרקים כיצד זה נסגר: תור בהתחשב במכסות שהוקצו, דה-דופליקציה בכתיבה ושכבת מטמון בין שכבת התצוגה לשירות החיצוני.
מה נותנת שכבה אחודה של נתונים עבור תיק DeFi
שכבה אחודה של נתונים היא חוצץ בין שכבת התצוגה לבין מקורות חיצוניים: אגרגציית יתרות מתבצעת דרך DeBank API DeBank, ושכבת התצוגה קוראת תיק DeFi שכבר נאסף מהאחסון שלנו.
האפליקציה מפסיקה להיות תלויה בעומס של אחרים: אנו מציגים את החיתוך הידוע האחרון ומעדכנים אותו ברקע, במקום להמתין לתשובה עבור כל כתובת ברגע הרינדור.
רעננות הנתונים נקבעת לפי לוח זמנים, ולא «על העין»: כתובות עם כניסות תכופות מתעדכנות לעתים קרובות יותר, ארכיוניות — לעתים רחוקות יותר, ופוזיציות נדירות נטענות לפי דרישה.
מצב כזה שומר על תגובת שכבת התצוגה יציבה ומסיר את עיקר הבקשות מהשירות החיצוני — בשיא הן הופכות לפחותות בסדר גודל מאשר בקריאות ישירות.
| אפשרות | מתי מתאימה | מגבלות |
|---|---|---|
| קריאה ישירה ל-API חיצוני בכל הצגה | ביקורת חד-פעמית, כתובות בודדות | תגובת שכבת התצוגה תלויה בעומס של אחרים; מגבלות בקשות; כשהשירות אינו זמין המדור ריק |
| מטמון עצמאי עם עדכון ברקע | משתמשים קבועים, הצגות תכופות של אותן כתובות | נדרשים מתזמן ואיפוס רשומה לפי אירוע; הנתונים מפגרים בפרק זמן של עדכון |
| מטמון בתוספת טעינה לפי דרישה | תיקים ארוכים, כתובות חדשות, נכסים נדירים | לוגיקת עדיפויות והרכבה של תשובות חלקיות מסובכת יותר |
| אינדקסרים עצמאיים לפי צמתים | מדדים לא סטנדרטיים ושליטה מלאה בנתונים | תחזוקת צמתים, השהיית אינדוקס, עלות אחזקה גבוהה יותר |
בסוף אנו מקבלים מספרים ניתנים לבדיקה: רעננות היתרות נכנסת למרווח העדכון, שיעור התשובות המוצלחות של שכבת התצוגה נשמר מעל 99%, וזמן התגובה אינו גדל בזמני פיק של תעבורה. חלק מהכתובות מוחזרות מהמטמון מיד, ולכן מדור התיק נפתח במהירות זהה גם בשעות שקטות וגם בשיא.
מצבי קבלת נתונים: השוואת גישות
מצב קבלת הנתונים נבחר לפי שני פרמטרים: באיזו תדירות משתנה מצב הכתובת וכמה כתובות בתיק בו-זמנית. DeBank API מחזיר יתרות והיסטוריית פעולות, אך כל בקשה צורכת ממכסת הפניות — סקר ישיר של כל ארנק הופך במהירות גם לדרך היקרה ביותר וגם לשבירה ביותר.
| אפשרות | מתי מתאימה | מגבלות |
|---|---|---|
| סקר ישיר | כתובות בודדות, דיבוג, בדיקה ידנית | מספר הבקשות גדל באופן ליניארי, ואיתו זמן התגובה |
| מטמון לפי לוח זמנים | סקירת תיק, עדכון כל כמה דקות | הנתונים מפגרים אחרי הרשת; לוח זמנים תכוף נתקל במגבלה |
| זרם אירועים | העברות ועסקאות קרוב לזמן אמת | נדרשים מינוי יציב וטיפול בהחמצות לאחר ניתוק |
| אינדקס עצמאי | אנליטיקה, חיתוכים לפי היסטוריה, חישוב תשואה | אחסון משלו, חישוב מחדש וסנכרון עם הרשת |
סכימה היברידית
סכימה היברידית מרכיבה שילוב עובד: כתובות חמות מתעדכנות באמצעות זרם אירועים, השאר — במטמון לפי לוח זמנים, בקשות נקודתיות נדירות עוברות לסקר ישיר, וחיתוכים היסטוריים מחושבים באינדקס עצמאי.
הגבולות בין המצבים נקבעים לפי סף במספר הכתובות ותדירות השינויים — תגובת התיק נשארת צפויה, וצריכת המכסה אינה גדלה יחד עם בסיס הנתונים.
שלבי הטמעה: מביקורת קריאות ועד מסירה
העבודה מתבצעת ברצף: עד שלא מתואר הרכב הקריאות, אין על מה להגדיר מטמון וחזרות, ובלי נראות אי אפשר להוכיח שהאינטגרציה תשרוד עומס שיא. כל שלב מסתיים בתוצאה ניתנת לבדיקה, שאפשר להשוות למדידה בסיסית.
- ביקורת קריאות. אנו עורכים מלאי של אילו שיטות DeBank API כבר בשימוש, באיזו תדירות, כמה פניות מוכפלות והיכן אנו נתקלים במגבלות תדירות. בסוף — מפת פניות עם עדיפויות ורשימה מפורשת של בקשות שאינן נחוצות כלל.
- סכימת נתונים. אנו ממירים את התשובות למודל אחיד: רשתות ונכסים, פוזיציות בפרוטוקולים, שווי, היסטוריית פעולות. מקבעים כללים שלפיהם מאחדים כפילויות, ומה עושים עם נכסים שהמקור לא החזיר.
- הגדרת מטמון. אנו מפרידים את הנתונים לפי קצב התיישנות: יתרות ופוזיציות נשמרות במטמון לזמן קצר, מדריכי טוקנים ושערים — לזמן ארוך יותר, היסטוריה — לפי דרישה. בנפרד מתארים חימום מטמון בהתאם לפרופיל העומס הצפוי.
- חזרות בעת תקלות. אנו מציגים הגבלה על בקשות מקבילות, חזרה עם השהיה גדלה והבחנה: מה חוזרים עליו אוטומטית ומה נשלח לתור. שגיאות של ארנק אחד לא צריכות לחסום את העיבוד של האחרים.
- נראות. אנו מוציאים מדדים: שיעור התשובות מהמטמון, זמן תגובה, שיעור שגיאות לפי שיטות, עומק התור. מהם רואים היכן צוואר הבקבוק — זה הבסיס למסירה בלי ניחושים.
- בדיקה על ארנקים אמיתיים. אנו משווים את התיק לחישוב ייחוס, מריצים מקרי קצה: ארנק ריק, עשרות רשתות, נכסים ללא שער.
- מסירה. אנו מוסרים קונפיגורציות, סכימת נתונים, הוראות בנושא מגבלות וניתוח מדדים — צוות הלקוח ממשיך לשנות פרמטרים בעצמו.
קונפיגורציות, סכימות נתונים ונהלי עבודה
לאחר ההטמעה נשאר אצל הלקוח לא רק שירות עובד, אלא גם סט ארטיפקטים: הגדרות, תיאור סכימת הנתונים, כללי גישה, נהלי חזרות ודרדציה. להלן רשימה מלאה של מה שאנו מוסרים לצוות, כדי שיוכל לשנות את התנהגות האינטגרציה עם DeBank API בלי לפרק את הקוד.
- קונפיגורציה. קובץ הגדרות אחד: מגבלות בקשות, חלונות מטמון לפי כל סוג נתונים, פסקי זמן, ספי דרדציה. לכל פרמטר — הערה עם טווח בטוח וההשלכה של חריגה ממנו.
- תיאור סכימת הנתונים. טבלת התאמת שדות: מה נכנס למודלים של כתובת, תיק, יתרות ופוזיציות בפרוטוקולים, כיצד מנורמלות כתובות ודיוק טוקנים, ומה נחשב ליתרת אפס.
- מדיניות גישה. מפתחות נפרדים לקריאה ולפעולות שירות, תפקידים באחסון סודות, סדר רוטציה בלי עצירת השירות.
- נוהל חזרות. השהיה אקספוננציאלית עם פיזור, הגבלת בקשות בו-זמניות, הפרדה בין שגיאות חוזרות לשגיאות שאינן חוזרות: האחרונות עוברות להתראה לתורנות, ולא ללולאה.
- דרדציה. עם מיצוי המכסה אנו מחזירים את הצילום המוצלח האחרון עם חותמת זמן — הממשק מציג את גיל הנתונים במקום מסך ריק.
- תיעוד. הוראה לתורנות: הנפקה מחדש של מפתח, חימום מטמון לאחר תקלה, החזרת קונפיגורציה לאחור, רשימת בדיקה לקבלה עם תרחישים ניתנים לשחזור.
החבילה חיה יחד עם השירות: שינויים בסכימת התשובות ובמגבלות נרשמים בתיעוד לפני שחרור, ולכן הנהלים אינם סוטים מההתנהגות בפועל של המערכת.
מקרה בוחן: שכבת תצוגה לתיקי DeFi בזרימת ארנקים
שכבת התצוגה אוספת תיקים לפי זרימת ארנקים: המשתמש מכניס כתובת ומקבל יתרות, פוזיציות בפרוטוקולים ושווי במטבע אחד. את הנתונים אנו מושכים מ-DeBank API — בקשה אחת מחזירה תיק שלם, אך תדירות הפניות מוגבלת, ועל עשרות אלפי כתובות זה הפך לצוואר בקבוק.
מה היה לפני
כל הצגת עמוד פנתה למקור מחדש, ועדכונים חוזרים לא עשו שימוש חוזר בנתונים שכבר התקבלו. בשיא שכבת התצוגה נתקלה במגבלת הפניות: שיעור התשובות המוצלחות עמד על כ-70%, זמן התגובה הגיע ל-8–12 שניות, ובחלק מהכתובות היתרות לא תאמו את נתוני הפרוטוקולים — המספר שעל המסך לא תאם את הארנק.
מה עשינו
הצגנו מטמון לפי מפתח «כתובת + רשת» עם זמן חיים שונה לנתונים מהירים ויציבים: יתרות טוקנים חיות דקות, פוזיציות במאגרים — עשרות שניות. סריקה ברקע מחממת את המטמון מראש, ולכן שכבת התצוגה עונה בלי להמתין למקור.
פניות חוזרות הוחלקו באמצעות תור עם הגבלת תדירות, איחוד כתובות למקבצים וחזרות עם השהיה גדלה. יתרות אנו משווים בשני מעברים: אם הפער גבוה מהסף, מציגים את הערך המאושר האחרון, ולא את הערך הביניים.
מה השתנה
שיעור התשובות המוצלחות עלה מ-70% ל-99.3%, מספר הקריאות החוזרות קטן פי 6 — המטמון סופג אותן. זמן התגובה של שכבת התצוגה ירד מ-8–12 שניות ל-0.4–0.8 שנייה במקרה של פגיעה במטמון, והפערים ביתרות הצטמצמו למקרים בודדים ביום: כל אחד מנותח לפי יומן ההשוואה.
במה שונה סקר ישיר של DeBank API ממטמון עצמאי
סקר ישיר של DeBank API מחזיר את מצב התיק במועד הבקשה: יתרות לפי רשתות, פוזיציות בפרוטוקולים, הערכה במטבע בסיס. כל עוד יש מעט כתובות והבקשות בודדות, זהו המסלול הקצר ביותר — אין בסיס משלנו, אין מה לסנכרן, והנתונים מובטחים כרעננים.
המגבלות מתגלות בהיקף: לשירות יש מגבלה על תדירות הפניות, ומסך עם עשרות ארנקים נתקל בזמן התגובה ובסירובים בעומס שיא.
שכבת ביניים מסירה זאת: הכתובות נסקרות לפי תוכנית, התוצאה נשמרת בבסיס משלנו, והממשק קורא ממנו. מופיעים זמן תגובה צפוי והיסטוריית שינויים — אפשר להציג דינמיקת תיק, ולא רק חיתוך נוכחי.
המחיר לכך הוא עקביות: צריך להחליט מה עושים עם פער בין המטמון לתשובה רעננה, כיצד מסמנים רשומות מיושנות ומתי לכפות בקשה מחודשת.
סעיף עלות נפרד הוא מורכבות התחזוקה: סכימות התשובות משתנות, מתווספות רשתות ופרוטוקולים, נפחי האחסון גדלים, ונדרשים חזרות בעת תקלות ובקרה על משימות עדכון תקועות.
סכימה היברידית בדרך כלל מתגלה כעובדת: נתונים חמים על כתובות פעילות נלקחים ישירות, השאר — מהמטמון לפי נוהל עדכון, וערכים שמשפיעים על החישובים נבדקים מחדש לפני הצגה.
הבחירה בין המצבים נשענת על שלוש שאלות: כמה כתובות יש על המסך בו-זמנית, האם נדרשת היסטוריה, וכמה קריטי הפער מול המקור. התשובות לשאלות אלה קובעות את הארכיטקטורה.
ספקות טכניים שאנו מסירים לפני ההתחלה
לפני תחילת האינטגרציה, ספקות טכניים בדרך כלל חשובים יותר מאיסוף התיק עצמו: הלקוח צריך להבין מה יקרה כשהשירות החיצוני יתחיל להחזיר נתונים חלקיים או ייתקל במגבלות. להלן שאלות שאנו מפרקים עם צוות ההנדסה לפני שורת הקוד הראשונה, כדי שהסכימה לא תדרוש עריכה מחדש בפרודקשן.
אנו עוטפים פניות ל-DeBank בשכבת גישה משלנו. היא מקבצת בקשות לפי כתובות במעבר אחד, מפיצה אותן בזמן עם מרווח למגבלות ומחזירה את הגרסה התקפה האחרונה מהמטמון, עד שחלון העכשוויות פג.
היסטוריית היתרות נשמרת בבסיס משלנו — היא אינה הולכת לאיבוד בעת תקלה בצד הספק ומאפשרת לחשב מחדש את שווי התיק לכל תאריך.
מה יראה המשתמש אם השירות החיצוני נפל או קיצץ מגבלות?
הממשק מחזיר נתונים מהמטמון עם סימון וזמן העדכון האחרון, ולא מסך ריק. ניסיונות חוזרים מתבצעים עם השהיה גדלה, חלק מהבקשות עוברות לתור ונשלחות כשהמכסה מתפנה. שגיאה של השירות החיצוני אינה הופכת לשגיאה של המוצר שלנו.
כיצד מחושבות מחדש היתרות כשהרכב הנכסים משתנה?
חישוב מחדש מופעל לפי אירוע: עסקאות חדשות של הכתובת, שינוי סט הטוקנים, עדכון מחירים מתוכנן. אנו מחשבים לא «על הדרך» בכל פתיחת עמוד, אלא לפי לוח זמנים ולפי טריגר — זה מסיר עומס ונותן תוצאה זהה בפתיחה חוזרת של התיק.
כמה זמן נשמרת ההיסטוריה והאם אפשר להרכיב אותה מחדש?
תשובות גולמיות של הספק נשמרות בנפרד מהאגרגטים: אם מתודולוגיית החישוב משתנה, אפשר להרכיב את ההיסטוריה מחדש בלי לסקור שוב את השירות החיצוני. עומק האחסון נקבע בהתחלה — ממנו תלויים נפח הבסיס ומהירות הדוחות לתקופה ארוכה.
עד כמה מפתחות הגישה ל-API מוגנים?
המפתחות אינם נכנסים לקוד, לפרונטנד וללוגים: הם נמצאים באחסון מוגן, נקראים רק על ידי שכבת השירות ומונפקים באמצעות טוקנים קצרי חיים. רוטציה של מפתח אינה מחייבת פריסה מחדש של האפליקציה, וכל קריאה נרשמת ביומן עם מיסוך שדות רגישים.
נדון במשימה: נפרק את הסכימה ונחזור עם הערכה
כדי לחזור עם הערכה מדויקת של היקף העבודה, ולא עם טווח של «פחות או יותר», נדרשים נתוני קלט: כיצד בנויים הנתונים, אילו רשתות ופרוטוקולים נמצאים בשימוש, מאין מגיעה היסטוריית הפעולות והאם יש כבר בסיס כתובות משלנו. ככל שהתמונה מלאה יותר, כך יש פחות הנחות בתוכנית ההטמעה.
מה אנו מבקשים בהתחלה:
- רשימת רשתות ופרוטוקולים לתיק — אנו בודקים את כיסוי המקור ומחליטים היכן נדרש אוסף נתונים עצמאי.
- גישת בדיקה ומגבלות בקשות מאושרות — מהן תלויים סכימת המטמון ותדירות חישוב היתרות מחדש.
- 3–5 כתובות עם תוצאה צפויה — עליהן אנו בודקים את סימון התשובות ואת כללי ההמרה לשווי.
- היכן כיום נמצאות היתרות, ההיסטוריה והצילומים ובאיזו תדירות הם מתעדכנים.
- דרישות לרעננות הנתונים ולהתנהגות כאשר המקור אינו זמין.
- ממשקי יעד — אזור אישי, דוח, מערכת חיצונית: מהם תלויים פורמט הפלט והאגרגציה.
אנו חוזרים עם סכימת אינטגרציה, רשימת נקודות כשל ושלבי תוכנית הטמעה, כאשר לכל שלב הערכה משלו של היקף העבודה. את DeBank API אנו מחזיקים כאחד המקורות: היכן שהנתונים שלו מספיקים, אין אנו משכפלים אינדקסר משלנו. אנו מציעים לדון במשימה — תארו את נתוני הקלט, ונחזור עם הערכה ותוכנית.







