Systems Hub
01 / 12
সব একসাথে ধাপে ধাপে
💥

১০০০ জন একসাথে login করলে
কি database crash করে?

হ্যাঁ, করে — PgBouncer ছাড়া। প্রতিটা user-এর জন্য আলাদা OS process তৈরি হয়, RAM শেষ হয়, server পড়ে যায়।

❌ ছাড়া: crash নিশ্চিত ✅ সহ: ১০০০ → মাত্র ২০ connection

রহিম-করিম-জাবের-হাচান — সবাই একসাথে আসলে কী হয়? Animation দেখো।

প্রথমে বুঝি

PostgreSQL Connection = OS Process

রহিম যখন database-এ connect করে, PostgreSQL তার জন্য একটা আলাদা OS process তৈরি করে। এই process-এর নিজের RAM, নিজের CPU time লাগে।

~7 MB
RAM per connection
~80ms
Setup time
~300
Max safe connections

💥 ১০০০ user একসাথে এলে

১০০০ × ৭MB = ৭ GB RAM শুধু connections-এ! PostgreSQL এই ধাক্কায় crash করে। বাকি app-এর জন্য RAM নেই।

সমাধান

PgBouncer — মধ্যস্থতাকারী

📱
App
১০০০ requests
🔄
PgBouncer
Pool: 20 connections
🐘
PostgreSQL
মাত্র ২০!
১০০০
App connections
২০
DB connections

App মনে করে সরাসরি PostgreSQL-এ connect করছে। কিন্তু আসলে PgBouncer-এ। Connection reuse হয়।

সমস্যা দেখি

PgBouncer ছাড়া — রহিম, করিম, জাবের, হাচান

রহিম
করিম
জাবের
হাচান
🐘
PostgreSQL
RAM Usage0MB
❌ প্রতিটা user = আলাদা process ⚠️ RAM দ্রুত শেষ
সমাধান দেখি

PgBouncer সহ — connection reuse

রহিম
করিম
জাবের
হাচান
🔄
PgBouncer
waiting...
🐘
PostgreSQL
App: 0 Queue: 0 DB: 0/5
✅ Reuse হচ্ছে ✅ Queue করছে ✅ RAM safe
তুলনা

ছাড়া বনাম সহ

❌ PgBouncer ছাড়া

  • ১০০০ user → ১০০০ OS process
  • ৭GB+ RAM শুধু connections
  • ৩০০+ হলে PostgreSQL slow
  • ৫০০+ হলে crash সম্ভব
  • Serverless-এ প্রতি call নতুন connection
VS

✅ PgBouncer সহ

  • ১০০০ user → মাত্র ২০ DB connection
  • RAM ৯৫% কমে
  • Connection reuse = 0ms overhead
  • Queue করে সুশৃঙ্খলভাবে
  • Serverless-এ must-have
50x
কম RAM
100ms
faster
10x+
বেশি user
Pool Mode

৩টা Pool Mode

🔐 Session Mode

সবচেয়ে compatible
  • রহিম disconnect না হওয়া পর্যন্ত connection তার
  • সব feature কাজ করে
  • Efficiency কম
★ BEST

⚡ Transaction Mode

সবচেয়ে popular
  • করিম query শেষ → connection pool-এ ফিরল
  • জাবের সেটা নিল
  • Efficiency সর্বোচ্চ

🚀 Statement Mode

Aggressive, সীমিত use
  • এক SQL → connection ফিরল
  • Multi-statement কাজ করে না
  • শুধু read-only
Setup

কীভাবে Configure করে?

# pgbouncer.ini
[databases]
mydb = host=127.0.0.1 port=5432 dbname=myapp

[pgbouncer]
pool_mode = transaction # recommended
max_client_conn = 1000 # app থেকে কত নেবে
default_pool_size = 20 # DB-তে কতটা রাখবে
listen_port = 6432

Prisma-তে ব্যবহার

DATABASE_URL="postgresql://user:pass@localhost:6432/mydb?pgbouncer=true"
# ?pgbouncer=true = prepared statements disable (important!)
ধাপে ধাপে

Transaction Mode — রহিম → করিম → জাবের

রহিম connect করে → pool-এ slot পায় → query পাঠায়
রহিম-র transaction শেষ → connection pool-এ ফিরল → free!
করিম রহিমের connection নিল → query করল → আবার pool-এ ফিরল
জাবের করিমের connection নিল → ৫টা connection দিয়ে হাজারো user!

৫টা connection — রহিম, করিম, জাবের, হাচান সবাই served। নতুন connection বানানো হয়নি!

Serverless

Vercel / Lambda-তে বিশেষভাবে দরকার

❌ PgBouncer ছাড়া Serverless

প্রতিটা Lambda function invocation = নতুন DB connection। ১০০০ simultaneous request = ১০০০ connections। PostgreSQL crash করে।

✅ PgBouncer সহ Serverless

১০০০ Lambda function → সবাই PgBouncer-এর pool share করে → DB মাত্র ২০টা connection দেখে → শান্তিতে কাজ করে।

Prisma Accelerate Supabase PgBouncer Neon serverless
সতর্কতা

Common ভুল

❌ Prepared Statement ব্যবহার

Transaction mode-এ server-side prepared statements সমস্যা করে। Prisma-তে ?pgbouncer=true দিতে হবে।

❌ pool_size > max_connections

PostgreSQL-এর max_connections-এর বেশি pool_size দিলে connection refused। সবসময় DB limit-এর নিচে রাখো।

⚠️ Long Transaction

Transaction mode-এ দীর্ঘ transaction connection ধরে রাখে। Queue জমে যায়। query_wait_timeout সেট করো।

⚠️ Session Variable

Transaction mode-এ SET LOCAL পরবর্তী user-এ leak হতে পারে। Careful!

🎯

মনে রাখো — ৫টা কথা

🔌
PostgreSQL connection = OS process — ভারি, RAM খায়
🔄
PgBouncer connection reuse করে — ১০০০ → ২০
Transaction Mode = সেরা — করিম শেষ করলেই জাবের নেয়
🛡️
Serverless-এ must-have — Lambda/Vercel-এ ছাড়া বিপদ
🎯
Prisma: ?pgbouncer=true — এই একটা line-ই যথেষ্ট