Programming

various programming related post

28Aug

মাইক্রোসার্ভিস কেন ? কখন ? কিভাবে ? | পর্ব ২

মাইক্রোসার্ভিস আর্কিটেকচার, শুনে অনেক ভাল লাগলেও আগে জানতে হবে কখন কেন এবং কোথায় এটার ব্যবহার  ।  না  বুঝে এই আর্কিটেকচার  গ্রহণ করলে লাভের থেকে ক্ষতি হবে বেশি । শুধু মানুষের কাছ থেকে শুনে , অনেকে করছে বলে আমাদের কেও করতে হবে ব্যাপারটা এরকম করা যাবে না । অনেক প্রোজেক্ট আছে যেসব মনলিথ থাকলেই ভাল মাইক্রোতে যাবার দরকার পরে না , গেলে অনেক কাজ করতে হয় যেটা ওই প্রোজেক্টের জন্য অনেক OverKill । তাই আগে জানা উচিত কেন অমি এই আর্কিটেকচার অবলম্বন করব ও কখন ?

প্রথমে, প্রয়জনিতা বুজুন 

আগে চিন্তা করেনিন যে আপনি যে প্রোজেক্টটা বানাবেন অথবা আপনার এখন যে প্রোজেক্ট আছে যার জন্য মাইক্রোসার্ভিসের কথা ভাবছেন সেটা এই আর্কিটেকচার অবলম্বনে কতটা সুফল আসতে পারে , আমার কি পরে কোন সুবিধা হবে ? আর আমার বিদ্যমান টিম কি নতুন এই আর্কিটেকচারের সাথে খাপ খাওয়াতে পারবে ?

তবে নীচের দিক গুলো যদি কোন প্রোজেক্ট এ থাকে তাহলে মাইক্রোসার্ভিস ব্যবহার করলে প্রবর্তিতে অনেক সুবিধা পাওয়া জেতে পারে ! যেমন,

  • অ্যাপ্লিকেশানের গ্রাহক অনেক বেশি যারা কিনা প্রতিদিন অ্যাপটা ব্যবহার করে ।
  • অ্যাপ যদি কোন সামাজিক যোগাযোগের ওয়েবসাইট মত হয় ।
  • যদি অ্যাপটি বিগ ডাটার সাথে সম্পর্ক থাকে আর গবেষণার এক পর্যায়ে ডাটা বাড়লে আপনাকে অতিতিক্ত CPU & RAM সংযোগ করতে হতে পারে।
  • যদি অ্যাপটির ডেভ্লপমেন্ত আর রিলিস চক্রে যদি Agile Development Stategy  মানা হয়, সোজা ভাষায় বললে, যদি আপনি চান যে, আপনার প্রোজেক্টের ছোট ছোট পরিবর্তনও দ্রুত আপনার গ্রাহকদের কাছে পৌঁছাক এবং তাঁদের চাহিদা মোতাবেক আপনি আপনার সার্ভিস ও সারভারের ক্ষমতা বাড়াতে কমাতে চান ।
  •  আরও অনেক  ……

আগে মনলিথ তারপর মাইক্রো

একটা প্রোজেক্টের শুরু থেকেই মাইক্রোসার্ভিস আর্কিটেকচার অবলম্বন করার কথা চিন্তা করা ঠিক না । তবে টিমে দক্ষ মেম্বার থাকলে করা যেতে পারে, মাইক্রোসার্ভিস অবলম্বনের কি কি জটিলতার আসতে পারে তা সঠিক না জেনে মাইক্রোসার্ভিসে যাওয়ার জন্য আমি নিজেই পরামর্শ দিব না !

যদিও প্রোজেক্টের শুরুতে এটা বলা খুব কঠিন যে কি কি সার্ভিস লাগতে পারে, কিন্তু যদি প্রোজেক্টে একের পরে এক প্ররিবরতন আসে তাহলে যেগুলো পরিবর্তন হচ্ছে না সেগুলো এক একটা সার্ভিসের আওতায় নেও যেতে পারে , তবে এখানে খেয়াল রাখতে হবে যে প্রত্যেক সার্ভিস জেন স্বাধীন কাজ করতে পারে , যদি একটা সার্ভিস আর একটা সার্ভিসের উপড়ে নির্ভর হয়ে পরে তাহলে API Gateway প্যাটার্ন ফলো করতে হবে, েসব নিয়ে পরের পর্বে আশাকরি আলোচনা করব ।

তবে আগে মনলিথ তারপরে মাইক্রোতে যাওয়া উচিত। অর্থাৎ আপনি প্রোজেক্ট আগে পুরোটাই সব সার্ভিস একসাথে করে ফেলা উচিত, যেমনটা সাধারণত আমারা করি ভিবিন্ন ফ্রেমওয়ার্ক ব্যবহার করে । এর পরেই মোটামটি যেগুলো আলাদা ভাবে কাজ করতে সক্ষম বা অতিরিক্ত সংযোগ অ্যাপে সেগুলো মাইক্রোতে নিয়ে যাওয়া উচিত, যেমন যদি একটা ই-কমার্স অ্যাপের কথা চিন্তা করি তাহলে, Search, Recomendation Engine, Order, Operation সব আলাদা আলাদা মাইক্রোসার্ভিসে ভাগ করা উচিত ।

 

সময় হলে এর পরের পর্বে মাইক্রোসার্ভিস প্যাটার্ন ও অ্যান্টি-প্যাটার্ন নিয়ে লিখব ……

3Jul

ওয়েব ডেভেলপমেন্ট ও ডকার (Docker) | পিএইচপি | ওরাকল | পর্ব ২.১

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

ইউনিভার্সিটিতে আমাদের ৩য় বর্ষে ২য় সেমিস্টারে Oracle ডাটাবেস এর PL/SQL দিয়ে একটা প্রোজেক্ট করতে বলা হয়েছিল । অনেকেই অনেক ল্যাঙ্গুয়েজ পছন্দ করে , তবে বেশিভাগই PHP , JAVA , .NET etc.. এর দিকে যায় প্রোজেক্ট করার সুবিধার জন্য ।  এখানে অমি PHP & Oracle PL/SQL নিয়ে আলোচনা করব ।

শুরুতেই একটা বিষয় বলে ফেলি সেটা হল ডকারফাইল (Dockerfile) । ডকারফাইল নিয়ে বিস্তারিত আমরা পরের পর্বে দেখব , এখন শুধু মাথায় এটা রাখলেই চলবে যে ডকারফাইল হল অনেকটা Script এর মত । মানে এখানে যা কিছু লিখা থাকবে ডকার ইঞ্জিন তাই করবে । এটাকে ডকার ইঞ্জিনের ইন্সট্রাকশন বলতে পারেন । নিচে একটা  ডকারফাইল (Dockerfile) দেওয়া আছে যেখানে ধাপে ধাপে বলা আছে যে  PL/SQL দিয়ে PHP ডেভেলপমেন্ট করতে হলে আপনাকে কি কি করতে হতে পারে ।

যেহেতু অমি আরও Laravel 5 Framework ব্যবহার করেছিলাম তাই আমাকে কিছু অতিরিক্ত PHP Extension ও ইন্সটল করতে হয়েছিল ।

পুরো প্রোজেক্ট টা  Github এ দেওয়া আছে  ডাউনলোড করে  নিলে ভাল হয়  ।  ডাউনলোড করার পরে দেখবেন ফোল্ডারে Dockerfile  নামে  একটা ফাইল আছে  । এটা খুলুন ,  নীচের Script গুলো দেখতে পারবেন

পুরো জিনিসটা একটু একটু করে বুঝানোর চেষ্টা করি ,  প্রথমে,

লাইন ১ঃ   FROM php:7-apache এখানে বলা হয়েছে আমরা php এর 7 Apache ভার্সনের একটা Image দিয়ে পুরো জিনিসটা বানানো হবে । আর একটু বিস্তারিত বললে বলা যায় যে  আমরা php 7 & apache ইন্সটল করা আছে এরকম একটা ছোট্ট Image/Container ব্যবহার করব পুরো Environment টা বানানোর জন্য । অর্থাৎ ধরে নেই আমাদের PHP ইন্সটল করাই আছে ।

লাইন ৭ঃ  libaio-dev, libmcrypt-dev, git কিছু প্রয়োজনীয় Library ইন্সটল করা হচ্ছে লারাভেলের জন্য ।

লাইন ১২- ১৬ঃ  PHP Extension – pdo , mysqli , mbstring , mcrypt  ইন্সটল করা হচ্ছে যেগুলো আমাদের PHP প্রোজেক্ট ডেভেলপমেন্ট করার সময় ডাটাবেসের সাথে কানেক্ট করার সময় লাগবে ।

লাইন ২২ ও ২৫ঃ  লারাভেলের জন্য PHP Dependency Management Tool Composer ও Apache mod_rewrite Extension চালু করা হচ্ছে ।

লাইন ৩০ – ৩৬ঃ  ADD oracle/instantclient-basic-linux.x64-12.1.0.2.0.zip /tmp/ আমরা বলে দিচ্ছি যে আমাদের ডাউনলোড করা
Oracle এর instantclient SDK যেন /temp এ কপি করে তারপরে /use/local এ আনজিপ করা হয় ।

লাইন ৩৮-৩৯ঃ PHP Extension Manager PECL ইন্সটল করা হল ।  কারণ PHP তে Oracle PL/SQL কোড কম্পাইল করার জন্য oci8 lib সাপোর্ট লাগে ।

লাইন ৪১-৪৪ঃ কিছু Symlink তৈরি করা হল কারণ লাইব্রেরি ইন্সটল করার সময় এসব Symlink থাকতে হবে নয়ত oci8 lib কম্পাইল হবে না । শেষের লাইন এ oci8 lib ইন্সটল করা হল ।

উপরের লাইন গুলিতে অমি জিনিসগুলো একটু সোজা করে বোঝানোর চেষ্টা করলাম , আপনারা একটু পড়ে দেখলেই বুঝতে পারবেন । যারা Linux / Unix ব্যবহার করেন তাঁদের কাছে লাইন গুলো অপরিচিত নয় । তাঁদের বুঝতে অসুবিধা হবে না আশা করি । মুল কথা হল আপনি যেই মেশিনেই Oracle PL/SQL with PHP ডেভেলপমেন্ট করেন না কেন আপনাকে এসব সেটআপ করতে হবে বিশেষ করে Linux/Unix দের

এরপরে Docker cli দিয়ে docker build . অথবা docker build -f Dockerfile কমান্ড  লিখলেই সব ইন্টারনেট থেকে ডকার নামিয়ে কনফিগার করে একটা Image/Container বানাবে ।

 

এই সব কিছু ম্যানুয়ালি করতে গিয়ে দেখবেন অনেক যায়গায় মিলছে না , বিশেষ করে যারা নতুন করে করছেন বা আগে কখনও করেন নি , হয়ত SDK ভার্সন মিলছে না , PHP বলছে এই Extension আমরা নতুন 7 ভার্সনে সাপোর্ট করি না , এরপরে Mysqli, PDO বলছে যে ঠিকমত oci8 কম্পাইল হয়নি আবার করতে হবে ইত্যাদি ইত্যাদি ।

compile error !!

যদিও সব কিছু ঠিক থাক মত হয়ে গেল তারপরে পিসি কোন কারণে ক্রাশ করল , নয়ত বন্ধুদের মধ্যে কেউ বলল যে এবার আমার পিসিতেও করে দে !! অথবা আপনার বস বলল এই VPS এ পুরো Environment টা সেটআপ কর । তখন কি আবার থেকে করবেন ? উত্তরটা আপনি নিজেই ভাল করে জানেন ।

ডকারের আর একটা ভাল জিনিস হলো ডকারের ডেভেলপমেন্ট এখন অনেক পপুলার এবং ডেভেলপার কমেউনিটিতে এর সাপোর্ট অনেক ভাল । আপনি যা বানানোর কথা ভাবছেন গুগল করে দেখেন কেউ না কেউ সেই Dockerfile দিয়ে Image বানিয়ে রেখেছে। ওসব কালেকশন খুঁজতে সার্চ করুন ডকারহাব  । ওখানে সব ইন্সট্রাকশন দেওয়া আছে , শুধু আপনার পিসিতে ডকার ইন্সটল করা থাকলে চলবে আর আপনাকে কিছু নতুন করে ইন্সটল করা লাগবে না ।

এখন কাজ শেষ হয়নি , আমরা শুধুমাত্র পিএইচপি ডেভেলপমেন্ট এনভাইরনমেন্ট সেটআপ করলাম এখন ডাটাবেসের সাথে সংযোগ বাকি !! । এটাও আমরা ডকারের মাধ্যমে করব , এখন আমরা আর Oracle এর ওয়েবসাইট থেকে 3 GB এর ফাইল ডাউনলোড করব না । আমরা ডকারহাবে খুঁজব যে Oracle Database এর কোন Container পাওয়া যায় কি না ।

sath89/oracle-xe-11g একজন একটা এর ডকার Container বানিয়েছেন , ওটা এখন আমরা ব্যাবহার করব পুরো প্রোজেক্ট টা সেটআপ করানোর জন্য । এখন এই Container টা আমরা নামিয়ে নিব ও চালু করব । এর জন্যে লিখব docker run –name oracle-db sath89/oracle-xe-11g এখন কিছুক্ষণ আগে বানানো php-oracle-container টি এর সাথে লিঙ্ক করব । কাজ কিছুটা বেড়ে গেল মনে হচ্ছে !

এবার অনেকগুলো কাজ একসাথে করতে হচ্ছে , অনেক কমান্ড , সব মনে রাখা কষ্টকর আর যারা কমান্ড লিখতে অভ্যস্থ না তাদের জন্য একটু কঠিন ।  সুতরাং সব গুলো কাজকে একসাথে করার জন্য ডকারের আর একটা টুলস আছে যার নাম Docker Compose  । এটা সাধারনত ডকারের অনেকগুলো কাজ একসাথে করে । নিচে এই প্রোজেক্টটের একটা docker-compose.yml ফাইল দেওয়া হল । এখানে সব গুলো কাজের একসাথে ইন্সট্রাকশন দেওয়া আছে , যেমন

লাইন ১ – ১১ঃ  আমরা Docker Build করার সময় যেসব স্টেপ / আর্গুমেন্ট কমান্ড হিসাবে লিখতে হয়েছিল , সেসব আর্গুমেন্ট এখানে একটা YML ফাইল সিনট্যাক্স হিসাবে লিখতে হয়েছে , প্রথমে নাম তারপর ডকার ফাইলটা কোথায় , কোন পোর্টে সার্ভিসটি রান হবে , কোন ফাইলগুলো Host to Guest এ মাউন্ট হবে , আর শেষে এর সাথে আর অন্য কোন ডকার লিঙ্ক হবে ।

লাইন ১৩ – ২০ঃ Oracle Database  এর জন্য কনফিগারেশন  , কোন Docker Image ব্যবহার করব , নামে কি হবে , পোর্ট কত আর সব শেষে কোথায় ডাটা গুলো থাকবে ।

সব শেষে শুধুমাত্র একটা কমান্ড( docker-compose build && docker-compose up ) লিখলেই সব কাজ একসাথে হবে ।

অর্থাৎ যারা নতুন করে প্রোজেক্ট সেটআপ করতে চাবে তাঁদেরকে শুধু Docker & Docker Compose ইন্সটল করতে হবে ।

25Jun

মাইক্রোসার্ভিস আর্কিটেক্টচার – পর্ব ১

কি ?

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

মাইক্রোসার্ভিস আর্কিটেক্টচার

মাইক্রোসার্ভিস আর্কিটেক্টচার

 

কেন ?

মাইক্রোসার্ভিসের প্রথম সুবিধাটা হল স্কেলিং (Scaling) অর্থাৎ যখন আপনার অ্যাপ্লিকেশান অনেকগুলো লোড নেওয়া শুরু করবে তখন লোড নিতে নিতে হয়ত কোন একসময় আপনার অ্যাপ্লিকেশান ক্রাশ ও করতে পারে । আপনি হয়ত এটার হাত থেকে বাঁচার জন্য সার্ভারের CPU Core আরও বাড়াবেন , নয়তবা আরও Extra Ram ইন্সটল করবেন । এই পধতি টাও ঠিক আছে কিন্তু এটাতে অনেক অসুবিধা আছে , এটাকে সাধারণত Vertical Scaling বলে ।

Vertical Scaling এর প্রধান অসুবিধা হল যেহুতু পুরো অ্যাপ্লিকেশানটা একটা বড় সার্ভারে আছে তাই Single Point of Failure হতে পারে অর্থাৎ যদি মেশিনে কিছু অসুবিধা হয় তাহলে পুরো অ্যাপ্লিকেশানটাই কাজ করবে না আর এক না এক সময় কিছু ঘাটতি কারণে(Costing) হয়ত অত বড় সার্ভার চালানো সম্ভব হবে না ।

তাহলে চিন্তা করুন আপনার অ্যাপ্লিকেশানটা পুরোটাই এক সাথে না থেকে যদি প্রত্যেকটা অংশ চাহিদা অনুসারে অনেক অংশে ভাগ ভাগ করা থাকত,  বিভিন্ন মেশিনে কিন্তু সবগুলো মিলিয়ে কাজ করত একটা বড় অ্যাপ্লিকেশান এর মত । এখান থেকেই মাইক্রোসার্ভিসের জন্ম । অর্থাৎ আপনার অ্যাপ্লিকেশানটা পুরোটাই একসাথে না থেকে প্রত্যেকটা অংশ চাহিদা অনুসারে অনেক অংশে ভাগ ভাগ করা থাকবে এবং সবগুলো একে অপরের সাথে যোগাযোগ করবে এবং শেষে একটা হয়ে ফলাফল দেবে !

অনেক অংশে ভাগ ভাগ করার কারণে Single Point of Failure হবার সম্ভাবনা নেই । এবং চাহিদা মত আপনি বিভিন্ন সার্ভিসকে বিভিন্ন ক্ষমতা দিতে পারেন , উদাহরন স্বরূপ আপনার একটা বড় ই-কমার্স ওয়েবসাইট আছে , আপনি সেটাকে বিভিন্ন মাইক্রোসার্ভিসের ভাগ করেছেন অর্থাৎ ধরুন,

  1. একটা সার্ভিস সব প্রোডাক্ট ক্রেতাদেরকে দেখায় ,
  2. একটা সার্ভিস তারা কি কি পছন্দ করছে সেটার হিস্ট্রি রাখছে ,
  3. একটা সার্ভিস তাদের সার্চ অনুসারে ফলাফল দেখাচ্ছে ,
  4. একটা সার্ভিস অর্ডার নেওয়ার কাজ করছে এবং
  5. একটা সার্ভিস তাদের লেনদেনের হিসাব রাখছে ।

এখন আপনি লক্ষ্য করলেন যে এসব সার্ভিসের মধ্যে ১ ও ৩ সার্ভিস বেশি ব্যাবহার হচ্ছে , তাহলে আপনার শুধু ওইগুলো সার্ভিসকেই বেশি ক্ষমতা অর্থাৎ  (CPU & RAM) দেওয়া উচিত । এখন আপনি সেটা করতে পারবেন । অবং এ অবস্থায় একটা সার্ভিস বিভিন্ন লোকেশানে চালু করা যেতে পারে যদি দেখেন যে ওই লোকেশান থেকে আপনার গ্রাহক বেশি আসছে । আমাদের দেশে এখনো এলাকা ভিত্তিতে কোন ডাটা সেন্টের নেই তাই এলাকা ভিত্তিতে সার্ভিস চালু করার কোন উপায় নেই কিন্তু বিদেশে বড় বড় কোম্পানিগুলো এই কাজই করে । যখন তারা দেখে যে নিউইয়র্ক এর থেকে লসআঞ্জালেসে তাঁদের গ্রাহক বেশি তখন তারা একটা সার্ভিসের অনেক গুলো মেশিন ওই জিওগ্রাফিক লোকেশানে চালু করে যাতে সার্ভিসগুলো ওখানকার লোড সামলাতে পারে । একটা সার্ভিসের বিভিন্ন মেশিন কোনটা কখন ব্যবহার হবে সেই কাজটি যেই সার্ভিস করে থাকে তাকে বলে  Load Balancer । Load Balancer এর সম্বন্ধে আমরা বিস্তারিত পরের পর্বে  আলোচনা করব ।

Reference

https://smartbear.com/learn/api-design/what-are-microservices/
https://www.nginx.com/blog/introduction-to-microservices/
https://auth0.com/blog/introduction-to-microservices-part-4-dependencies/
https://dzone.com/articles/do-you-need-a-microservices-architecture

© Copyright 2017 shoumik.me, All Rights Reserved