gRPC-Python দিয়ে শুরু করা

1. ভূমিকা

এই কোডল্যাবে, আপনি একটি ক্লায়েন্ট এবং সার্ভার তৈরি করতে gRPC-Python ব্যবহার করবেন যা পাইথনে লেখা একটি রুট-ম্যাপিং অ্যাপ্লিকেশনের ভিত্তি তৈরি করে।

টিউটোরিয়ালের শেষে, আপনার কাছে একটি ক্লায়েন্ট থাকবে যেটি একটি মানচিত্রের নির্দিষ্ট স্থানাঙ্কে কী আছে তার নাম বা ডাক ঠিকানা পেতে gRPC ব্যবহার করে একটি দূরবর্তী সার্ভারের সাথে সংযোগ করে। একটি সম্পূর্ণরূপে উন্নত অ্যাপ্লিকেশন এই ক্লায়েন্ট-সার্ভার ডিজাইন ব্যবহার করতে পারে একটি রুট বরাবর আগ্রহের পয়েন্টগুলি গণনা বা সংক্ষিপ্ত করতে।

পরিষেবাটি একটি প্রোটোকল বাফার ফাইলে সংজ্ঞায়িত করা হয়েছে, যা ক্লায়েন্ট এবং সার্ভারের জন্য বয়লারপ্লেট কোড তৈরি করতে ব্যবহার করা হবে যাতে তারা একে অপরের সাথে যোগাযোগ করতে পারে, সেই কার্যকারিতা বাস্তবায়নে আপনার সময় এবং প্রচেষ্টা বাঁচাতে পারে।

এই তৈরি করা কোডটি সার্ভার এবং ক্লায়েন্টের মধ্যে যোগাযোগের জটিলতাই নয়, ডেটা সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনেরও যত্ন নেয়।

আপনি কি শিখবেন

  • একটি পরিষেবা API সংজ্ঞায়িত করতে প্রোটোকল বাফারগুলি কীভাবে ব্যবহার করবেন।
  • স্বয়ংক্রিয় কোড জেনারেশন ব্যবহার করে প্রোটোকল বাফার সংজ্ঞা থেকে কীভাবে একটি জিআরপিসি-ভিত্তিক ক্লায়েন্ট এবং সার্ভার তৈরি করবেন।
  • gRPC এর সাথে ক্লায়েন্ট-সার্ভার যোগাযোগের একটি বোঝাপড়া।

এই কোডল্যাবের লক্ষ্য হল পাইথন ডেভেলপারদের জন্য যারা gRPC-তে নতুন বা gRPC-এর রিফ্রেশার খুঁজছেন, অথবা অন্য কেউ যারা ডিস্ট্রিবিউটেড সিস্টেম তৈরি করতে আগ্রহী। কোন পূর্ব gRPC অভিজ্ঞতা প্রয়োজন নেই.

2. আপনি শুরু করার আগে

আপনি কি প্রয়োজন হবে

  • Python 3.9 বা উচ্চতর। আমরা পাইথন 3.13 সুপারিশ করি। প্ল্যাটফর্ম-নির্দিষ্ট ইনস্টলেশন নির্দেশাবলীর জন্য, পাইথন সেটআপ এবং ব্যবহার দেখুন। বিকল্পভাবে, uv বা pyenv-এর মতো টুল ব্যবহার করে একটি নন-সিস্টেম পাইথন ইনস্টল করুন।
  • পাইথন প্যাকেজ ইনস্টল করতে pip .
  • venv পাইথন ভার্চুয়াল পরিবেশ তৈরি করতে।

ensurepip এবং venv প্যাকেজগুলি পাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ এবং সাধারণত ডিফল্টরূপে উপলব্ধ।

যাইহোক, কিছু ডেবিয়ান-ভিত্তিক ডিস্ট্রিবিউশন (উবুন্টু সহ) পাইথন পুনরায় বিতরণ করার সময় তাদের বাদ দিতে পছন্দ করে। প্যাকেজ ইনস্টল করতে, চালান:

sudo apt install python3-pip python3-venv

কোড পান

আপনার শিক্ষাকে স্ট্রিমলাইন করতে, এই কোডল্যাবটি আপনাকে শুরু করতে সাহায্য করার জন্য একটি পূর্ব-নির্মিত সোর্স কোড স্ক্যাফোল্ড অফার করে। নিম্নলিখিত পদক্ষেপগুলি আপনাকে grpc_tools.protoc প্রোটোকল বাফার কম্পাইলার প্লাগইন ব্যবহার করে gRPC কোড তৈরি সহ অ্যাপ্লিকেশনটি সম্পূর্ণ করার জন্য গাইড করবে।

grpc-codelabs

এই কোডল্যাবের জন্য স্ক্যাফোল্ড সোর্স কোড কোডল্যাব/grpc-python-getting-started/start_here ডিরেক্টরিতে পাওয়া যায়। আপনি যদি নিজে কোডটি প্রয়োগ করতে না চান, তাহলে সম্পূর্ণ সোর্স কোডটি completed ডিরেক্টরিতে পাওয়া যায়।

প্রথমে, কোডল্যাব ওয়ার্কিং ডিরেক্টরি তৈরি করুন এবং এটিতে সিডি করুন:

mkdir grpc-python-getting-started && cd grpc-python-getting-started

কোডল্যাব ডাউনলোড এবং এক্সট্রাক্ট করুন:

curl -sL https://github.com/grpc-ecosystem/grpc-codelabs/archive/refs/heads/v1.tar.gz \
  | tar xvz --strip-components=4 \
  grpc-codelabs-1/codelabs/grpc-python-getting-started/start_here

বিকল্পভাবে, আপনি শুধুমাত্র কোডল্যাব ডিরেক্টরি ধারণকারী .zip ফাইলটি ডাউনলোড করতে পারেন এবং ম্যানুয়ালি আনজিপ করতে পারেন।

3. পরিষেবাটি সংজ্ঞায়িত করুন

আপনার প্রথম ধাপ হল প্রোটোকল বাফার ইন্টারফেস সংজ্ঞা ভাষা ব্যবহার করে অ্যাপ্লিকেশনটির gRPC পরিষেবা, এর RPC পদ্ধতি এবং এর অনুরোধ এবং প্রতিক্রিয়া বার্তার ধরনগুলিকে সংজ্ঞায়িত করা৷ আপনার পরিষেবা প্রদান করবে:

  • GetFeature নামে একটি RPC পদ্ধতি যা সার্ভার প্রয়োগ করে এবং ক্লায়েন্ট কল করে।
  • বার্তার ধরন Point এবং Feature হল ডেটা স্ট্রাকচার যা ক্লায়েন্ট এবং সার্ভারের মধ্যে বিনিময় করা হয় যখন GetFeature পদ্ধতি ব্যবহার করে। ক্লায়েন্ট সার্ভারে তার GetFeature অনুরোধে একটি Point হিসাবে মানচিত্র স্থানাঙ্ক সরবরাহ করে এবং সার্ভার একটি সংশ্লিষ্ট Feature সাথে উত্তর দেয় যা সেই স্থানাঙ্কগুলিতে যা আছে তা বর্ণনা করে।

এই RPC পদ্ধতি এবং এর মেসেজের ধরন সবই প্রদত্ত সোর্স কোডের protos/route_guide.proto ফাইলে সংজ্ঞায়িত করা হবে।

প্রোটোকল বাফারগুলি সাধারণত প্রোটোবাফ নামে পরিচিত। gRPC পরিভাষা সম্পর্কে আরও তথ্যের জন্য, gRPC-এর মূল ধারণা, স্থাপত্য, এবং জীবনচক্র দেখুন।

বার্তার ধরন

সোর্স কোডের protos/route_guide.proto ফাইলে, প্রথমে Point বার্তার ধরনটি সংজ্ঞায়িত করুন। একটি Point একটি মানচিত্রে একটি অক্ষাংশ-দ্রাঘিমাংশ স্থানাঙ্ক জুটিকে প্রতিনিধিত্ব করে। এই কোডল্যাবের জন্য, স্থানাঙ্কের জন্য পূর্ণসংখ্যা ব্যবহার করুন:

message Point {
  int32 latitude = 1;
  int32 longitude = 2;
}

1 এবং 2 নম্বরগুলি message কাঠামোর প্রতিটি ক্ষেত্রের জন্য অনন্য আইডি নম্বর।

এর পরে, Feature বার্তার ধরন সংজ্ঞায়িত করুন। একটি Feature একটি Point দ্বারা নির্দিষ্ট একটি অবস্থানে কোনো কিছুর নাম বা ডাক ঠিকানার জন্য একটি string ক্ষেত্র ব্যবহার করে:

message Feature {
  // The name or address of the feature.
  string name = 1;

  // The point where the feature is located.
  Point location = 2;
}

পরিষেবা পদ্ধতি

route_guide.proto ফাইলটিতে RouteGuide নামে একটি service কাঠামো রয়েছে যা অ্যাপ্লিকেশনটির পরিষেবা দ্বারা প্রদত্ত এক বা একাধিক পদ্ধতিকে সংজ্ঞায়িত করে৷

RouteGuide সংজ্ঞার ভিতরে rpc পদ্ধতি GetFeature যোগ করুন। যেমনটি আগে ব্যাখ্যা করা হয়েছে, এই পদ্ধতিটি স্থানাঙ্কের একটি নির্দিষ্ট সেট থেকে একটি অবস্থানের নাম বা ঠিকানা সন্ধান করবে, তাই GetFeature একটি নির্দিষ্ট Point জন্য একটি Feature ফিরিয়ে দিতে হবে:

service RouteGuide {
  // Definition of the service goes here

  // Obtains the feature at a given position.
  rpc GetFeature(Point) returns (Feature) {}
}

এটি একটি unary RPC পদ্ধতি: একটি সাধারণ RPC যেখানে ক্লায়েন্ট সার্ভারে একটি অনুরোধ পাঠায় এবং একটি স্থানীয় ফাংশন কলের মতোই একটি প্রতিক্রিয়া ফিরে আসার জন্য অপেক্ষা করে।

4. ক্লায়েন্ট এবং সার্ভার কোড তৈরি করুন

এরপর, প্রোটোকল বাফার কম্পাইলার ব্যবহার করে .proto ফাইল থেকে ক্লায়েন্ট এবং সার্ভার উভয়ের জন্য বয়লারপ্লেট gRPC কোড তৈরি করুন।

gRPC পাইথন কোড জেনারেশনের জন্য, আমরা grpcio-টুল তৈরি করেছি। এটি অন্তর্ভুক্ত:

  1. নিয়মিত প্রোটোক কম্পাইলার যা message সংজ্ঞা থেকে পাইথন কোড তৈরি করে।
  2. gRPC প্রোটোবাফ প্লাগইন যা service সংজ্ঞা থেকে পাইথন কোড (ক্লায়েন্ট এবং সার্ভার স্টাব) তৈরি করে।

আমরা পিপ ব্যবহার করে grpcio-tools Python প্যাকেজ ইনস্টল করব। সিস্টেম প্যাকেজ থেকে আপনার প্রকল্পের নির্ভরতা বিচ্ছিন্ন করতে একটি নতুন পাইথন ভার্চুয়াল পরিবেশ (ভেনভি) তৈরি করা যাক:

python3 -m venv --upgrade-deps .venv

bash/zsh শেলে ভার্চুয়াল পরিবেশ সক্রিয় করতে:

source .venv/bin/activate

উইন্ডোজ এবং অ-মানক শেলগুলির জন্য, https://docs.python.org/3/library/venv.html#how-venvs-work- এ টেবিলটি দেখুন।

এরপরে, grpcio-tools ইনস্টল করুন (এটি grpcio প্যাকেজও ইনস্টল করে):

pip install grpcio-tools

পাইথন বয়লারপ্লেট কোড তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

python -m grpc_tools.protoc --proto_path=./protos  \
 --python_out=. --pyi_out=. --grpc_python_out=. \
 ./protos/route_guide.proto

আমরা route_guide.proto এ সংজ্ঞায়িত ইন্টারফেসের জন্য এটি নিম্নলিখিত ফাইলগুলি তৈরি করবে:

  1. route_guide_pb2.py এমন কোড রয়েছে যা গতিশীলভাবে message সংজ্ঞা থেকে উৎপন্ন ক্লাস তৈরি করে
  2. route_guide_pb2.pyi হল একটি "স্টাব ফাইল" বা "টাইপ ইঙ্গিত ফাইল" message সংজ্ঞা থেকে তৈরি। এটিতে শুধুমাত্র কোন বাস্তবায়ন ছাড়া স্বাক্ষর রয়েছে। ভাল স্বয়ংসম্পূর্ণতা এবং ত্রুটি সনাক্তকরণ প্রদান করতে স্টাব ফাইলগুলি IDE দ্বারা ব্যবহার করা যেতে পারে।
  3. route_guide_pb2_grpc.py service সংজ্ঞা থেকে তৈরি করা হয়েছে এবং এতে gRPC-নির্দিষ্ট ক্লাস এবং ফাংশন রয়েছে।

gRPC-নির্দিষ্ট কোডে রয়েছে:

  1. RouteGuideStub , যা একটি gRPC ক্লায়েন্ট দ্বারা RouteGuide RPC গুলি ব্যবহার করতে পারে৷
  2. RouteGuideServicer , যা RouteGuide পরিষেবার বাস্তবায়নের জন্য ইন্টারফেস সংজ্ঞায়িত করে।
  3. add_RouteGuideServicer_to_server ফাংশন যা একটি GRPC সার্ভারে একটি RouteGuideServicer নিবন্ধন করতে ব্যবহৃত হয়।

5. পরিষেবা তৈরি করুন

প্রথমে দেখা যাক কিভাবে আপনি একটি RouteGuide সার্ভার তৈরি করেন। একটি RouteGuide সার্ভার তৈরি এবং চালানো দুটি কাজের আইটেমে বিভক্ত:

  • পরিষেবার প্রকৃত "কাজ" সম্পাদন করে এমন ফাংশনগুলির সাথে আমাদের পরিষেবার সংজ্ঞা থেকে উত্পন্ন সার্ভিসার ইন্টারফেস বাস্তবায়ন করা।
  • ক্লায়েন্টদের কাছ থেকে অনুরোধ শোনার জন্য এবং প্রতিক্রিয়া প্রেরণ করার জন্য একটি নির্দিষ্ট পোর্টে একটি gRPC সার্ভার চালানো।

আপনি start_here/route_guide_server.py এ প্রাথমিক RouteGuide সার্ভারটি খুঁজে পেতে পারেন।

RouteGuide বাস্তবায়ন করুন

route_guide_server.py একটি RouteGuideServicer ক্লাস রয়েছে যা জেনারেট করা ক্লাস route_guide_pb2_grpc.RouteGuideServicer সাবক্লাস করে :

# RouteGuideServicer provides an implementation
# of the methods of the RouteGuide service.
class RouteGuideServicer(route_guide_pb2_grpc.RouteGuideServicer):

RouteGuideServicer সমস্ত RouteGuide পরিষেবা পদ্ধতি প্রয়োগ করে।

আসুন বিস্তারিতভাবে একটি সহজ RPC বাস্তবায়নের দিকে তাকাই। মেথড GetFeature ক্লায়েন্টের কাছ থেকে একটি Point পায় এবং Feature এর ডাটাবেস থেকে সংশ্লিষ্ট বৈশিষ্ট্যের তথ্য ফেরত দেয়।

def GetFeature(self, request, context):
    feature = get_feature(self.db, request)
    if feature is None:
        return route_guide_pb2.Feature(name="", location=request)
    else:
        return feature

পদ্ধতিটি RPC-এর জন্য একটি route_guide_pb2.Point অনুরোধ, এবং একটি grpc.ServicerContext অবজেক্ট যা RPC-নির্দিষ্ট তথ্য প্রদান করে যেমন সময়সীমা সীমা। এটি একটি route_guide_pb2.Feature প্রতিক্রিয়া প্রদান করে।

সার্ভার শুরু হচ্ছে

একবার আপনি সমস্ত RouteGuide পদ্ধতি প্রয়োগ করলে, পরবর্তী ধাপ হল একটি gRPC সার্ভার শুরু করা যাতে ক্লায়েন্টরা আসলে আপনার পরিষেবা ব্যবহার করতে পারে:

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    route_guide_pb2_grpc.add_RouteGuideServicer_to_server(
        RouteGuideServicer(),
        server,
    )
    listen_addr = "localhost:50051"
    server.add_insecure_port(listen_addr)
    print(f"Starting server on {listen_addr}")
    server.start()
    server.wait_for_termination()

সার্ভার start() পদ্ধতিটি অ-ব্লকিং। অনুরোধগুলি পরিচালনা করার জন্য একটি নতুন থ্রেড ইনস্ট্যান্ট করা হবে। থ্রেড কলিং server.start() এর মধ্যে প্রায়ই অন্য কোন কাজ থাকে না। এই ক্ষেত্রে, সার্ভার বন্ধ না হওয়া পর্যন্ত কলিং থ্রেডটি পরিষ্কারভাবে ব্লক করতে আপনি server.wait_for_termination() কল করতে পারেন।

6. ক্লায়েন্ট তৈরি করুন

এই বিভাগে, আমরা আমাদের RouteGuide পরিষেবার জন্য একটি ক্লায়েন্ট তৈরি করার বিষয়ে দেখব। আপনি start_here/route_guide_client.py এ প্রাথমিক ক্লায়েন্ট কোড দেখতে পারেন।

একটি স্টাব তৈরি করুন

পরিষেবা পদ্ধতি কল করার জন্য, আমাদের প্রথমে একটি স্টাব তৈরি করতে হবে।

আমরা route_guide_pb2_grpc মডিউলের RouteGuideStub ক্লাসটি ইনস্ট্যান্টিয়েট করি, আমাদের route_guide_client.py ফাইলের ভিতরের .proto থেকে তৈরি।

channel = grpc.insecure_channel("localhost:50051")
stub = route_guide_pb2_grpc.RouteGuideStub(channel)

কলিং পরিষেবা পদ্ধতি

RPC পদ্ধতিগুলির জন্য যা একটি একক প্রতিক্রিয়া প্রদান করে- যা প্রতিক্রিয়া-ইউনারি পদ্ধতি নামে পরিচিত- জিআরপিসি পাইথন সিঙ্ক্রোনাস (ব্লকিং) এবং অ্যাসিঙ্ক্রোনাস (নন-ব্লকিং) নিয়ন্ত্রণ প্রবাহ শব্দার্থ উভয়কেই সমর্থন করে।

সরল আরপিসি

প্রথমে, পরিষেবাটি কল করার জন্য একটি Point সংজ্ঞায়িত করা যাক। এটি কিছু বৈশিষ্ট্য সহ route_guide_pb2 প্যাকেজ থেকে একটি বস্তুকে ইনস্ট্যান্ট করার মতো সহজ হওয়া উচিত:

point = route_guide_pb2.Point(latitude=412346009, longitude=-744026814)

সাধারণ RPC GetFeature এ একটি সিঙ্ক্রোনাস কল স্থানীয় পদ্ধতিতে কল করার মতোই সহজ। RPC কলটি সার্ভারের সাড়া দেওয়ার জন্য অপেক্ষা করে, এবং হয় একটি প্রতিক্রিয়া প্রদান করবে বা একটি ব্যতিক্রম উত্থাপন করবে। আমরা পদ্ধতিটি কল করতে পারি এবং প্রতিক্রিয়াটি দেখতে পারি:

feature = stub.GetFeature(point)
print(feature)

আপনি বৈশিষ্ট্য বস্তুর ক্ষেত্রগুলি পরিদর্শন করতে পারেন এবং অনুরোধের ফলাফল আউটপুট করতে পারেন:

if feature.name:
    print(f"Feature called '{feature.name}' at {format_point(feature.location)}")
else:
    print(f"Found no feature at at {format_point(feature.location)}")

7. এটা চেষ্টা করে দেখুন

সার্ভার চালান:

python route_guide_server.py

একটি ভিন্ন টার্মিনাল থেকে, আবার ভার্চুয়াল পরিবেশ সক্রিয় করুন, তারপর ক্লায়েন্ট চালান:

python route_guide_client.py

স্পষ্টতার জন্য টাইমস্ট্যাম্প বাদ দিয়ে আপনি এইরকম আউটপুট দেখতে পাবেন:

name: "16 Old Brook Lane, Warwick, NY 10990, USA"
location {
  latitude: 412346009
  longitude: -744026814
}

Feature called '16 Old Brook Lane, Warwick, NY 10990, USA' at latitude: 412346009, longitude: -744026814

8. পরবর্তী কি