28Aug

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

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

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

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

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

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

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

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

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

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

 

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

22Feb

Continuous Integration of Golang with Gitlab Pipeline | পর্ব ১

কিছুদিন আগে আমাদের নতুন একটা  প্রোজেক্টের জন্য মাইক্রোসার্ভিস আর্কিটেকচার অনুসরণ করে অ্যাপ্লিকেশান বানানো শুরু করি যেখানে Docker আর DevOps একটা বড় অংশ পালন করে, জেহুতু আমরা ল্যাঙ্গুয়েজ হিসাবে Golang ব্যবহার করছিলাম ও পুরো  অ্যাপলিকেশন অনেকগুলো ছোট ছোট অংশে ভাগ করা হয়েছিল । যত সার্ভিস বাড়ছিল ততই পুরো আপ্লিকেশন সামলানো ঝামেলার হয়ে পরছিল তাই পুরো জিনিসটাকে একটা CI Circle মানে Continuous Integration Circle এ নিয়ে আসার বেবস্থা করা হয়। প্রত্যেকটা সার্ভিসের Static Binary  Docker দিয়ে Deploy করা হচ্ছিল। সুতরাং প্রত্যেকটা সার্ভিস আমাদেরকে Dockerize করা লাগবে এবং সেই Docker Container কোন জায়গায় রাখতে হবে । তাই অনেক সিধান্তর পরে আমরা ঠিক করি আমাদের Repository , Gitlab এ নিয়ে আশা হোক যাতে আমরা Gitlab এর Container Registry ব্যবহার করতে পারি ।

আমাদের এই পর্বে  লক্ষ হবে ,  Golang এর কোড Gitlab Push করা মাত্রই Gitlab আমদের Golang এর কোডকে নিয়ে একটা Static Binary তে Compile করবে আর সেখানেই ওই Binary কে নিয়ে আর একটা Micro Docker Container বানাবে এবং Gitlab এর Private Docker Registry তে Push করবে ।   

আগেই বলে নেওয়া উচিত যে এর জন্যও আমাদের একটা VPS লাগতে পারে অথবা আপনার নিজের  ল্যাপটপেও Gitlab Runner চালানো যাবে তবে কিছু সিবাবদ্ধতা আছে, তবে এসব কাজের জন্য একটা নতুন VPS হলে ভাল হয়, Minimum 1 Core 1 GB Ram. অতিরিক্ত একটা VPS কেন লাগবে সেটা একটু পরেই আলোচনা করব ।

Gitlab Pipeline নিয়ে কিছু কথা

Gitlab কিছু দিন আগে পরীক্ষামূলক ভাবে Gitlab এর Pipeline and Registry Feature চালু করে অর্থাৎ Gitlab এখন আমাদের কোডকে শুধু সংরক্ষণই না Build করে দেখতে পারবে কোন ভুল আছে কি না (TDD! এবং আমরা আমাদের প্রত্যেকটা Private Repo এর জন্য একটা Private Docker Registry পাই যেটা Github , Docker Hub , Bitbucket বিনামূল্যে দেয় না , যদিও তাঁদের সেবা পরীক্ষামূলক তাও এটা আমাদের চাহিদা অনুযায়ী অনেক।

Gitlab Pipeline Environment চলে Docker দিয়ে । Docker কি এবং কেন আমাদের ব্যবহার করা উচিত এটা অমি আমার পুরনো আর্টিকেলে তুলে ধরার চেষ্টা করেছি।

Gitlab Pipeline এর Build চলে কিছু Shared Runner দিয়ে অর্থাৎ Gitlab নিজেরাই তাঁদের নিজেস কিছু সার্ভার দিয়ে আপনার কোড Build অথবা Test করার সুযোগ দেয়। তবে আমাদের উপরের লক্ষ টা একটু জটিল আর বর্তমানে Gitlab এর এই Shared Runner অতটা Configure করা যায় না । আরও যদি কাজটা নির্ভর করে Docker in Docker এর উপরে তাহলে নিজের একটা Server লাগবেই কারণ Gitlab Docker in Docker চালানোর জন্য যে Socket Sharing এর দরকার পরে সেটা Gitlab এর Shared Runner করা আপাতত সম্ভব না ।

জেহুতু Shared Runner আমাদের সমস্যার সমাধান করতে পারবে না তাই একটা আলাদা VPS এ আমরা আমাদের নিজেস Runner বসাব , যেটার মাদ্ধমে আমরা আমাদের সব মাইক্রোসার্ভিস Build করতে পারব ।

Stick with It

প্রথমে Gitlab Pipeline চালু করার জন্য Repo তে গিয়ে CI/CD সেকশন থেকে Pipeline চালু করে নেব আগে ।

Start Gitlab CI Pipeline

এরপর Settings > CI/CD > Runner Settings এ গেলে নিচের ছবির মত একটা জিনিস দেখতে পারব । এখানে নির্দেশনা দেওয়া আছে যে নিজের জন্যও Runner বসাতে কি করা লাগবে । এখান থেকে আমাদের শুধু একটা জিনিস লাগবে যেটা হল Registration Token যেটা আমরা নিজের VPS Runner সেটআপ করার সময় ব্যবহার করব ।

Gitlab without Runner

এখন আমাদের নিজের VPS এ ঢুকে Gilab Runner  ইন্সটল করে নেই। এটা একটা CMD Tool এর পরে এই Custom Runner কে আমাদের Gitlab Repo তে নিয়ে আসতে নিচের Conf Snippet টি Copy , Paste করব Terminal Shell এ । অবশ্যই CI_RUNNER_TOKEN এই জায়গায় আপনাদের নিজেস Register Token টকেন দিতে হবে 

Adding Custom Gitlab CI Runner

 

এটা হয়ে গেলে আমরা আমাদের Gitlab এর Runner Settings সেকশন এ Runners activated for this project গিয়ে নিচের ছবির মত একটা ছবি দেখতে পারব ।

Gitlab CI with Active Custom Runner.

এরপরে আমরা আমাদের প্রোজেক্ট এর জন্য একটা .gitlab-ci.yml ফাইল লিখব। যার মদ্ধে লিখা থাকবে Runner এর জন্য কাজটা কি হবে,

লাইন ১ঃ পুরো কাজটা করতে আমদের যা কিছু লাগবে তার জন্যও আমাদের একটা Docker Container বানানো আছে যার নাম restra/golang-docker-gitlabci এই Container এর মদ্ধে Golnag আর Docker ইন্সটল করা আছে । Golang দিয়ে আমরা আমাদের প্রোজেক্টের সোর্স কোড কম্পাইল করে Static Binary তে, আর Docker দিয়ে সেই Static Binary Dockerize করব যাতে আমরা সেটা যেকোনো মেশিনে চালাতে পারি ।

লাইন ৩২১ঃ Gitlab CI Configuration ফাইল এগুলো সম্বন্ধে Gitlab এর ওয়েবসাইট এ ভাল তথ্য পাওয়া যাবে ।

লাইন ২২ঃ glide আমাদের প্রোজেক্ট ওয়ে Dependency Manager যেটা কিনা আমাদের resta/golang-docker-gitlabci তে ইন্সটল করা আছে তাই এই কমান্ড আমরা ব্যাবহার করতে পারব। glide up আমাদের জন্য সব Dependency ইন্সটল করে নিবে যেটা কম্পিল করার সময় দরকার পরবে।

লাইন ২৩ঃ সবথেকে গুরুত্বপূর্ণ অংশ GO_ENABLED=0 GOOS=linux go build -ldflags “-s” -a -installsuffix cgo . দিয়ে আমরা আমাদের Golang প্রোজেক্টের Static Binary বানাব। 

লাইন ২৪২৮ঃ এই সব গুলো লাইন Docker কমান্ড , মূলত এই জন্যেই আমাদের Build Environment ( restra/golang-docker-gitlabci ) Docker ইন্সটল করে নিয়ে হয়েছে । এখন হয়ত কিছুটা বুঝা যাচ্ছে যে Docker in Docker কেন । লাইন ২৪ এ আমরা একটা Env variable ব্যাবহার করেছি যেটা $ACCESS_TOKEN এর মাদ্ধমে আমরা Gitlab থেকে Runner Variable পাঠাচ্ছি । 

Setting ENV Variable for Gitlab CI Runner

এখানে সাধারণ যার Repository তার Access Token লাগবে, এটা নিজের Settings > Access Token এখান থেকে গিয়ে নিয়ে নেওয়া যাবে ।

এখন যদি আমরা কোন Push করি Repo তে তাহলে CI/CD Pipeline এ আমরা দেখবও আমাদের Build শুরু হয়েছে ।

 

CI Job Started

 

 

 

Build এ ক্লিক করলে আমরা Build Log দেখতে পারব। এখানে লক্ষ করলে দেখা যাবে এটা প্রথমে আমাদের Docker Image ( restra/golang-docker-gitlabci ) ডাউনলোড করে তার পরে .gitlab-ci.yml এর দুইটা stage এ লিখা কমান্ড গুলো চালাবে আমাদের Docker Image এর মদ্ধে। সব কিছু ঠিক থাকলে আমরা নিচের ছবির মত একটা Log দেখতে পারব , যদি সেটা শেষ হয় Job succeeded দিয়ে তাহলে সব কিছু ঠিক আছে।

যদি আমরা Registry তে যাই তাহলে দেখতে পারব দুইটা Docker Container এখানে জমা হয়েছে । একটা ব্রাঞ্ছ এর নামে আর একটা latest যেমনটা .gitlab-ci.yml এ লিখা হয়েছিল।

 

Success

 

এই ৪.৭৮ মেগাবাইটের Docker Container , এটাই আমাদের একটা মাইক্রো সার্ভিস।  তবে সব কিছু এখানেই শেষ না, এর পরে হয়ত মাইক্রো সার্ভিস কিভাবে তদারকি করতে হয় এবং এর জন্য আমরা কি টুল ব্যাবহার করলে যাতে আমাদের মাইক্রো সার্ভিস প্রডাকশনে ব্যাবহারের উপযোগী হয় সেগুলো বিষয় নিয়ে আলোচনা করব ।

Links :

Gitlab Repo : https://gitlab.com/sh0umik/golang-gitlab-ci/

3Feb

NoSQL ডাটাবেস | পর্ব ১

NoSQL মানে হল Not Only SQL !! অনেকেই NoSQL লিখা দেখে হয়ত মনে করতে পারে যে এই ডাটাবেসে কোন SQL/Query Language নেই অথবা এর সাথে কোন সংযোগ নেই। NoSQL ডাটাবেস সাধারণত ডকুমেন্ট/ডাটা সংরক্ষণ করা যায় কোন নির্দিষ্ট Structure ছাড়াই (Unstructured Document) যেটা প্রয়োজন মত সার্চ করা যাবে , SQL এর মত সিনট্যাক্স ব্যবহার করে যেটা  RDBMS এ ব্যবহার করা হয় ডাটাবেস Query করার জন্য। NoSQL ডাটাবেস অনেক ক্ষেত্রে আমাদের ট্র্যাডিশনাল RDBMS এর থেকেও পাওয়ারফুল ও কার্যকর ।

NoSQL ডাটাবেসকে বানিয়েছে ইন্টারনেটের বড় বড় লিডাররা যেমন  Facebook, Google, Amazon ছাড়া আর অনেকে যাদের একটা ডাটাবেস দরকার ছিল যেটা কিনা পুরো পৃথিবী জুড়ে বিভিন্ন ডাটা সেন্টারে থাকবে কিন্তু সময় হলে ইচ্ছামত Scaling  করা যাবে ,  performance বজায় রেখে আর কোটি কোটি মানুষের ডাটা সংরক্ষণ করে রাখতে পারবে কিন্তু তার গতি মন্থর হওয়া যাবে না।

কি ?

সাধারণত NoSQL ডাটাবেস এক ধরনের Document Storage অর্থাৎ এখানে আপনার ডাটা পুরোটাই আপনি সংরক্ষণ করা যাবে কোন টেবিল , কলাম এ ভাগ করা ছাড়াই, যেটা কিনা ব্যবহার করা হয় ট্র্যাডিশনাল RDBMS গুলোতে !! Document হতে পারে একটা JSON ফাইল অথবা XML ফাইল অথবা  Text ফাইল ইত্যাদি ।

আধুনিক অ্যাপ্লিকেশোন গুলোতে এখন প্রায়ই API ভিত্তিক হয়ে থাকে এবং বর্তমানে JSON ফরম্যাট হচ্ছে খুব প্রচলিত একটা ফরম্যাট API ENDPOINT এর জন্য । একটা JSON Document সাধারণ KEY : VALUE Pair থেকে শুরু করে অনেক জটিল -> Object , Array , Nested Array হতে পারে ।  নিচে একটা মানুষের ডাটার উধারন দেওয়া হল যেখানে তার সম্বন্ধে কিছু লিখা আছে , তার নাম , ঠিকানা , নাম্বার ইত্যাদি ।

এই ডাটাটাকে যদি RDBMS এ রাখতে হলে শুধু মাত্র নাম আর ঠিকানা রাখার জন্য  নিচের ছবির মত দুইটা টেবিল এ ভাগ করতে হত ।  আবার যদি একটা মানুষের অনেকগুলো ঠিকানা থাকে ? তাহলে আর একটা Pivot টেবিল বানাতে হত যেটাতে Primary Key আর  Foreign Key থাকত One To Many Relation এর ভিত্তিতে । উপরের ডাটাটাকে RDMBS এ Normalization সহ রাখতে হয়ত ৫-৬ টা টেবিল লাগতে পারে কমপক্ষে । কিন্তু NoSQL ডাটাবেসে এই পুরোটাই সংরক্ষণ করা যাবে যেভাবে JSON ডাটাটি  যেমন আছে ঠিক সেভাবেই । দরকার পড়লে পুরোটাই GET করা যাবে কোন JOIN ছাড়াই । ভবিষ্যতে দরকার পড়লে CRUD অপারেশন ও Atomic অপারেশন (নির্দিষ্ট এক জায়গায় পরিবর্তন) চালানো যাবে এর উপরে।

ট্র্যাডিশনাল RDBMS ডাটাবেস ডিজাইন

কেন ?

এখন একটু জটিল  ডাটার দিকে নজর দেই , নিচে একটা রোগীর ডাটার উধাহারন দেওয়া আছে যেটা একটা স্ট্যান্ডার্ড  (FHIR) অনুসারে বসানো হয়েছে , অর্থাৎ এখানে Field যেমন resourceType , identifier , coding এসব ফিক্সড এবং এই কাঠামো পরিবর্তন করা যাবে না, তাহলে এই ডাটা যদি আপনাকে টেবিল অনুসারে ভাগ করে RDBMS এ রাখতে বলা হত তাহলে এটা Normalize করতে অনেক টেবিলের দরকার পড়ত ! তাই এটা চেষ্টা করাটাও বৃথা ।

এছাড়াও প্রয়োজন অনুসারে নতুন প্রোগ্রামের জন্য ডাটা ডিজাইন আরও জটিল হতে পারে । সে ক্ষেত্রে RDBMS এর থেকে NoSQL ডাটাবেস একটা উপযুক্ত সমাধান ।

কখন ?

আপনার ডাটাই বলে দেবে NoSQL কখন ব্যবহার করতে হবে , যদি ডাটাকে সহজ টেবিল , কলাম অাকারে  রাখা যায় অথবা যখন ডাটা  Accounting Spreadsheet এ মত হবে তখন RDBMS ব্যবহার করাই ভাল। কিন্তু ডাটা যখন উপরের উদাহারনের মত হবে অথবা অরও জটিল হবে , জটিল বলতে  ডাটার যখন অনেক স্তর হবে অথবা নেস্টেড হবে ,  যেমন উপরের ডাটার  ১০০ নং লাইনের  communication ফিল্ডের ডাটা !

আরেকটা কারণ হল যখন যদি ডাটার Schema যেকোনো সময় বদলাতে পারে এবং যদি ডাটার ৮০ – ৯০ বাগ সময় Read Cycle এ পরে এবং সেই ডাটা Front End এ দেখাতে তিন চার টেবিল এ JOIN করা লাগে  তাহলে সেই ডাটা  JSON  আকারে NoSQL ডাটাবেসে  রাখা ভাল।

 

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

4Apr

ডকার (Docker) কি | পর্ব – ১

ডকার হল একধরনের লিনাক্স কন্টেইনার টেকনোলজি । এর কাজ হল ডেভেলপমেন্ট এর জন্য আপনার অ্যাপ্লিকেশান লেয়ার কে সিস্টেম লেয়ার থেকে আলাদা করা । এটা একটা Cross Platform টুল যেটা উইন্ডোজ , লিনাক্স , ম্যাক , পাওয়ার পিসি সহ অনেক অনেক অপারেটিং সিস্টেম এ চলে ।

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

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

এর থেকে ভাল একটা উদাহরন হল ধরুন একটা প্রোজেক্ট রেভিউ করার জন্য বস/ সিনিয়র ডেভেলপার কে জমা দিতে হবে । ধরলাম সে Xampp এর নতুন ভার্সন চালায় অথবা অনেক পুরনো, আবার যে পিসি তে অ্যাপটি ডেভেলপ করা হল সেটা PHP এর একটা নিরদিষ্ঠ ভার্সন দিয়ে বানানো যেখানে  অ্যাপটি চালানোর জন্য অনেক কিছু কাস্টম কনফিগার করা আছে , যার জন্য প্রোজেক্ট টা ঠিকমত চলছে , কিন্তু যাকে প্রোজেক্টটা হস্তান্তর করা হল তার পিসি তে সেসব করা নেই ! তিনি যখন প্রোজেক্ট রান করার চেষ্টা করবে তখন সেটা ঠিকমত চলবে না ।

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

জাভার উদাহরণ দিয়ে বলি,  আপনি যখন একটা জাভা কোড নয়তবা প্রোজেক্ট অন্য একজনকে দেন তখন অবশ্যই চিন্তা করেন না যে সেটা তার কম্পিউটারে ঠিক মত কাজ করবে কি না , সে যে অপারেটিং সিস্টেম ই ব্যবহার করুক না কেন সেটা কাজ করবে , কারণ জাভার JVM কোড কে বুজতে দেই না যে সে কোন প্লাটফরম এ রান হচ্ছে। তাই অনেকেই বলে যে , “একবার কোড করে অনেক সিস্টেম এ রান করা যায় জাভাতে” , ঠিক তেমনি একবার Docker Environment সেটআপ করে ডেভেলপমেন্ট করলে এবং একবার একটা প্রোজেক্ট এর জন্য একবার একটা ডক্যার ফাইল লিখলে সেই প্রোজেক্ট নিশ্চিন্তে হস্তান্তর করা যাবে যে কাউকেই আর যেকোনো মেশিনে।

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

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

ডকারের আরও অনেক সুবিধা আছে , আস্তে আস্তে আমরা সব নিয়ে আলোচনা করব ।  এর পরের পর্বে ডকার দিয়ে Web Development Environment সেটআপ করা নিয়ে আলোচনা করব ।

© Copyright 2017 shoumik.me, All Rights Reserved