پرسش‌های فنی متداول

«اقدامات برنامه‌ریزی‌شده دقیقاً در زمانی که انتظار می‌رفت اجرا نمی‌شوند»

در پلتفرم Odoo.sh، ما نمی‌توانیم زمان اجرای دقیقی را برای اقدامات برنامه‌ریزی‌شده تضمین کنیم.

این به این دلیل است که ممکن است چندین مشتری روی یک سرور وجود داشته باشد و ما باید سهم منصفانه‌ای از سرور را برای هر مشتری تضمین کنیم. بنابراین اقدامات برنامه‌ریزی‌شده کمی متفاوت از یک سرور Odoo معمولی پیاده‌سازی شده‌اند و طبق سیاست best effort اجرا می‌شوند.

هشدار

انتظار نداشته باشید که اقدامات برنامه‌ریزی‌شده بیش از هر ۵ دقیقه یک‌بار اجرا شوند.

آیا «بهترین روش‌هایی» در مورد اقدامات برنامه‌ریزی‌شده وجود دارد؟

Odoo.sh همیشه زمان اجرای اقدامات برنامه‌ریزی‌شده (*aka* crons) را محدود می‌کند. بنابراین، باید این واقعیت را هنگام توسعهٔ cronهای خود در نظر داشته باشید.

ما توصیه می‌کنیم که:

  • اقدامات برنامه‌ریزی‌شده شما باید روی دسته‌های کوچکی از رکوردها کار کنند.

  • اقدامات برنامه‌ریزی‌شدهٔ شما باید پس از پردازش هر دسته، کار خود را commit کنند؛ به این ترتیب اگر به دلیل محدودیت زمانی متوقف شوند، نیازی به شروع از ابتدا نیست.

  • اقدامات برنامه‌ریزی‌شدهٔ شما باید idempotent باشند: نباید در صورت آغاز بیش از حد انتظار، side-effect ایجاد کنند.

چگونه می‌توانم هنگام تغییر آدرس IP، وظایف را خودکار کنم؟

Odoo.sh تغییرات آدرس IP را به مدیران پروژه اطلاع می‌دهد. علاوه بر این، هنگامی که آدرس IP یک نمونهٔ تولیدی تغییر می‌کند، یک درخواست HTTP GET به مسیر /_odoo.sh/ip-change ارسال می‌شود که آدرس IP جدید به‌عنوان پارامتر query string (new) به همراه آدرس IP قبلی به‌عنوان پارامتر اضافی (old) گنجانده می‌شود.

این مکانیزم به اقدامات سفارشی اجازه می‌دهد در پاسخ به تغییر آدرس IP اعمال شوند (مثلاً ارسال ایمیل، تماس با یک firewall API، پیکربندی object‌های پایگاه داده و غیره).

به دلایل امنیتی، مسیر /_odoo.sh/ip-change فقط به‌صورت داخلی توسط خود پلتفرم قابل دسترسی است و در صورت دسترسی از طریق هر روش دیگر، پاسخ 403 بازمی‌گرداند.

در ادامه یک نمونه پیاده‌سازی شِبه‌کد آمده است:

class IPChangeController(http.Controller):

    @http.route('/_odoo.sh/ip-change', auth='public')
    def ip_change(self, old=None, new=None):
        _logger.info("IP address changed from %s to %s", old, new)
        # Then perform whatever action required for your use case, e.g., update an
        # ir.config_parameter, send an email, contact an external firewall service's API, ...
        return 'ok'