1.4 میلیارد لاگ کاربر، بدون شاردینگ یا سیستمهای پیچیده – فقط با PostgreSQL 18!
سیستمی ستاپ کردن که :
بیش از 1.4 میلیارد لاگ فعالیت کاربر رو مدیریت میکنه
همزمانی بالا در خواندن و نوشتن رو پشتیبانی میکنه
درخواستهای مهم رو زیر 200ms پاسخ میده
❌ بدون شاردینگ
❌ بدون چند دیتابیس یا معماری پیچیده
✅ فقط PostgreSQL 18، با تنظیمات دقیق و بهینهسازی
لینک مقاله
#database #postgres
@panicdev
سیستمی ستاپ کردن که :
بیش از 1.4 میلیارد لاگ فعالیت کاربر رو مدیریت میکنه
همزمانی بالا در خواندن و نوشتن رو پشتیبانی میکنه
درخواستهای مهم رو زیر 200ms پاسخ میده
❌ بدون شاردینگ
❌ بدون چند دیتابیس یا معماری پیچیده
✅ فقط PostgreSQL 18، با تنظیمات دقیق و بهینهسازی
لینک مقاله
#database #postgres
@panicdev
Medium
How We Designed a 1 Billion Row System on PostgreSQL 18 (And Why It’s Blazing Fast)
When most engineers think of storing over a billion rows, they usually turn to distributed databases like Cassandra, Bigtable, or DynamoDB…
👍1
فیلامنت نسخه ۴ به صورت پایدار (stable) روز ۱۲ اگست ساعت ۱ بعد از ظهر (UTC) ریلیز و در دسترس میشه 🙌
به زمان ایران/تهران میشه سه شنبه هفته آینده (۲۱ مرداد) ساعت ۴:۳۰ بعد از ظهر🚀
به زمان ایران/تهران میشه سه شنبه هفته آینده (۲۱ مرداد) ساعت ۴:۳۰ بعد از ظهر
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍4🎉1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍1🤣1
وقتی پروژه PHP فقط روی سیستم خودت جواب میده و حس میکنی همه چیز اوکیه، تازه نصف راه رو رفتی! توی محیط واقعی (سرور)، داستان فرق میکنه.
اینجا سرعت، پایداری و مدیریت منابع حرف اول رو میزنن.
🛠 چند تا نکته مهم که باید رعایت کنی:
🔹 فعال کردن OPcache
وقتی این قابلیت روشن باشه، کدها فقط یه بار کامپایل میشن و داخل حافظه میمونن. این یعنی سرعت بالاتر و فشار کمتر روی CPU.
داخل php.ini این خطها رو اضافه یا اصلاح کن:
⚠️ یادت نره بعد از هر دیپلوی، PHP-FPM رو ریستارت کنی.
⚠️ یاد باشه که validate_timestamps روی ۱ نباشه ، اونوقت PHP شروع میکنه به چک کردن filesystem و بیشتر پتانسیل Opcache رو از دست میدی
🔹 تنظیم درست PHP-FPM
این سیستم چندتا «Worker» آماده نگه میداره تا درخواستها رو سریع جواب بدن. تعداد Worker ها باید با مقدار رم سرور هماهنگ باشه.
یه مثال:
چطور میتونی بفهمی هر ورکر چقدر مموری مصرف میکنه ؟
در این حالت روی سرور با ۸ گیگ رم و مصرف ۸۰ مگ برای هر php ورکر ، شما تقریبا میتونید ۶۰ عدد max_children داشته باشید .
🔹 استفاده از realpath cache
این کار باعث میشه مسیر فایلها رو PHP هی دوباره چک نکنه و سرعت بالاتر بره:
🔹 فعال کردن /status و slowlog
با /status میتونی ببینی چندتا کارگر فعاله و چندتا بیکار.
با slowlog هم میفهمی کدوم درخواستها طولانی اجرا میشن تا مشکل رو پیدا کنی.
📌 نتیجه نهایی:
اگر اوپکش فعال باشه، PHP-FPM درست تنظیم شده باشه، تایماوت بذاری، کش مسیرها فعال باشه و مانیتورینگ رو جدی بگیری، اپلیکیشن PHP توی سرور خیلی سریعتر، پایدارتر و قابل اعتمادتر کار میکنه.
@panicdev
#laravel #php
اینجا سرعت، پایداری و مدیریت منابع حرف اول رو میزنن.
🛠 چند تا نکته مهم که باید رعایت کنی:
🔹 فعال کردن OPcache
وقتی این قابلیت روشن باشه، کدها فقط یه بار کامپایل میشن و داخل حافظه میمونن. این یعنی سرعت بالاتر و فشار کمتر روی CPU.
داخل php.ini این خطها رو اضافه یا اصلاح کن:
opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
⚠️ یادت نره بعد از هر دیپلوی، PHP-FPM رو ریستارت کنی.
⚠️ یاد باشه که validate_timestamps روی ۱ نباشه ، اونوقت PHP شروع میکنه به چک کردن filesystem و بیشتر پتانسیل Opcache رو از دست میدی
🔹 تنظیم درست PHP-FPM
این سیستم چندتا «Worker» آماده نگه میداره تا درخواستها رو سریع جواب بدن. تعداد Worker ها باید با مقدار رم سرور هماهنگ باشه.
یه مثال:
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 1000
request_terminate_timeout = 30
چطور میتونی بفهمی هر ورکر چقدر مموری مصرف میکنه ؟
ps -o rss,cmd -C php-fpm | awk '{ sum+=$1 } END { print sum/NR/1024 " MB" }'در این حالت روی سرور با ۸ گیگ رم و مصرف ۸۰ مگ برای هر php ورکر ، شما تقریبا میتونید ۶۰ عدد max_children داشته باشید .
🔹 استفاده از realpath cache
این کار باعث میشه مسیر فایلها رو PHP هی دوباره چک نکنه و سرعت بالاتر بره:
realpath_cache_size = 4096k
realpath_cache_ttl = 600
🔹 فعال کردن /status و slowlog
با /status میتونی ببینی چندتا کارگر فعاله و چندتا بیکار.
با slowlog هم میفهمی کدوم درخواستها طولانی اجرا میشن تا مشکل رو پیدا کنی.
📌 نتیجه نهایی:
اگر اوپکش فعال باشه، PHP-FPM درست تنظیم شده باشه، تایماوت بذاری، کش مسیرها فعال باشه و مانیتورینگ رو جدی بگیری، اپلیکیشن PHP توی سرور خیلی سریعتر، پایدارتر و قابل اعتمادتر کار میکنه.
@panicdev
#laravel #php
🔥23👍7
Filament Modular V4
- Production Ready
- Enterprise Cache Layers
- Zero Config usage
- Ready to configure
https://github.com/panicdevs/modulite
- Production Ready
- Enterprise Cache Layers
- Zero Config usage
- Ready to configure
https://github.com/panicdevs/modulite
GitHub
GitHub - panicdevs/modulite: Effortless Filament integration for modular projects
Effortless Filament integration for modular projects - panicdevs/modulite
🔥7
Panic Dev
Filament Modular V4 - Production Ready - Enterprise Cache Layers - Zero Config usage - Ready to configure https://github.com/panicdevs/modulite
این پکیج فعلا توی نسخه 0.1 هست و تا ریلیز استیبل کمی فاصله داره - من بنا به نیاز خودم پکیج رو اپگرید کردم و با فیلامنت ورژن ۴ سازگارش کردم و همزمان با پیش بردن کارای خودم اگه به مسئلهای بربخورم توی روال توسعه و کار با این پکیج - اپدیتهای جدیدی رو روش اعمال میکنم - میتونید Changelog پکیج رو از این لینک دنبال کنید
- ضمن اینکه به زودی توی وبسایت فیلامنت هم در دسترس میشه.
https://modulite.panicdevs.agency/
- ضمن اینکه به زودی توی وبسایت فیلامنت هم در دسترس میشه.
https://modulite.panicdevs.agency/
modulite.panicdevs.agency
Modulite - Filament with Modular approach
Modulite streamlines Filament integration in modular Laravel by auto-discovering panels/components and accelerating boot with environment-aware, file-backed caching.
👌2🔥1
🚀 فرصت همکاری برای دولوپر PHP / Laravel
ما به دنبال یک دولوپر میدلول یا سنیور هستیم که هفتهای حداقل ۳۰ ساعت زمان برای همکاری داشته باشه.
🔹 مهارتها و تواناییهای مورد نیاز:
تسلط به Laravel و PHP
تجربه در توسعه وبسرویسها با رعایت استانداردها و Best Practices
توانایی مستندسازی وبسرویسها
توانایی تستنویسی برای وبسرویسها
آشنایی و توانایی توسعه پنل ادمین با Filament
مهارت کافی در MySQL و Redis
آشنایی نسبی با Docker
فردی مسئولیتپذیر با روحیه کار تیمی
📩 اگر زمان و توانایی لازم رو دارید، لطفاً هزینه ساعتی به همراه رزومه خودتون رو به دایرکت همین کانال ارسال کنید.
🏢 نحوه همکاری به صورت دورکار است
⚠️ فقط پیامهای ارسال شده به دایرکت همین کانال بررسی میشن.
با سپاس از همراهی شما ❤️
ما به دنبال یک دولوپر میدلول یا سنیور هستیم که هفتهای حداقل ۳۰ ساعت زمان برای همکاری داشته باشه.
🔹 مهارتها و تواناییهای مورد نیاز:
تسلط به Laravel و PHP
تجربه در توسعه وبسرویسها با رعایت استانداردها و Best Practices
توانایی مستندسازی وبسرویسها
توانایی تستنویسی برای وبسرویسها
آشنایی و توانایی توسعه پنل ادمین با Filament
مهارت کافی در MySQL و Redis
آشنایی نسبی با Docker
فردی مسئولیتپذیر با روحیه کار تیمی
📩 اگر زمان و توانایی لازم رو دارید، لطفاً هزینه ساعتی به همراه رزومه خودتون رو به دایرکت همین کانال ارسال کنید.
🏢 نحوه همکاری به صورت دورکار است
⚠️ فقط پیامهای ارسال شده به دایرکت همین کانال بررسی میشن.
با سپاس از همراهی شما ❤️
۱️⃣ محافظ نامرئی جلوی SQL Injection
اشتباه مرسوم: استفاده مستقیم از کوئری خام.
راهحل: همیشه از بایندینگ استفاده کن. اینطوری هم امنتره، هم سریعتر.
۲️⃣ لیست سیاه برای توکنهای Sanctum
توکنهای دزدیدهشده تا زمان انقضا معتبر میمونن.
با یه میانافزار ساده میتونی سریعاً توکنهای مشکوک رو باطل کنی.
اگه Redis هم بذاری وسط، سرعت چک کردن میشه لحظهای.
۳️⃣ دانلود استریمشده با cursor()
هیچوقت کل دیتابیس رو یهجا نیار بالا!
با cursor() و streamDownload میتونی میلیونها ردیف رو با مصرف رم خیلی کم استریم کنی.
۴️⃣ لیمیت هوشمند با اثرانگشت کاربر
محدود کردن فقط بر اساس آیپی سادهست و قابل دور زدن.
ترکیب آیپی + یوزر ایجنت رو هش کن، اون بشه کلید محدودیت. اینطوری حملات brute-force عملاً میریزه.
۵️⃣ گرم کردن روتها با Octane
لاراول به صورت پیشفرض روتها رو در لحظه بوت میکنه.
با route:cache و Octane میتونی استارت سرور رو تا چند برابر سریعتر کنی.
۶️⃣ محافظت از بلید جلوی XSS
وقتی HTML کاربر ذخیره میشه، {!! !!} خیلی خطرناکه.
راهحل: Purifier برای تمیز کردن کد + CSP nonce برای اسکریپتها.
۷️⃣ شاردینگ دیتابیس برای مقیاس بینهایت
وقتی ترافیک سنگین میشه، دیتابیس نفسش میگیره.
لاراول اجازه میده برای هر یوزر یا تننت یه کانکشن جدا تعریف کنی، بدون بازنویسی کل اپ.
۸️⃣ چرخش کلید رمزنگاری بدون داونتایم
عوض کردن APP_KEY قدیما یعنی همه لاگاوت بشن.
با نگه داشتن کلید قبلی و تعریف کلید جدید، میتونی بدون مشکل کلید رو بچرخونی.
📎منبع
@panicdev
#laravel #tips
اشتباه مرسوم: استفاده مستقیم از کوئری خام.
راهحل: همیشه از بایندینگ استفاده کن. اینطوری هم امنتره، هم سریعتر.
// ❌ Bad
DB::select("SELECT * FROM users WHERE email = '$email'");
// ✅ Secure
User::whereRaw("MATCH (bio) AGAINST (? IN BOOLEAN MODE)", [$searchTerm])
->where('is_public', true)
->get();php
۲️⃣ لیست سیاه برای توکنهای Sanctum
توکنهای دزدیدهشده تا زمان انقضا معتبر میمونن.
با یه میانافزار ساده میتونی سریعاً توکنهای مشکوک رو باطل کنی.
اگه Redis هم بذاری وسط، سرعت چک کردن میشه لحظهای.
public function handle($request, $next) {
if ($this->isCompromised($request)) {
$request->user()->currentAccessToken()->delete();
}
return $next($request);
}
۳️⃣ دانلود استریمشده با cursor()
هیچوقت کل دیتابیس رو یهجا نیار بالا!
با cursor() و streamDownload میتونی میلیونها ردیف رو با مصرف رم خیلی کم استریم کنی.
return response()->streamDownload(function () {
foreach (User::where('active', true)->cursor() as $user) {
echo json_encode($user) . "\n";
}
}, 'users.jsonl');
۴️⃣ لیمیت هوشمند با اثرانگشت کاربر
محدود کردن فقط بر اساس آیپی سادهست و قابل دور زدن.
ترکیب آیپی + یوزر ایجنت رو هش کن، اون بشه کلید محدودیت. اینطوری حملات brute-force عملاً میریزه.
RateLimiter::for('api', function (Request $request) {
$fingerprint = sha1($request->userAgent() . $request->ip());
return Limit::perMinute(100)->by($fingerprint);
});۵️⃣ گرم کردن روتها با Octane
لاراول به صورت پیشفرض روتها رو در لحظه بوت میکنه.
با route:cache و Octane میتونی استارت سرور رو تا چند برابر سریعتر کنی.
php artisan route:cache
php artisan octane:start --workers=8
۶️⃣ محافظت از بلید جلوی XSS
وقتی HTML کاربر ذخیره میشه، {!! !!} خیلی خطرناکه.
راهحل: Purifier برای تمیز کردن کد + CSP nonce برای اسکریپتها.
{!! Purifier::clean($html, ['HTML.Allowed' => 'a[href]']) !!}
<noscript nonce="{{ csp_nonce() }}">
var data = @json($safeData);
</noscript>۷️⃣ شاردینگ دیتابیس برای مقیاس بینهایت
وقتی ترافیک سنگین میشه، دیتابیس نفسش میگیره.
لاراول اجازه میده برای هر یوزر یا تننت یه کانکشن جدا تعریف کنی، بدون بازنویسی کل اپ.
User::on('user_shard')->find(15000);۸️⃣ چرخش کلید رمزنگاری بدون داونتایم
عوض کردن APP_KEY قدیما یعنی همه لاگاوت بشن.
با نگه داشتن کلید قبلی و تعریف کلید جدید، میتونی بدون مشکل کلید رو بچرخونی.
# .env
APP_KEY=new_key
PREVIOUS_APP_KEY=old_key
public function boot() {
Encrypter::rotate($this->app['config']['app.key'], 'new_key');
}
📎منبع
@panicdev
#laravel #tips
Medium
8 Laravel Secrets for a Secure, High-Performance API
Today, I’m sharing the 8 most powerful Laravel “secrets” I now consider non-negotiable in every backend I build. These tips are not just…
🔥10
Forwarded from Armin's Notes 🪴
پس از مدتها؛ برای همیشه از پکیج nwidart/laravel-modules دست کشیدم :))
توی این یادداشت دلایلش رو توضیح دادم - امیدوارم براتون جالب و مفید باشد 👀
https://www.arminnotes.com/notes/goodbye-nwidart-hello-panicdevs-modules
توی این یادداشت دلایلش رو توضیح دادم - امیدوارم براتون جالب و مفید باشد 👀
https://www.arminnotes.com/notes/goodbye-nwidart-hello-panicdevs-modules
یادداشتهای آرمین
خداحافظی با nwidart/laravel-modules؛ سلام به panicdevs/modules - یادداشتهای آرمین
بعد از سه سال توسعه بیش از ۱۵۰ ماژول با nwidart/laravel-modules، تصمیم گرفتم سراغ راهحل اختصاصی خودم برم: panicdevs/modules. تمرکز اصلی؟ پرفورمنس.
10❤🔥11👍3👌2
ابزار NATS یک سیستم پیامرسان (messaging system) ساده، سبک و فوقالعاده سریع است که برای ارتباط سرویسها در معماریهای مدرن مثل Microservices و Cloud-Native طراحی شده.
فلسفهی NATS اینه که حداقل پیچیدگی رو بیاره، در عین حال مقیاسپذیر و قابل اعتماد باشه.
🔹 مزیتهای NATS نسبت به Kafka
⚡️ سرعت و سبک بودن
این NATS خیلی سبکتر از Kafka هست و برای سناریوهایی که نیاز به latency پایین و سرعت بالا دارن، انتخاب بهتری محسوب میشه.
🛠 سادگی در راهاندازی
کافکا معماری پیچیدهتری داره (Zookeeper، Brokerها و ...)، درحالیکه NATS خیلی راحتتر بالا میاد و نیاز به سرویسهای جانبی نداره.
☁️ طراحی Cloud-Native
همچنین NATS از اول برای محیطهای cloud-native و containerized مثل Kubernetes ساخته شده و خیلی خوب باهاشون جور درمیاد.
📦 انعطاف در الگوهای ارتباطی
و NATS هم از Pub/Sub پشتیبانی میکنه، هم Request/Reply، هم Queue Groups. این یعنی میتونه بسته به نیاز شما مثل یک MQ ساده یا حتی یک سیستم event-driven پیچیده عمل کنه.
🔄 استفاده در سناریوهای کوتاهعمر
کافکا بیشتر برای پردازش دادههای سنگین و ذخیره طولانیمدت مناسب هست، اما NATS عالیه برای ارتباطات لحظهای (real-time communication) بین سرویسها.
https://nats.io
فلسفهی NATS اینه که حداقل پیچیدگی رو بیاره، در عین حال مقیاسپذیر و قابل اعتماد باشه.
🔹 مزیتهای NATS نسبت به Kafka
⚡️ سرعت و سبک بودن
این NATS خیلی سبکتر از Kafka هست و برای سناریوهایی که نیاز به latency پایین و سرعت بالا دارن، انتخاب بهتری محسوب میشه.
🛠 سادگی در راهاندازی
کافکا معماری پیچیدهتری داره (Zookeeper، Brokerها و ...)، درحالیکه NATS خیلی راحتتر بالا میاد و نیاز به سرویسهای جانبی نداره.
☁️ طراحی Cloud-Native
همچنین NATS از اول برای محیطهای cloud-native و containerized مثل Kubernetes ساخته شده و خیلی خوب باهاشون جور درمیاد.
📦 انعطاف در الگوهای ارتباطی
و NATS هم از Pub/Sub پشتیبانی میکنه، هم Request/Reply، هم Queue Groups. این یعنی میتونه بسته به نیاز شما مثل یک MQ ساده یا حتی یک سیستم event-driven پیچیده عمل کنه.
🔄 استفاده در سناریوهای کوتاهعمر
کافکا بیشتر برای پردازش دادههای سنگین و ذخیره طولانیمدت مناسب هست، اما NATS عالیه برای ارتباطات لحظهای (real-time communication) بین سرویسها.
https://nats.io
NATS.io
NATS is a connective technology powering modern distributed systems, unifying Cloud, On-Premise, Edge, and IoT.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥36❤🔥2
Forwarded from Armin's Notes 🪴
امروز یکم وقتم آزاد بود؛ گفتم این نوت رو بنویسم بماند به یادگار 😅
https://www.arminnotes.com/notes/topological-sort-in-data-migration
https://www.arminnotes.com/notes/topological-sort-in-data-migration
یادداشتهای آرمین
مرتبسازی توپولوژیکی؛ کاهش بیشاز 90 ساعت زمان و 3 میلیون کوئری - یادداشتهای آرمین
بهبود 99.7٪ در زمان مهاجرت دادهها با Topological Sorting — از 48 ساعت به 10 دقیقه، با صرفهجویی بیش از 3 میلیون کوئری.
❤🔥6🔥3👍2
سوال مصاحبه :
If you need to delete millions of records from a table in production database, what would you do ?
جوابش بنظرتون چیست ؟
If you need to delete millions of records from a table in production database, what would you do ?
جوابش بنظرتون چیست ؟