DEV Community

Monirul Islam
Monirul Islam

Posted on Originally published at mislam-dev.vercel.app

Day 5 | gRPC and Protocol Buffers - A game changer

আপনার tour শেষ হয়ে গেছে এবং আপনি এখন বাড়িতে আছেন। আপনি বিকালে বসে বসে একটা জিনিস ভাবতে লাগলেন যে, অনেক কিছুই তো করলাম, এর মধ্যে এই এই কাজগুলো না করলেও হতো। আমার খরচটা একটু কমে যেত। যেমন ধরুন, flight-এর ticket না কেটে bus-এ করে গেলেই হতো, খরচ কমে যেত। আবার বড় কোনো 5 star hotel-এ না উঠে, ছোটখাটো normal একটা hotel-এ উঠলেই হতো, খরচ অনেক কমে যেত।
এখানে একটা জিনিস বুঝতে পারবেন, খরচ কমানোর চক্কর করতে গেলে সেখানে কিছু problem-এর সম্মুখীন হতে হবে। যেমন ধরুন, আপনার মালামাল management করা নিয়ে problem face করতে হতে পারে। এছাড়া আরও অনেক problem-এর সম্মুখীন হতে হবে।

কিছু কি relate করতে পারছেন? একটু কষ্ট হচ্ছে। আসুন অন্য একটা বিষয় নিয়ে কথা বলি।

আপনি যখন backend নিয়ে কাজ করছেন তখন microservice নিয়ে আপনার মোটামুটি idea হয়ে যাওয়ার কথা। সহজভাবে বললে একটা single application-কে ছোট ছোট part-এ ভেঙে আলাদাভাবে management করাই হচ্ছে microservice। এটা নিয়ে future-এ একটা dedicated article আসবে। তখন আরও ভালোভাবে জানতে পারবেন।
এখন একটা বিষয় বুঝেন, আপনি যখন কোনো application develop করবেন তখন কিন্তু আপনার অন্য module-এর সাথে communication করার প্রয়োজন হবে। Monolith application-এর ক্ষেত্রে সব এক জায়গায় থাকে সেই জন্য কোনো problem হয় না। কিন্তু যখন microservice-এ যেয়ে communication করা হয় তখন REST API use করার প্রয়োজন পড়ে। কিন্তু problem হচ্ছে, REST API-এর ক্ষেত্রে text based json format serialize, deserialize করার জন্য extra time + bandwidth নষ্ট হয়। text based json serialize, deserialize করা হয় ডাটাকে human readable format-এ নিয়ে use করার জন্য।

Microservice-এ internal communication সবই তো server বা machine। সেক্ষেত্রে এই text based json serialize, deserialize করার কোনো প্রয়োজন নেই। এই overhead-টা কমাতে পারলেই আপনার internal communication-এর speed অনেক বেড়ে যাবে।
একটা জিনিস চিন্তা করুন আপনার একটা data-এর জন্য user-কে যদি ২ sec wait করা লাগে, তাহলে user কি আপনার application use করবে? আপনি কি use করবেন? ক্ষেত্রবিশেষে load বেশি হলে এই waiting-এর time আরও বেশি হতে পারে।

এটার solution হচ্ছে gRPC।


What is gRPC?

gRPC-তে যাওয়ার আগে, RPC সম্পর্কে বিস্তারিত জানাটা প্রয়োজন।
RPC-এর full form হচ্ছে Remote Procedure Call। এটার concept হচ্ছে একদম simple। Server-এ কয়েকটা specific function থাকে। এই function-গুলো client directly call করে কাজ করবে। এটাই হচ্ছে Remote Procedure Call।

এই concept-এর ওপর base করেই Google একটা RPC model develop করে। At first, gRPC Google তাদের internal project-এর জন্য use করে। Then ২০১৫ সালে open source করে দেয়। তবে concept-টা RPC-এর তবে অনেক efficient।

gRPC-এর communication-এর জন্য Protocol Buffer (Protobuf, developed by Google themselves) use করে। যেটা অনেক efficient কারণ এখানে binary data communication হয়।

RPC-এর ক্ষেত্রে একটা problem হচ্ছে এটা language specific। এছাড়াও এখানে method name mismatching-এর একটা প্রবল সম্ভাবনা থাকে। এই জন্য এটা একটু risky। কিন্তু gRPC language agnostic। gRPC-তে .proto file use করা হয়, যেটা মূলত একটা contract হিসেবে কাজ করে। এই contract থাকার কারণে আমি চাইলেই method mismatch হবে না। Compile time-এই error show করবে। এই ক্ষেত্রে runtime-এ অনেক error থেকে save করবে।


Protocol Buffers: Magic of binary data

Protocol Buffers হলো একটা data serializer। অন্যান্য data serializer (JSON, XML) text based formatting করে, কিন্তু protocol buffer binary format use করে data format করে। এর জন্য data size অনেক কম, speed অনেক high। তবে এর একটা downside হচ্ছে, এটা human readable না। Read করতে হলে কিছু tool use করতে হবে। যদিও এটাকে downside বলাটা ঠিক হবে না।
এখন একটা বিষয় চিন্তা করুন, আপনি যখন machine to machine communication করবেন তখন এই human readable serialization-এর দরকার আছে? অবশ্যই না।

gRPC-তে .proto file use করা হয়। নিচের একটা example দেখলে কিছুটা idea করতে পারবেন।

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

service UserService {
  rpc GetUser(UserRequest) returns (User);
}
Enter fullscreen mode Exit fullscreen mode

এখন আপনার মাথায় একটা জিনিস আসবে, একটু আগে বললাম যে gRPC language agnostic। তাহলে নানা ধরনের language কীভাবে use হয়?

আসলে language-এ use করার জন্য, gRPC-তে by default code generator আছে, এই generator দিয়ে easily যেকোনো language-এর জন্য code generate করে use করা যায়।

এই Protocol Buffer একটু খেয়াল করলে দেখতে পারবেন যে ২ ধরনের code আছে। একটাতে schema আর আরেকটা অনেকটা class-এর মতো। মূলত এই schema-টা হচ্ছে data format বা type। আর service যে section-টা সেটার ভেতরে যেগুলো আছে ঐগুলো সবগুলাই method।

এই .proto file use করার কারণে, আপনার system-এ end-to-end type security ensure হচ্ছে। একবার schema লিখবেন সব language-এই কাজ করবে।


HTTP/2: The Underlying Technology

gRPC behind the scene-এ HTTP/2 protocol use করে। এটা HTTP/1.1-এর modern version যেটা ২০১৫ সালে standardize হয়। এই HTTP/2 use করার কারণেই মূলত gRPC তুলনামূলক অনেক fast। HTTP/2-এর কিছু feature সম্পর্কে জানলেই এটা বুঝে যাবেন।

HTTP/2-এর কিছু ফিচার:

  • Bidirectional streaming - client আর server দুইজনই একসাথে data পাঠাতে পারে।
  • Multiplexing - একটা connection-এই অনেক call।
  • Header compression - repeated headers compress হয়।

REST vs gRPC

এতক্ষণে কিছুটা idea পেয়ে গেছেন কখন gRPC আর কখন REST use করতে হবে।

gRPC use করুন যখন -

  • Internal microservice-to-microservice communication
  • High performance, low latency দরকার
  • Streaming data দরকার (real-time)
  • Strong contract/schema enforce করতে চান

REST use করুন যখন -

  • Public-facing API
  • Browser directly consume করবে
  • Simple integration, documentation সহজ রাখতে চান

gRPC browser থেকে directly call করা যায় না সহজে - gRPC-Web proxy লাগে। তাই public API-তে gRPC একটু ঝামেলার।

কিন্তু backend-to-backend? এখানে REST-এর সাথে gRPC-র কোনো তুলনাই হয় না।


বটম লাইন

আগের article-এ একটা কথা বলেছিলাম যে, option future-এ অনেক আসবে কিন্তু আমার যেটা দরকার, যেটা আমার requirement full করে সেটা choose করতে হবে। তাহলে একটা ভালো application বানানো possible।

এখানে আমি শুধুমাত্র gRPC সম্পর্কে একটু idea দিলাম। আপনি চাইলে নিচের document থেকে বিস্তারিত পড়তে পারেন।

Read more on gRPC

আপনি কি কখনো gRPC ব্যবহার করেছেন? Experience কেমন ছিল? কমেন্টে শেয়ার করুন! 👇

Top comments (0)