لندر گو (Lander Go) یک Data Agent سبک، پرسرعت، تابآور و سلفهاستد (Self-Hosted) جهت جمعآوری و رله داده (Data Ingest Relay) است که با زبان Go توسعه یافته و بر روی سرورهای اختصاصی شما مستقر میشود. این سرویس به عنوان دروازه پایدار میان ارسالکنندگان داده و انبار داده دادهلند عمل میکند و با بافر دیسکی، خطر مفقودی دادهها را در نوسانات ترافیک یا قطعی شبکه برطرف میسازد.
لندر گو با حذف کامل نیاز به راهاندازی و نگهداری صفهای پیام سنگین (مانند Kafka و RabbitMQ)، رویکردی سبک و پایدار را با سازوکارهای زیر ارائه میدهد:
fsync روی دیسک ذخیره میشوند و پاسخ 202 Accepted با تاخیر چند میلیثانیهای بازمیگردد. این مکانیسم از مفقودی رکوردها در صورت قطعی برق یا ریاستارت سرور جلوگیری میکند./ingest/<endpoint_id> دریافت میشوند و نیازی به تعریف صف یا مسیر مجزا برای هر جدول نیست:POST /api/v1/batch ارسال میشوند:batch_interval_minutes (پیشفرض ۱ دقیقه) تجمیع و سپس ارسال میگردند.batch_gap_ms) پیاپی تخلیه میشوند.max_disk_bytes جهت کنترل فشار معکوس (Backpressure) تنظیم میشود تا در صورت پر شدن بافر، خطای 503 Service Unavailable صادر گردد. همچنین مدت نگهداری رکوردهای ارسالنشده با متغیر retention_hours (پیشفرض ۲۴ ساعت) تعیین میشود و رکوردهای قدیمیتر به طور خودکار پاک میشوند.لندر گو با حداقل منابع سختافزاری بر اساس جدول زیر اجرا میشود:
| منبع | حداقل مورد نیاز | حالت پیشنهادی و توضیحات |
|---|---|---|
| پردازنده | ۱ هسته (1 vCPU) | برای ترافیکهای سنگین (چندهزار درخواست در ثانیه)، استفاده از ۲ هسته توصیه میشود. |
| حافظه رم | ۱ گیگابایت | جهت پایداری کانتینر در لودهای سنگین، تخصیص ۲ گیگابایت رم پیشنهاد میگردد. |
| نوع دیسک | HDD | جهت کاهش تاخیر همگامسازی دیسک (fsync)، استفاده از حافظههای SSD یا NVMe اکیداً توصیه میشود. |
| فضای دیسک | ۲۰ گیگابایت | متناسب با حجم ورودی داده و مدت نگهداری در صف (retention_hours) تعیین میگردد. |
ایمیج رسمی لندر گو در داکر هاب با نام dadeland/lander-go:latest منتشر شده است و فرآیند راهاندازی آن شامل مراحل زیر است:
در صورتی که از یک سرور مجازی خام لینوکسی (Ubuntu یا Debian) استفاده میکنید و داکر روی آن نصب نیست، دستورات زیر را برای نصب Docker Engine و پلاگین Docker Compose اجرا نمایید (در صورت نصب بودن داکر از قبل، میتوانید از این مرحله عبور کنید):
# Update package list & install prerequisites
sudo apt-get update && sudo apt-get install -y ca-certificates curl
# Add official Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add Docker repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine & Docker Compose plugin
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
پیش از راهاندازی کانتینر، با اجرای دستورات زیر یک پوشه اختصاصی بسازید و فایل config.yaml را در آن ایجاد نمایید. مقادیر YOUR_SPACE_ID و YOUR_SPACE_TOKEN را با اطلاعات فضای خود در دادهلند جایگزین کنید. شناسه و توکن فضا از مسیر مدیریت فضا در تب مشخصات فضا قابل کپی هستند (تنها مالک فضا و مدیر فضا به این بخش دسترسی دارند):
# Create project directory and enter it
mkdir -p ~/lander-go && cd ~/lander-go
# Create config.yaml file
cat << 'EOF' > config.yaml
space: "YOUR_SPACE_ID"
token: "YOUR_SPACE_TOKEN"
EOF
پس از ایجاد فایل تنظیمات، کانتینر لندر گو را میتوانید به یکی از دو روش زیر در همان پوشه اجرا نمایید:
# Create docker-compose.yml file
cat << 'EOF' > docker-compose.yml
services:
lander-go:
image: dadeland/lander-go:latest
container_name: lander-go
restart: unless-stopped
ports:
- "80:8080"
volumes:
- ./data:/data
- ./config.yaml:/data/config.yaml:ro
EOF
# Start service in background
docker compose up -d
# Run container directly
docker run -d \
--name lander-go \
--restart unless-stopped \
-p 80:8080 \
-v ./data:/data \
-v ./config.yaml:/data/config.yaml:ro \
dadeland/lander-go:latest
ارتباط مسیرها و پورتهای داکر با تنظیمات برنامه به شرح زیر است:
/data متناظر با متغیر data_dir در فایل تنظیمات است../data پوشه ذخیرهسازی دادهها روی سرور میزبان را تعیین میکند.8080) پورت داخلی کانتینر است و پورت سمت چپ (80) پورت شنود سرور میزبان را مشخص میسازد (برای تغییر، پورت سمت چپ مانند "9000:8080" ویرایش میشود).برای ویرایش تنظیمات، مشاهده وضعیت لاگها، راهاندازی مجدد و آپدیت کانتینر لندر گو میتوانید از دستورات زیر استفاده نمایید:
cd ~/lander-go
# Open config file in nano editor
nano config.yaml
# Or edit with vim
vim config.yaml
cd ~/lander-go
# Follow live logs with Docker Compose
docker compose logs -f lander-go
# Follow live logs with Docker CLI
docker logs -f lander-go
cd ~/lander-go
# Restart service after editing config.yaml
docker compose restart
# Or restart directly with Docker CLI
docker restart lander-go
cd ~/lander-go
# Pull latest image and recreate container safely
docker compose pull
docker compose up -d
پیکربندی لندر گو از طریق یک فایل با ساختار YAML انجام میپذیرد:
| نام متغیر | نوع | پیشفرض | توضیحات |
|---|---|---|---|
space | رشته | اجباری | شناسه فضای کاری شما در دادهلند (Space ID) را مشخص میسازد. |
token | رشته | "" | توکن فضای کاری شما در دادهلند (Space Token) جهت احراز هویت را تعیین میکند. |
ingest_token | رشته | "" | توکن اختیاری جهت محافظت از مسیرهای /ingest است که ارسال هدر Authorization: Bearer <ingest_token> را الزامی میسازد. |
listen_addr | رشته | ":8080" | آدرس و پورت شنود وبسرور لندر گو را تعیین مینماید. |
data_dir | رشته | "./data" | مسیر دایرکتوری محلی جهت ذخیرهسازی دادههای بافر دیسکی را مشخص میسازد. |
batch_interval_minutes | عدد | 1 | حداکثر فاصله زمانی میان ارسالهای دستهای به دادهلند را به دقیقه تعیین میکند (حداقل مقدار: ۱). |
batch_max_bytes | عدد | 10485760 | سقف حجم خروجی هر بسته ارسالی به دادهلند را به بایت تعیین مینماید (پیشفرض ۱۰ مگابایت است و با تکمیل حجم بسته، ارسال فوری انجام میشود). |
batch_max_records | عدد | 500 | سقف تعداد درخواستهای ورودی در هر بسته را مشخص میسازد (با رسیدن به ۵۰۰ درخواست، ارسال بدون انتظار برای تایمر انجام میشود). |
batch_gzip | بولین | true | فشردهسازی بستههای گروهی با الگوریتم Gzip جهت کاهش مصرف پهنای باند را فعال میسازد. |
batch_concurrency | عدد | 3 | حداکثر تعداد بستههای ارسالی همزمان (موازی) به دادهلند را تعیین میکند. |
batch_gap_ms | عدد | 2000 | وقفه زمانی میان دورهای تخلیه صف را به میلیثانیه جهت کنترل پهنای باند شبکه مشخص میسازد. |
commit_window_ms | عدد | 5 | بازه زمانی تجمیع درخواستها در حافظه پیش از ثبت گروهی روی دیسک (fsync) را به میلیثانیه تعیین میکند. |
retention_hours | عدد | 24 | مدت نگهداری رکوردهای ارسالنشده در صف پیش از حذف خودکار را به ساعت مشخص میسازد. |
max_disk_bytes | عدد | 0 | حداکثر حجم مجاز دیسک برای بافر را تعیین میکند (مقدار ۰ به معنی نامحدود است و در صورت پر شدن، خطای ۵۰۳ صادر میشود). |
retry_max_backoff_seconds | عدد | 300 | حداکثر زمان انتظار میان تلاشهای مجدد در زمان قطعی ارتباط را به ثانیه مشخص میکند (پیشفرض ۵ دقیقه). |
allowed_origins | آرایه | [] | لیست دامنههای مجاز CORS را مشخص مینماید (خالی بودن به معنای مجاز بودن همه دامنهها است). |
rate_limit_rps | عدد | 0 | سقف تعداد درخواستهای ورودی در ثانیه را کنترل میکند (مقدار ۰ این محدودیت را غیرفعال میسازد). |
max_body_bytes | عدد | 10485760 | حداکثر حجم مجاز بدنه درخواست POST ورودی به لندر گو را به بایت کنترل میکند (پیشفرض ۱۰ مگابایت؛ سقف متد GET به طور ثابت ۳۲ کیلوبایت است). |
log_level | رشته | "info" | سطح جزئیات لاگهای خروجی را تعیین میکند (debug, info, warn, error). |
pprof_addr | رشته | "" | آدرس و پورت اجرای ابزار Profiling جهت ارزیابی مصرف پردازنده و رم برنامه را مشخص میسازد (مانند ":6060"). |
otel_enabled | بولین | false | قابلیت Distributed Tracing از طریق OpenTelemetry را فعال میسازد. |
otel_endpoint | رشته | "" | آدرس سرور دریافتکننده دادههای OpenTelemetry (OTLP) را مشخص میکند. |
برای راهاندازی سریع میتوانید از حداقل تنظیمات لازم استفاده کنید یا با استفاده از نمونه کامل، تمام رفتارهای لندر گو را سفارشیسازی نمایید:
# Minimal configuration for quick start
space: "YOUR_SPACE_ID"
token: "YOUR_SPACE_TOKEN"
# Workspace Ingest Token (Optional - Protects /ingest endpoints)
ingest_token: "secret-ingest-key"
# Space ID for Dadeland (Required)
space: "YOUR_SPACE_ID"
# Space token (Required for forwarding to Dadeland)
token: "YOUR_SPACE_TOKEN"
# Batch drain tuning
batch_interval_minutes: 1
batch_max_bytes: 10485760
batch_max_records: 500
batch_gzip: true
batch_concurrency: 3
batch_gap_ms: 2000
# Disk buffer settings
commit_window_ms: 5
data_dir: "./data"
retention_hours: 24
max_disk_bytes: 0
retry_max_backoff_seconds: 300
# Security and Rate Limiting
allowed_origins: []
rate_limit_rps: 0
max_body_bytes: 10485760
# Server & Logging
listen_addr: ":8080"
log_level: "info"
pprof_addr: ""
otel_enabled: false
otel_endpoint: ""
آدرس دریافت رویدادها در این Data Agent از الگوی زیر پیروی میکند:
http://<lander-host>/ingest/<endpoint_id>
http://<lander-host>:<port>/ingest/<endpoint_id>).در این رویکرد نیازی به فراخوانی اندپوینت اختصاصی هر جدول در دادهلند وجود ندارد؛ بلکه تنها کافی است شناسه اندپوینت جدول مقصد را در بخش <endpoint_id> قرار دهید تا لندر گو دادهها را به جدول متناظر هدایت نماید. این شناسه از بخش مشخصات جدول در صفحه مدیریت دیتاست قابل دریافت است.
برای ارسال دادهها میتوانید از متد POST (رویکرد پیشنهادی) یا متد GET استفاده کنید؛ همچنین جهت ارسال سرورساید دادههای ماژول کلاینت و ارتقای امنیت ارتباط، اتصال لندر گو به دامنه و CDN توصیه میشود:
| کد وضعیت | توضیحات |
|---|---|
202 Accepted | داده با موفقیت دریافت گردید و روی بافر دیسکی ذخیره شد. |
400 Bad Request | ساختار داده ارسالی یا فرمت JSON نامعتبر است. |
401 Unauthorized | متغیر ingest_token فعال است اما هدر احراز هویت ارسال نشده یا مقدار آن نادرست است. |
413 Payload Too Large | حجم بدنه درخواست ورودی از سقف مجاز max_body_bytes فراتر رفته است. |
503 Service Unavailable | حجم صف دیسکی به سقف تعیینشده در max_disk_bytes رسیده است یا سرویس در حال خاموش شدن است. |
لندر گو اندپوینتهای متعددی را برای بررسی سلامت سرویس، پایش وضعیت صفهای دیسکی و دریافت متریکهای استاندارد پرومتئوس ارائه میدهد: