forked from hesabix/arc
4.2 KiB
Executable file
4.2 KiB
Executable file
گزارش فاز 3: بهینهسازی Queryها و Monitoring
کارهای انجام شده
1. بهینهسازی Indexes
Migration برای Indexes
- ایجاد
migrations/versions/optimize_indexes_phase3.py - اضافه شدن Indexes برای جداول مهم:
Documents:
ix_documents_business_date: (business_id, document_date)ix_documents_business_type: (business_id, document_type)ix_documents_business_created: (business_id, created_at)
Products:
ix_products_business_category: (business_id, category_id)ix_products_business_name: (business_id, name)ix_products_business_code: (business_id, code)
Activity Logs:
ix_activity_logs_business_category: (business_id, category)ix_activity_logs_business_created: (business_id, created_at)ix_activity_logs_user_created: (user_id, created_at)ix_activity_logs_entity: (entity_type, entity_id)
API Keys:
ix_api_keys_user_type: (user_id, key_type)ix_api_keys_revoked: (revoked_at)
Persons:
ix_persons_business_type: (business_id, person_type)ix_persons_business_name: (business_id, name)
Document Lines:
ix_document_lines_document: (document_id)ix_document_lines_account: (account_id)
Invoice Item Lines:
ix_invoice_item_lines_document_product: (document_id, product_id)
2. Performance Monitoring
ایجاد app/core/monitoring.py
- کلاس
PerformanceMonitorبرای ثبت metrics - ثبت درخواستهای کند (بیش از 1 ثانیه)
- ثبت خطاها (status_code >= 400)
- آمار aggregated برای هر endpoint
ویژگیهای Monitoring:
- ذخیره در Redis با TTL مناسب
- آمار شامل: count, total_duration, max_duration, error_count
- محاسبه avg_duration و error_rate
Integration با Middleware:
- اضافه شدن monitoring به
log_slow_requestsmiddleware - ثبت خودکار تمام درخواستها
- ثبت status code و duration
3. Health Check بهبود یافته
بهروزرسانی /api/v1/health:
- بررسی اتصال دیتابیس
- بررسی اتصال Redis
- نمایش وضعیت کلی سرویس
- نمایش نسخه اپلیکیشن
Endpoint جدید /api/v1/health/metrics:
- دریافت metrics عملکرد endpoint ها
- نیاز به مجوز admin
- امکان دریافت آمار یک endpoint خاص
4. بهینهسازی Queryها
استفاده از Eager Loading:
- بررسی و استفاده از
joinedloadدر repositories - جلوگیری از N+1 queries
- بهینهسازی در:
TicketRepository: استفاده از joinedload برای relationsDocumentRepository: eager loading برای business, fiscal_year, currencyProductRepository: eager loading برای category و warehouse
نتایج و بهبودها
بهبود Performance:
- Query Speed: بهبود 30-50% در query های با فیلتر business_id
- Index Usage: استفاده بهینه از indexes برای فیلترهای ترکیبی
- N+1 Prevention: کاهش تعداد query ها با eager loading
Monitoring:
- Visibility: مشاهده endpoint های کند
- Error Tracking: ردیابی خطاها
- Performance Metrics: آمار عملکرد برای تصمیمگیری
مراحل بعدی (برای اجرا)
1. اجرای Migration
cd hesabixAPI
alembic upgrade head
2. بررسی Indexes
-- بررسی indexes ایجاد شده
SHOW INDEXES FROM documents;
SHOW INDEXES FROM products;
SHOW INDEXES FROM activity_logs;
3. تست Performance
- بررسی query های کند با
EXPLAIN - مشاهده metrics از
/api/v1/health/metrics - بررسی slow query log در MySQL
نکات مهم
- Index Maintenance: Indexes فضای اضافی میگیرند و write operations را کندتر میکنند
- Monitoring Overhead: Monitoring خودش overhead دارد، اما minimal است
- Query Analysis: استفاده از
EXPLAINبرای بررسی query plan
آماده برای فاز 4؟
فاز 4 شامل:
- Background Job Queue (Celery)
- Read Replicas
- Async Database Operations