সার্ভিস আর্কিটেকচারের সংজ্ঞা দাও

সার্ভিস আর্কিটেকচার বলতে বোঝায় সার্ভিসগুলো কীভাবে গঠিত হয় এবং সিস্টেমের অন্যান্য উপাদানের সাথে কীভাবে যোগাযোগ করে।

পরিষেবা বান্ডেল তৈরি করুন

সার্ভিস বান্ডেল হলো সম্পর্কিত সার্ভিস ইউনিটগুলোর একটি সমষ্টি, যেগুলোকে একসাথে ডেপ্লয় করা যায়। একটি সার্ভিস বান্ডেলের জন্য একমাত্র প্রয়োজনীয় প্রপার্টি হলো একটি নাম। প্যাকেজ নামের সাথে এই নামটি মিলে সার্ভিস বান্ডেলটির পূর্ণাঙ্গ নাম গঠন করে।

সার্ভিস বান্ডেলগুলো ভেহিকেল সার্ভিসেস ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (VSIDL) ফাইল ( .vsidl এক্সটেনশনযুক্ত ফাইল) দ্বারা সংজ্ঞায়িত করা হয়।

নিম্নলিখিত উদাহরণে দুটি সার্ভিস বান্ডেল দেখানো হয়েছে: একটি TirePressureMonitoring সার্ভিস বান্ডেল এবং একটি BodyControl সার্ভিস বান্ডেল:

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

service_bundle {
  name: "TirePressureMonitoring"
}

service_bundle {
  name: "BodyControl"
}

কোথায়:

  • service_bundle কাঠামোটিকে একটি পরিষেবা বান্ডেল হিসাবে চিহ্নিত করে।
  • name হলো সার্ভিস বান্ডেলের নাম।

মেসেজিং প্যাটার্ন: পাব/সাব এবং আরপিসি

এসডিভি ফ্রেমওয়ার্ক দুটি প্রধান মেসেজিং প্যাটার্ন ব্যবহার করে: পাবলিশ-সাবস্ক্রাইব (পাব/সাব) এবং রিমোট প্রসিডিউর কল (আরপিসি)।

পাব/সাব সিস্টেমে, যানবাহনের পরিবর্তনশীল অবস্থার প্রতিক্রিয়ায় আগ্রহী কম্পোনেন্টগুলোতে ডেটা স্ট্রিম করা হয়। ডেটা বিভিন্ন টপিকে সাজানো থাকে। পাবলিশাররা টপিকের উপর মেসেজ পাঠায়। কোন (বা কতজন) সাবস্ক্রাইবার শুনছে তা না জেনেই পাবলিশার টপিকের উপর মেসেজ পাঠায়। সাবস্ক্রাইবাররা ঠিক কোন পাবলিশার মেসেজগুলো পাঠিয়েছে তা না জেনেই টপিকের উপর মেসেজ গ্রহণ করে।

এর বিপরীতে, 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 এক্সটেনশনযুক্ত ফাইলে) সংজ্ঞায়িত ডেটা কাঠামো বা মেসেজের প্রকার।
  • প্রকাশনার বিষয়ের জন্য topic শনাক্তকারী। এটি অবশ্যই ছোট হাতের অক্ষরে (ড্যাশ-কেস) হতে হবে।
  • capacity হলো পাবলিকেশন কিউ-এর ধারণক্ষম বার্তার সংখ্যা। এটি অবশ্যই ২ বা তার বেশি একটি জোড় সংখ্যা হতে হবে।

একটি পরিষেবা বান্ডেলে সাবস্ক্রাইব করুন

নিম্নলিখিত উদাহরণগুলি 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 এক্সটেনশনযুক্ত ফাইলে) সংজ্ঞায়িত ডেটা কাঠামো বা মেসেজের প্রকার।
  • প্রকাশনার বিষয়ের জন্য topic শনাক্তকারী। এটি অবশ্যই প্রকাশকের বিষয়ের সাথে মিলতে হবে এবং ছোট হাতের ড্যাশ-কেস অক্ষরে হতে হবে।

RPC ক্লায়েন্ট এবং সার্ভার সংজ্ঞায়িত করুন

রিমোট প্রসিডিউর কল (RPC) ফাংশন কলের অবস্থানগত স্বাধীনতা প্রদান করে। এই পদ্ধতিতে, চ্যানেলটি একটি নামযুক্ত মিলনস্থল হিসেবে কাজ করে, যেখানে ক্লায়েন্ট এবং প্রোভাইডার মিলিত হয়। কোনো নির্দিষ্ট সার্ভিস ইনস্ট্যান্সের পরিবর্তে চ্যানেলকে টার্গেট করার মাধ্যমে, ফ্রেমওয়ার্কটি কমান্ডের উদ্দেশ্যকে তার বাস্তবায়নের ভৌতিক অবস্থান থেকে বিচ্ছিন্ন করে।

নিম্নলিখিত উদাহরণটিতে CabinComfort সার্ভিস বান্ডেলটি একটি ClimateControl সার্ভার হোস্ট করছে এবং BodyControl সার্ভিস বান্ডেলটিকে একটি ClimateControl ক্লায়েন্ট হোস্ট করার জন্য সম্প্রসারিত করা হয়েছে:

package: "com.sdv.cc"

service_bundle {
  name: "CabinComfort"

  server {
    service: "ClimateControl"
    channel: "front-climate-control"
  }
}

service_bundle {
  name: "BodyControl"

  client {
    service: "ClimateControl"
    channel: "front-climate-control"
  }

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

কোথায়:

  • server নির্দেশ করে যে সার্ভিস বান্ডেলটিতে একটি সার্ভার রয়েছে যা কোনো RPC সার্ভিস প্রদান করে ( service দ্বারা ClimateControl হিসেবে চিহ্নিত)।
  • client নির্দেশ করে যে সার্ভিস বান্ডেলটিতে এমন একটি ক্লায়েন্ট রয়েছে যা ClimateControl সার্ভিসটিকে আহ্বান করে।
  • channel হলো RPC চ্যানেলের নাম। এটি অবশ্যই ছোট হাতের অক্ষরে এবং প্রতিটি সার্ভিসের জন্য স্বতন্ত্র হতে হবে।

এই উদাহরণটি BodyControl সার্ভিস বান্ডেলকে কেবিনের সামনের অংশের জলবায়ু নিয়ন্ত্রণ করার জন্য CabinComfort সার্ভিস বান্ডেলে রিমোট প্রসিডিউর কল করার অনুমতি দেয়।

এরপর কী?

আপনার আর্কিটেকচার নির্ধারণ করার পর, মিডলওয়্যার কোড তৈরি করুন