אפליקציות אינטרנט ב-Python עם ביצועים גבוהים ועם יכולת הרחבה משתמשות לעיתים קרובות במטמון נתונים מבוזר בזיכרון במקום באחסון קבוע חזק למשימות מסוימות.
הפתרון של App Engine לבעיה הזו הוא Memcache, מאגר נתונים מבוזר בזיכרון שמשמש כמטמון למשימות ספציפיות.
כשמבצעים העברה משירותים מדור קודם, השירות המומלץ להחלפת App Engine Memcache הוא Memorystore, שירות אחסון במטמון מבוסס-ענן ומנוהל באופן מלא, שתומך במנועי אחסון במטמון בקוד פתוח, Redis ו-Memcached. במדריך הזה מוסבר איך להשתמש ב-Memorystore for Redis, שמאפשר ליצור מטמון לאפליקציות עם גישה לנתונים תוך פחות מאלפית השנייה.
אם אפליקציית Python שלכם משתמשת ב-Memcache רק כדי לצמצם את זמן האחזור של בקשות ndb או Cloud NDB, אתם יכולים להשתמש בתמיכה המובנית של Cloud NDB ב-Redis במקום ב-Memcache או ב-Memorystore for Redis.
לפני שמתחילים, חשוב לוודא שהאפליקציה לא תחרוג ממכסות השימוש ב-Memorystore for Redis.
מתי כדאי להשתמש במטמון זיכרון לאפליקציות Python
באפליקציות Python, נתוני סשנים, העדפות משתמשים ונתונים אחרים שמוחזרים על ידי שאילתות לדפי אינטרנט הם מועמדים טובים לשמירה במטמון. באופן כללי, אם שאילתה שמופעלת לעיתים קרובות מחזירה קבוצת תוצאות שלא צריכות להופיע באפליקציה באופן מיידי, אפשר לשמור את התוצאות במטמון. בבקשות הבאות, המערכת יכולה לבדוק את המטמון ולשאול את מסד הנתונים רק אם התוצאות לא קיימות או שהתוקף שלהן פג.
אם מאחסנים ערך רק ב-Memorystore בלי לגבות אותו באחסון מתמיד, צריך לוודא שהאפליקציה מתנהגת בצורה סבירה אם תוקף הערך פג והוא הוסר מהמטמון. לדוגמה, אם היעדר פתאומי של נתוני פעילות של משתמש יגרום לשיבוש בפעילות, כדאי לאחסן את הנתונים האלה במסד הנתונים בנוסף ל-Memorystore.
לפני שמתחילים
אם עדיין לא עשיתם זאת, צריך להגדיר את סביבת הפיתוח של Python כך שתשתמש בגרסת Python שתואמת ל- Google Cloud, ולהתקין כלי בדיקה ליצירת סביבות Python מבודדות.
הסבר על ההרשאות ב-Memorystore
כל אינטראקציה עם שירות Google Cloud צריכה להיות מאושרת. לדוגמה, כדי ליצור אינטראקציה עם מסד נתונים של Redis שמתארח ב-Memorystore, האפליקציה צריכה לספק את פרטי הכניסה של חשבון שיש לו הרשאה לגשת ל-Memorystore.
כברירת מחדל, האפליקציה מספקת את פרטי הכניסה של חשבון השירות שמוגדר כברירת מחדל ב-App Engine, שיש לו הרשאה לגשת למסדי נתונים באותו פרויקט שבו נמצאת האפליקציה.
אם אחד מהתנאים הבאים מתקיים, צריך להשתמש בטכניקת אימות חלופית שכוללת פרטי כניסה באופן מפורש:
האפליקציה ומסד הנתונים של Memorystore נמצאים בGoogle Cloud פרויקטים שונים.
שיניתם את התפקידים שהוקצו לחשבון השירות שמוגדר כברירת מחדל ב-App Engine.
מידע על שיטות אימות חלופיות זמין במאמר הגדרת אימות לאפליקציות ייצור מסוג Server to Server.
סקירה כללית של תהליך המיגרציה
כדי להשתמש ב-Memorystore במקום ב-Memcache באפליקציית Python:
מגדירים את Memorystore for Redis. לשם כך צריך ליצור מכונת Redis ב-Memorystore וליצור Serverless VPC Access שהאפליקציה משתמשת בו כדי לתקשר עם מכונת Redis. אין חשיבות לסדר שבו יוצרים את שתי הישויות העצמאיות האלה, ואפשר להגדיר אותן בכל סדר. ההוראות במדריך הזה מתייחסות להגדרה של חיבור לרשת (VPC) מאפליקציית serverless.
מתקינים ספריית לקוח ל-Redis ומשתמשים בפקודות Redis כדי לשמור נתונים במטמון.
Memorystore for Redis תואם לכל ספריית לקוח ל-Redis.
במדריך הזה מוסבר איך להשתמש בספריית הלקוח של
redis-pyכדי לשלוח פקודות Redis מהאפליקציה.
הגדרה של Memorystore for Redis
כדי להגדיר את Memorystore for Redis:
חיבור של App Engine לרשת VPC. האפליקציה יכולה לתקשר עם Memorystore רק דרך מחבר VPC.
חשוב להוסיף את פרטי החיבור ל-VPC לקובץ
app.yamlכמו שמתואר במאמר הגדרת השימוש באפליקציה במחבר.חשוב לשים לב לכתובת ה-IP ולמספר היציאה של מופע Redis שיוצרים. תשתמשו במידע הזה כשיוצרים לקוח Redis בקוד.
יצירת מכונת Redis ב-Memorystore.
כשמוצגת בקשה לבחור אזור למופע Redis, בוחרים באותו אזור שבו נמצאת אפליקציית App Engine.
יחסי תלות בהתקנות
כדי להשתמש בספריית הלקוח redis-py:
מעדכנים את הקובץ
app.yaml. פועלים לפי ההוראות שמתאימות לגרסת Python:Python 2
באפליקציות Python 2, מוסיפים את הגרסאות האחרונות של הספריות
grpcioו-setuptools.קובץ
app.yamlלדוגמה:runtime: python27 threadsafe: yes api_version: 1 libraries: - name: grpcio version: latest - name: setuptools version: latestPython 3
באפליקציות Python 3, מציינים את הרכיב
runtimeבקובץapp.yamlעם גרסה נתמכת של Python 3. לדוגמה:runtime: python310 # or another support versionסביבת זמן הריצה של Python 3 מתקינה ספריות באופן אוטומטי, כך שלא צריך לציין ספריות מובנות מסביבת זמן הריצה הקודמת של Python 2. אם האפליקציה שלכם ב-Python 3 משתמשת בשירותים אחרים מדור קודם שכלולים בחבילה במהלך ההעברה, אתם יכולים להמשיך לציין את הספריות המובנות הנדרשות. אחרת, אפשר למחוק את השורות המיותרות בקובץ
app.yaml.מעדכנים את הקובץ
requirements.txt. פועלים לפי ההוראות שמתאימות לגרסת Python:Python 2
מוסיפים את Cloud Client Libraries for Memorystore for Redis לרשימת יחסי התלות בקובץ
requirements.txt.redisמריצים את הפקודה
pip install -t lib -r requirements.txtכדי לעדכן את רשימת הספריות שזמינות לאפליקציה.Python 3
מוסיפים את Cloud Client Libraries for Memorystore for Redis לרשימת יחסי התלות בקובץ
requirements.txt.redisApp Engine מתקין באופן אוטומטי את התלות האלה במהלך פריסת האפליקציה בסביבת זמן הריצה של Python 3, לכן צריך למחוק את התיקייה
libאם היא קיימת.באפליקציות Python 2, אם האפליקציה משתמשת בספריות מובנות או בספריות שהועתקו שצוינו בספרייה
lib, צריך לציין את הנתיבים האלה בקובץappengine_config.pyשנמצא באותה תיקייה כמו הקובץapp.yaml:import pkg_resources from google.appengine.ext import vendor # Set PATH to your libraries folder. PATH = 'lib' # Add libraries installed in the PATH folder. vendor.add(PATH) # Add libraries to pkg_resources working set to find the distribution. pkg_resources.working_set.add_entry(PATH)
יצירת לקוח Redis
כדי ליצור אינטראקציה עם מסד נתונים של Redis, הקוד צריך ליצור לקוח Redis כדי לנהל את החיבור למסד הנתונים של Redis. בקטעים הבאים מתואר תהליך היצירה של לקוח Redis באמצעות ספריית הלקוח redis-py.
ציון משתני סביבה
ספריית הלקוח redis-py משתמשת בשני משתני סביבה כדי להרכיב את כתובת ה-URL של מסד הנתונים של Redis:
- משתנה לזיהוי כתובת ה-IP של מסד הנתונים של Redis שיצרתם ב-Memorystore.
- משתנה לזיהוי מספר היציאה של מסד הנתונים של Redis שיצרתם ב-Memorystore.
מומלץ להגדיר את המשתנים האלה בקובץ app.yaml של האפליקציה במקום להגדיר אותם ישירות בקוד. כך קל יותר להפעיל את האפליקציה בסביבות שונות, כמו סביבה מקומית ו-App Engine.
לדוגמה, מוסיפים את השורות הבאות לקובץ app.yaml:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
ייבוא של redis-py ויצירת הלקוח
אחרי שמגדירים את משתני הסביבה REDISHOST ו-REDISPORT, משתמשים בשורות הבאות כדי לייבא את הספרייה redis-py וליצור לקוח:
import redis
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.Redis(host=redis_host, port=redis_port)
אם השתמשתם בגרסה ישנה יותר של redis-py באפליקציות אחרות, יכול להיות שהשתמשתם במחלקה StrictClient במקום ב-Client. עם זאת, redis-py ממליץ עכשיו על Client במקום על StrictClient.
שימוש בפקודות Redis לאחסון ולאחזור נתונים במטמון
מסד הנתונים של Memorystore Redis תומך ברוב הפקודות של Redis, אבל צריך להשתמש רק בכמה פקודות כדי לאחסן נתונים במטמון ולאחזר אותם. בטבלה הבאה מוצגות הצעות לפקודות Redis שאפשר להשתמש בהן כדי לשמור נתונים במטמון. כדי לראות איך קוראים לפקודות האלה מהאפליקציה, אפשר לעיין בתיעוד של ספריית הלקוח.
שימו לב: בספרייית הלקוח redis-py לא תמיד יש שיטות אסינכרוניות מקבילות, למרות שב-Memcache יש חלופות אסינכרוניות לרבות מהפקודות שלה. אם אתם רוצים שכל האינטראקציות עם המטמון יהיו אסינכרוניות, תוכלו להשתמש בספריות לקוח אחרות של Redis עבור Python.
| משימה | פקודת Redis |
|---|---|
| יצירת רשומה במטמון הנתונים והגדרת זמן תפוגה לרשומה |
SETNX MSETNX |
| אחזור נתונים מהמטמון | GET MGET |
| החלפת ערכי מטמון קיימים | SET MSET |
| הגדלה או הקטנה של ערכי מטמון מספריים | INCR INCRBY DECR DECRBY |
| מחיקת רשומות מהמטמון | DEL UNLINK |
| תמיכה באינטראקציות בו-זמניות עם הזיכרון המטמון (השוואה והגדרה) | פרטים על עסקאות ב-Redis שימו לב שבספריית הלקוח `redis-py` כל העסקאות צריכות להתבצע בצינור. |
בדיקת העדכונים
כשבודקים את האפליקציה באופן מקומי, כדאי להריץ מופע מקומי של Redis כדי להימנע מאינטראקציה עם נתוני ייצור (Memorystore לא מספק אמולטור). כדי להתקין את Redis ולהריץ אותו באופן מקומי, פועלים לפי ההוראות במסמכי התיעוד של Redis. שימו לב: בשלב הזה אי אפשר להריץ את Redis באופן מקומי ב-Windows.
מידע נוסף על בדיקת אפליקציות Python זמין במאמר שימוש בשרת פיתוח מקומי.
פריסת האפליקציה
אחרי שהאפליקציה פועלת בשרת הפיתוח המקומי ללא שגיאות:
אם האפליקציה פועלת ללא שגיאות, משתמשים בפיצול תנועה כדי להגדיל בהדרגה את התנועה לאפליקציה המעודכנת. חשוב לעקוב אחרי האפליקציה כדי לוודא שאין בעיות במסד הנתונים לפני שמפנים אליה עוד תנועה.
המאמרים הבאים
- למדריך מעשי, אפשר לעיין ב-codelab בנושא מעבר מ-App Engine Memcache ל-Memorystore for Redis.
- פרטים נוספים זמינים במאמר בנושא Memorystore for Redis.