הגדרת ארכיטקטורת השירות

ארכיטקטורת שירות מתייחסת לאופן שבו השירותים מורכבים ולאופן שבו הם מתקשרים עם רכיבים אחרים במערכת.

יצירת חבילות שירות

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

חבילות שירות מוגדרות באמצעות קבצים של שפת הגדרת ממשקי שירותים לרכב (VSIDL) (קבצים עם הסיומת .vsidl).

בדוגמה הבאה מוצגים שני חבילות שירותים: חבילת שירותים של TirePressureMonitoring וחבילת שירותים של BodyControl:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"
}

service_bundle {
  name: "BodyControl"
}

כאשר:

  • service_bundle הוא המזהה של המבנה כחבילת שירותים.
  • name הוא שם חבילת השירות.

דפוסי העברת הודעות: Pub/Sub ו-RPC

מסגרת ה-SDV משתמשת בשני דפוסי העברת הודעות עיקריים: פרסום-הרשמה (Pub/Sub) וקריאה לפרוצדורה מרוחקת (RPC).

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

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

הדפוסים האלה מיועדים לצרכים תפעוליים שונים, אבל יש להם מאפיין מבני משותף: שניהם מסתמכים על נתיבי תקשורת עם שמות – נושאים ב-Pub/Sub וערוצים ב-RPC – כדי להפריד בין הזהות של השולח לבין הזהות של המקבל.

הצהרה על אפליקציה לשליחת הודעות ואפליקציה רשומה

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

הוספת מוציא לאור לחבילת שירותים

בדוגמה הבאה מוצג מפרסם שנוסף לחבילת השירות TirePressureMonitoring:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    capacity: 10
  }

}

service_bundle {
  name: "BodyControl"

  ...
}

כאשר:

  • הודעות שירות publisher מפרסמות הודעות בתור הודעות.
  • message מבנה הנתונים או סוג ההודעה שמוגדרים ב-protobuf (קובץ עם הסיומת .protobuf).
  • topic מזהה ייחודי של נושא הפרסום. הוא חייב להיות באותיות קטנות עם מקפים.
  • capacity מספר ההודעות שאפשר להכניס לתור של הפרסום. הערך חייב להיות מספר זוגי שגדול מ-2 או שווה לו.

הוספת חבילת מינוי לשירות

בדוגמה הבאה מוצג תוכן שנוסף לחבילת הערוצים של שירות BodyControl:

package: "com.android.sdv.sample.vsidl"

service_bundle {
  name: "TirePressureMonitoring"

  publisher {
    message: "TirePressure"
    topic: "front-left"
    capacity: 10
  }
}

service_bundle {
  name: "BodyControl"

  subscriber {
    message: "com.android.sdv.sample.vsidl.TirePressure"
    topic: "front-left"
  }
}

כאשר:

  • חבילת השירותים נרשמת לנושאים.subscriber
  • message מבנה הנתונים או סוג ההודעה שמוגדרים ב-protobuf (קובץ עם הסיומת .protobuf).
  • topic מזהה ייחודי של נושא הפרסום. היא צריכה להתאים לנושא של בעל התוכן הדיגיטלי ולהיות באותיות קטנות עם מקפים.

הגדרת לקוחות ושרתים של RPC

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

בדוגמה הבאה, חבילת השירות ClimateControl מוגדרת כשרת וחבילת השירות BodyControl מוגדרת כלקוח:

package: "com.sdv.cc"

service_bundle {
  name: "ClimateControl"

  server {
    service: "SetTemperature"
    channel: "climate-control"
  }
}

service_bundle {
  name: "BodyControl"

  client {
    service: "SetTemperature"
    channel: "climate-control"
  }
}

כאשר:

  • server מציין שחבילת השירות היא שרת שמספק שירות RPC מסוים (מזוהה על ידי service כ-SetTemperature).
  • client מציין שחבילת השירות היא לקוח שמפעיל את השירות SetTemperature.
  • channel הוא השם של ערוץ ה-RPC. הוא צריך להיות באותיות קטנות עם מקפים, וייחודי לכל שירות.

בדוגמה הזו, חבילת השירותים BodyControl מקבלת הרשאה לבצע קריאות לפרוצדורות מרוחקות בחבילת השירותים ClimateControl כדי להגדיר את הטמפרטורה.

המאמרים הבאים

אחרי שמגדירים את הארכיטקטורה, יוצרים קוד של תוכנת ביניים.