انتقل إلى المحتوى
use-cases / cron-per-customer / hero
Multi-tenant SaaS / Per-customer scheduling

crontab منفصل لكلّ عميل، تلقائياً

تتيح SaaS الخاصّة بك لكلّ عميل جدولة توليد تقاريره. التصميم الساذج: مُجدوِل واحد مشترك، معرّف العميل في حمولة المهمّة، أصابع متشابكة لئلّا يجوّع أحدهم الآخر. تصميم Hoody يمنح كلّ مستأجر حاويته الخاصّة وخدمة hoody-cron الخاصّة به.

اقرأ التوثيق

Three lifecycle states, one HTTP API. PROVISION adds entries, cron ticks run them, DELETE suspends. Each tenant's cron lives in its own container — no shared queue, no noisy-neighbor risk.

use-cases / cron-per-customer / mechanism

مكالمة PUT واحدة تُهيّئ crontab المستأجر بالكامل

كلّ حاوية عميل تكشف API الـ HTTP لـ hoody-cron. لتحديد جدوله، تستبدل crontab بـ PUT واحد. لا طابور مشترك، لا مسار أولويّة، لا إعداد مُجدوِل تعيد نشره.

POST a managed entry — creates a cron job with UUID, enabled state, and human-readable schedule_human fieldPOST /provision
request
# POST managed entry for acme-corp tenant
POST acme-cron.hoody.com/users/root/entries
Content-Type: application/json

{
  "schedule": "0 9 * * *",
  "command": "/usr/local/bin/digest.sh",
  "comment": "daily digest",
  "enabled": true
}
response
HTTP/1.1 201 Created
Content-Type: application/json

{
  "id": "7d3f2a1b-8c4e-4f9a-b2d5",
  "schedule": "0 9 * * *",
  "schedule_human": "At 09:00",
  "enabled": true,
  "user": "root"
}
201 Created. Entry ID is returned for future PATCH or DELETE. schedule_human confirms expression was parsed correctly.

تستبدل النقطة crontab بأكمله ذرّيّاً. تُعاد القيود المحذوفة في الردّ ليتمكّن مستوى التحكّم لديك من تدقيق الانحراف. cron كلّ مستأجر يعيش داخل حاويته الخاصّة؛ لا شيء من جدول acme-corp مرئيّ لـ globex-saas، ومهمّة هاربة في حاوية لا يمكنها تجويع المُجدوِل في أخرى.

use-cases / cron-per-customer / powers

ما تفتحه crontabs المرتبطة بالحاوية

ثلاث خصائص تنبثق من التصميم مجّاناً، لأنّ العزل هو الأساس، لا ميزة كتبتها.

Fleet billing breakdownper-tenant cost = server divided by tenants
Your tenants
acme-corpSM
globex-saasMD
initech-incLG
+ 57 more
Flat-rate server / mo$29One bare-metal node. 60 containers. Bill stays flat.
÷tenants
Per-tenant cost<$0.49Drops as you add more tenants

Noisy-neighbor incidents disappear

When initech-inc's scrape.js hangs, acme-corp's 9am digest still fires. Different crontabs, different process trees, different filesystems.

Schedule changes propagate instantly

POST a new entry and the tenant's hoody-cron service picks it up immediately. No central scheduler to reload, no broadcast to send.

Per-tenant logs, one container

When globex-saas asks why their 6pm rollup ran twice, you read one container's log — not a shared scheduler grep across nine machines.

use-cases / cron-per-customer / compare

مُجدوِل مشترك مقابل crontab مرتبط بالحاوية

ثلاثة محاور يفرض فيها التصميم القديم ضرائب على فريقك، ولا يفعل تصميم Hoody.

المحورمُجدوِل مشتركمرتبط بالحاوية
العزل
tenant_id في حمل المهمةصفّ سيّئ واحد، طابور كلّ مستأجر يُحجَب
Separate /etc/crontab per containerالعَلَقات محلّيّة. دائماً.
التهيئة
INSERT INTO scheduled_jobsاقتران ترحيلات، قفل مخطّط
PUT /users/root/crontabمكالمة HTTP واحدة، استبدال ذرّيّ
التدقيق
grep tenant_id=42 logs/*9 أجهزة، ملفّ سجلّ واحد لكلّ منها
GET ctr_8a3f1c/cron/logحاوية واحدة، سجلّ واحد، حقيقة واحدة

العمود القديم هو ما يكتبه كلّ فريق أوّل مرّة يشحن جدولة متعدّدة المستأجرين. العمود الجديد هو ما تشحنه حين تمنحك المنصّة لكلّ مستأجر حاويته افتراضيّاً.

use-cases / cron-per-customer / capacity

السعة عند الأطراف

ما يفعله صندوق معدن عارٍ واحد من Hoody حين يحصل كلّ عميل على crontab الخاصّ به.

  1. مستأجرون لكلّ صندوق60

    ستّون حاوية عميل على عقدة معدن عارٍ واحدة، لكلّ منها خدمة hoody-cron تعمل. لا مُجدوِل مشترك يُشكّل عنق الزجاجة.

  2. انتشار الجدول<1s

    من طلب PUT حتى أوّل نبضة من الجدول الجديد، مُلاحظة عبر أسطول من 60 حاوية على عقدة 64-core نموذجيّة.

  3. طوابير عابرة للمستأجرين0

    حرفيّاً لا يوجد طابور مشترك أو مسار أولويّة أو خيط مُجدوِل يتنافس عليه مستأجران. العزل هو الأساس.

أرقام السعة قيم نموذجيّة مُلاحظة على عقدة معدن عارٍ 64-core / 256GB تعمل بكثافة حاويات Hoody القياسيّة. السعة الفعليّة تتوقّف على ميزانيّات CPU والذاكرة لكلّ مستأجر وعلى ما تفعله كلّ مهمّة cron. الصفر في الطوابير العابرة للمستأجرين بنيويّ، ليس قياساً.

use-cases / cron-per-customer / punchline

cron عميل لا يستطيع تجويع cron عميل آخر لأنّهما ليسا على نفس crontab.

قبل / مُجدوِل مشتركبعد / مرتبط بالحاوية
مشتركscheduled_jobs WHERE tenant_id = 42صفّ واحد في جدول يقرأ منه الجميع
لكلّ مستأجرPUT acme-cron.hoody.com/users/root/crontabمكالمة HTTP واحدة، حاوية واحدة، crontab واحد
اقرأ API الـ cron
use-cases / cron-per-customer / replaces

ما يحلّ محلّه

البِنى التي تشيّدها الفرق لمشاركة crontab واحد بين المستأجرين. Hoody يضع كلّ مستأجر في crontab الخاصّ به — لا موجّه، لا طابور إنصاف، لا جار مزعج.

  • crontabs متعدّدة المستأجرين مشتركةتعبير regex سيّئ يجوّع 400 عميل
  • عزل مستأجرين مخصّصمُجدوِل بـ tenant_id على كلّ صفّ
  • Postgres pg_cronمرتبط بقاعدة البيانات؛ ترقية واحدة وينكسر الجميع
  • Quartz scheduler مع مرشّحاتJVM وطابور مُجزّأ لكلّ منطقة
  • طوابير المستأجرين في Sidekiqاثنا عشر طابوراً، اثنا عشر ملفّ إعداد
  • Kubernetes CronJobs لكلّ مستأجرnamespace، دور RBAC، YAML، مناوب
use-cases / cron-per-customer / cta

كفّ عن كتابة tenant_id في كلّ مكان. امنح كلّ عميل حاويته الخاصّة ودع cron يفعل ما يفعله cron دائماً، في عزلة.

اقرأ التوثيق
use-cases / cron-per-customer / related

اقرأ الآخرين