استخر اتصال در توسعه پس زمینه: مفهوم اساسی ، مزایا و اجرای

عکس توسط کریستین توتونجیان در Unsplash
جمع آوری اتصال مکانیسمی است که مجموعه ای از اتصالات پایگاه داده را ایجاد و مدیریت می کند که می تواند توسط برنامه ها استفاده شود. این مفهوم در مدیریت اتصالات به پایگاه داده با هدف بهینه سازی استفاده از منابع و بهبود عملکرد برنامه هایی که اغلب با پایگاه داده تعامل دارند ، مهم است.
به جای ایجاد یک اتصال جدید هر بار که لازم باشد (که از نظر زمان و منابع گران است) ، استخرهای اتصال به برنامه ها اجازه می دهد تا اتصالات موجود را وام بگیرند و از آنها استفاده کنند و هنگام استفاده از آنها به استخر برگردانند. به همین دلیل نامیده می شود استخر اتصالبشر
چرا استخر اتصال مهم است؟
سوال مهم این است که چرا نظرسنجی ارتباط مهم است؟ چرا فقط 1 اتصال را به طور متناوب استفاده نکنید. بیایید در مورد 1 به 1 بحث کنیم که چرا جمع آوری اتصال مهم است.
عملکرد بهتر
باز کردن اتصال جدید به پایگاه داده می تواند زمان لازم باشد زیرا چندین فرآیند مانند تأیید اعتبار ، تنظیمات شبکه و غیره را طی می کند. با استفاده از استخر اتصال ، برنامه ها می توانند از این فرآیند جلوگیری کنند زیرا اتصالات در صورت لزوم در دسترس هستند.
صرفه جویی در منابع
بدون استخر ، اگر برنامه 100 درخواست دریافت کند ، برنامه 100 اتصال جدید ایجاد می کند. این می تواند سرور پایگاه داده را که همیشه مشغول انجام فرآیند اولیه سازی است ، سنگین کند. استخر اتصال می تواند تعداد اتصالات مورد استفاده همزمان را محدود کند ، این باعث می شود بار سرور پایگاه داده پایدار باشد.
مقیاس پذیری
جمع آوری اتصال به برنامه های کاربردی کمک می کند تا هنگام افزایش مقیاس برنامه ، بارگیری را به خوبی مدیریت کنند. با تنظیمات مناسب برای جمع آوری ، ما می توانیم تعداد زیادی درخواست را در همان زمان انجام دهیم و اطمینان حاصل کنیم که برنامه همچنان پاسخگو است.
پیکربندی بار
استخر اتصال را می توان با حداکثر تعداد اتصالات با توجه به نیاز پیکربندی کرد. بنابراین می تواند از کاربردهای سیلاب به پایگاه داده جلوگیری کند.
چگونه کار کنیم؟
اکنون که می فهمیم که چرا استفاده از جمع آوری اتصال مهم است ، اکنون در مورد نحوه عملکرد نظرسنجی ارتباط صحبت خواهیم کرد.
شروع استخر
اولین باری که یک برنامه اجرا می شود ، تعداد مشخصی از اتصالات به پایگاه داده (به عنوان مثال ، 10 اتصال) ایجاد می کند. این شماره نامیده می شود اندازه استخربشر این اتصال منتظر استفاده خواهد بود.
میزان اتصال
هنگامی که برنامه به اتصال به پایگاه داده نیاز دارد ، دیگر اتصال جدیدی ایجاد نمی کند ، در عوض درخواست اتصال از استخر را می دهد. اگر اتصال در استخر موجود باشد ، به برنامه اختصاص می یابد. اگر هیچ اتصالی در دسترس نباشد ، ممکن است برنامه منتظر بماند تا اتصال آزاد شود و پس از استفاده توسط یک فرآیند دیگر ، به استخر بازگردد.
اتصال را بازیابی کنید
پس از اتمام کاربرد با استفاده از اتصال ، اتصال را نمی بندد. در عوض ، اتصال به استخر بازگردانده می شود تا دوباره با درخواست بعدی استفاده شود.
پارامتر اصلی مشترک در استخر اتصال
موارد زیر برخی از پارامترهای اصلی است که معمولاً هنگام ایجاد استخر اتصال استفاده می شود. من سعی خواهم کرد که با جزئیات و به دنبال قیاس هایی که می تواند به ما در درک بهتر هر زمینه کمک کند ، توضیح دهم.
اندازه استخر
ما می توانیم تعداد اتصالات ارائه شده در اندازه استخربشر در صورت استفاده از همه اتصالات ، در صورت درخواست استفاده از اتصال ، صف می رود و منتظر اتصال موجود است یا در صورت پر شدن صف ، از بین می رود.
به عنوان مثال ، اگر حداکثر اندازه استخر را 10 تنظیم کنیم ، فقط 10 اتصال فعال توسط برنامه قابل استفاده است. اگر درخواست یازدهم شود ، این درخواست منتظر اتصال از استخر است که در حال استفاده است. قیاس مانند این است:
- تصور کنید پارکینگ ، اگر همه شکاف ها پر است ، یک ماشین جدید که می خواهد وارد شود (درخواست اتصال) باید منتظر بماند تا ماشین دیگری بیرون بیاید (اتصال بیکار).
- اگر می خواهیم ماشین های بیشتری را در خود جای دهیم ، باید اسلات های پارکینگ بیشتری بسازیم (افزایش می یابد MaxPoolSize) تا بتوانیم ماشین های بیشتری را در خود جای دهیم. اما افزایش هزینه های نگهداری وجود دارد (منابع سرور).
حداقل اتصالات
حداقل اتصال حداقل تعداد اتصالات است که اولین بار که برنامه اجرا می شود ایجاد می شود. این ارتباطی است که همیشه در حالت آماده به کار در انتظار استفاده خواهد بود ، حتی در صورت عدم درخواست. به عنوان مثال ، اگر تنظیم کنیم حداقل اندازه استخر 5 ، استخر اطمینان حاصل می کند که همیشه 5 اتصالات بیکار وجود دارد. حتی اگر درخواست فعال وجود نداشته باشد ، استخر همچنان اطمینان حاصل می کند که این 5 اتصالات برای کاهش زمان باز شدن اتصال در هنگام درخواست درخواست باز هستند.
این برای پیش بینی بارهای نامنظم مفید است ، به عنوان مثال ناگهان برنامه ما درخواست های زیادی را دریافت می کند و اتصالات بدون نیاز به باز کردن اتصال جدید آماده استفاده هستند. قیاس مانند این است:
- تصور کنید که یک رستوران دارای 10 صندلی است که عمداً در اتاق ناهار خوری مرتب نشده اند ، اما در انبار ذخیره می شوند. اما وقتی بازدید کنندگان زیادی وجود دارد ، ما به صندلی های اضافی احتیاج داریم ، برای خرید آنها در مغازه نیازی به طولانی نداریم. اما فقط باید به انبار بروید و 10 صندلی مورد نیاز برای استفاده را انتخاب کنید.
اتصال بیکار
اتصالات بیکار تعداد اتصالی است که مورد استفاده قرار نمی گیرد اما در استخر باز می ماند ، که می توان آن را “اتصالات بیکار” نیز نامید. این پارامتر معمولاً توسط:
- حداکثر زمان بیکار: چه مدت اتصال بیکار قبل از بسته شدن حفظ می شود.
- حداکثر اتصالات بیکار: تعداد اتصالات بیکار مجاز به ماندن در استخر.
به عنوان مثال ، اگر تنظیم کنیم MaxidleConnections = 5 ، استخر حداکثر 5 اتصال بیکار را حفظ می کند. اگر اتصالات بیکار بیشتری وجود داشته باشد ، بسته خواهد شد. اگر درخواست جدیدی در مدت زمان مشخصی وجود نداشته باشد (برای مثال ، 10 دقیقه) ، ممکن است این اتصالات بیکار برای صرفه جویی در منابع حذف شوند. قیاس مانند این است:
- در سوپر مارکت 5 صندوق دار وجود دارد ، 3 صندوق دار در حال خدمت به خریداران هستند (اتصال فعال) و 2 صندوق دار در موقعیت های خود بدون صف خریداران (اتصال بیکار) در حالت آماده باش قرار می گیرند و هر زمان که خریدار بیاید آماده هستند.
- سوپر مارکت ها یک قانون دارند ، “اگر صندوقدار به مدت 30 دقیقه بدون مشتری در حالت آماده به کار باشد ، می توانند به خانه بروند.” این 30 دقیقه زمان بیکار است.
مدت زمان طولانی
ما می توانیم حداکثر زمانی را که برنامه منتظر اتصال از استخر قبل از عدم موفقیت است (خطا) تنظیم کنیم. این کار برای جلوگیری از برنامه های کاربردی بیش از حد طولانی برای اتصالات موجود از استخر انجام می شود ، اگر استخر شلوغ یا پر باشد. این برای جلوگیری از انتظار بیش از حد طولانی برنامه برای اتصال مفید است که باعث می شود برنامه “یخ” را در جایی که بهتر است خطایی را به کاربر وارد کند ، “به کار می رود تا بتواند اطلاعاتی را به کاربر ارائه دهد تا دوباره امتحان کند نه نتیجه در یک درخواست یخ
به عنوان مثال ، اگر ما 5 ثانیه زمان تعیین کنیم ، اگر یک درخواست ارتباط برقرار نکند ، پس از انتظار 5 ثانیه ، خطایی دریافت می کند. نکته ای که باید به خاطر بسپارید این است که یک زمان کوتاه که خیلی کوتاه است می تواند باعث شود که درخواست خیلی سریع از بین برود و یک زمان طولانی که خیلی طولانی است به این معنی است که درخواست خیلی طولانی آویزان خواهد شد. قیاس مانند این است:
- ما در تلاش هستیم تا در یک رستوران (درخواست) بخریم ، اما نمی توانیم منتظر صف (محدودیت زمان) باشیم. و ما تصمیم گرفتیم رستوران را ترک کنیم (خطای بازگشت).
حداکثر طول عمر
طول عمر تعیین می کند چه مدت اتصال می تواند قبل از تنظیم مجدد یا بسته شدن زندگی کند توسط استخر ، حتی اگر اتصال فعال باشد. معمولاً برای جلوگیری از مشکلات اتصال قدیمی یا تنظیمات به روزرسانی برای اطمینان از اتصالات تازه و قابل اعتماد استفاده می شود.
به عنوان مثال ، اگر تنظیم کنیم حداکثر طول عمر 20 دقیقه ، هر ارتباطی که به مدت 20 دقیقه استفاده شده باشد خواهد بود بسته و از استخر خارج شد و با اتصال جدیدی که ایجاد می شود جایگزین می شود.
این مهم است زیرا بعضی اوقات برخی از سرورهای پایگاه داده محدودیت زمانی برای اتصالات قدیمی دارند که می توانند از مشکلات بی نظیر ** جلوگیری کنند. قیاس مانند این است:
- یک دفتر در هر تغییر 3 افسر امنیتی دارد. هر افسر حداکثر 8 ساعت کار می کند (حداکثر طول عمر)
- پس از 8 ساعت ، مأمورین باید با افسران جدید جایگزین شوند ، حتی اگر 5 افسر قبلی هنوز در وضعیت خوبی قرار بگیرند ، مشکلی وجود ندارد و کار به راحتی کار می کند. اما این امر باعث می شود که مأمورین هنگام چک کردن بازدید کنندگان ورودی (درخواست ها) از خستگی و از دست دادن تمرکز خودداری کنند.
اجرای
اکنون سعی خواهیم کرد یک استخر اتصال را با استفاده از Golang پیاده سازی کنیم. به کد زیر توجه داشته باشید:
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
dsn := "username:password@tcp(127.0.0.1:3306)/dbname?parseTime=true"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open connection to database: %v", err)
}
defer db.Close()
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(time.Minute * 10)
db.SetConnMaxIdleTime(time.Minute * 5)
err = db.Ping()
if err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
fmt.Println("Successfully connected to database!")
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatalf("Failed to run query: %v", err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatalf("Failed to read query results: %v", err)
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
if err := rows.Err(); err != nil {
log.Fatalf("Error after iteration: %v", err)
}
}
ما می توانیم روی قطعه کد زیر تمرکز کنیم:
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(time.Minute * 10)
db.SetConnMaxIdleTime(time.Minute * 5)
توضیحات موجود در اینجا:
-
setMaxOpenConns (10): حداکثر تعداد اتصالی را که می توانند به طور همزمان باز شوند تعیین می کند.
-
setMaxidleConns (5): حداکثر تعداد اتصالات بیکار نگهداری شده در استخر را تعیین می کند.
-
setConnMaxLifetime (Time.Minute * 10): تعیین می کند که یک اتصال قبل از تنظیم مجدد یا بسته شدن چه مدت زندگی می کند.
-
setConnMaxidletime (Time.Minute * 5): تعیین می کند که قبل از بسته شدن ، اتصال بیکار چه مدت می تواند حفظ شود.
پایان
استفاده از جمع آوری اتصال بسیار مهم است ، زیرا این امر می تواند هنگام انجام یک بار نامنظم درخواست های دریافتی ، برنامه را به راحتی پیش بینی کند. اما تنظیمات مناسب نیز باید اجرا شود ، به طوری که استفاده از استخر اتصال می تواند بهینه تر باشد.
اگر موارد اضافی یا اصلاحاتی در بحث بالا دارید ، اجازه دهید در ستون نظرات آن را مورد بحث قرار دهیم. امیدوارم که کمک کند.