پرش به محتوا
مستندات
EN
ورود به پنل
شروع
  • نقشهٔ مستندات
  • راه‌اندازی سریع
  • مفهوم‌ها
جمع‌آوری داده
  • تعریف رویداد
  • فرهنگ‌نامهٔ رویدادها
  • گذاشتن رویداد
  • ادغام هویت
  • SDK وب
  • SDK اندروید
  • ثبت دستگاه
  • سرور به سرور
  • کاتالوگ محصولات
  • وب‌هوک
مخاطب و پیام‌رسانی
  • سگمنت
  • سناریو
  • پیام تراکنشی
  • رضایت و سقف
  • پیام درون‌برنامه‌ای
تحلیل و خروجی
  • گزارش و خروجی
مرجع توسعه‌دهنده
  • مرجع API
    • نقاط ورود داده
    • API مدیریتی
  • کدهای خطا
  • سقف‌ها
  • OpenAPI
ابزارهای توسعه
  • سرور MCP
  • کار با عامل
حریم خصوصی و تغییرات
  • داده‌های شخصی
  • نسخه و تغییرها

سقف‌ها و محدودیت نرخ

هر عددی که سرور به آن پایبند است، و اینکه کدام‌یک را می‌شود در زمان اجرا از خود سرور پرسید.

هر عددی که در این صفحه هست از همان کدی می‌آید که اعمالش می‌کند. هرجا یک سقف به‌جای رد کردن، داده شما را کوتاه می‌کند، همان‌جا صریح گفته شده است، چون کوتاه شدن بی‌صدا همان خرابی‌ای است که ماه‌ها بعد از یک گزارش بی‌معنی می‌فهمید.

#سقف‌ها را از سرور بخوانید

مسیر GET /v1/capabilities پنج تا از این عددها را در زمان اجرا منتشر می‌کند. یک واحد بودجه خرج دارد و هیچ مجوزی نمی‌خواهد.

Shell
curl -s https://api.segmentic.net/v1/capabilities \
  -H "Authorization: Bearer sk_seg_..."
JSON
{
  "version": "v1",
  "features": {
    "segments": true,
    "campaigns": true,
    "analytics": true,
    "transactional": true,
    "export": true,
    "import": true,
    "journeys": true,
    "ingest": true,
    "async_exports": true,
    "campaign_approval": true
  },
  "limits": {
    "max_page_size": 100,
    "max_preview_rows": 100,
    "max_batch_size": 500,
    "estimate_sample": 100,
    "query_timeout_sec": 30
  }
}

مقدارهای max_page_size و max_batch_size را از همین‌جا بخوانید، نه اینکه ۱۰۰ و ۵۰۰ را در کد بنویسید. هر پرچم در features می‌گوید همین استقرار در عمل چه چیزی سرو می‌کند، پس نصب خودمیزبانی که موتور تحلیل ندارد "analytics": false می‌دهد و کلاینت شما می‌تواند موقع بالا آمدن شکست بخورد به‌جای وسط کار.

چهار هشدار درباره این پاسخ، هر چهار چیزی که خواننده فرض می‌گیرد و نباید بگیرد.

  • مقدارهای max_preview_rows و estimate_sample روی میزبان مدیریتی هیچ‌چیز را محدود نمی‌کنند. مال دو نقطه در پنل‌اند که اینجا ثبت نشده‌اند. نادیده بگیریدشان.
  • مقدار query_timeout_sec برابر ۳۰ است و مهلت خواندن‌ها و نوشتن‌ها و POST /v1/audiences/count است. مهلتی که دو مسیر گزارش استفاده می‌کنند نیست، آن ۴۵ ثانیه است. مهلت‌ها را ببینید.
  • کلیدهای ingest و import یک بولین‌اند با دو اسم، همانی که POST /v1/events را روشن می‌کند.
  • پرچم export هیچ مسیری را روی این میزبان کنترل نمی‌کند. دو مسیر خروجی را async_exports روشن و خاموش می‌کند. حسابی که "export": false می‌بیند ممکن است هر دو مسیر خروجی را داشته باشد، و برعکس. برای خروجی به async_exports نگاه کنید.

بقیه چیزهای این صفحه را ناچارید در کد بنویسید، چون جایی برای خواندنشان نیست. نه GET /v1/reports/limits وجود دارد و نه نقطه‌ای که سقف رویداد حساب شما یا مصرف فعلی‌اش را بگوید.

#سقف‌های ورود داده

این‌ها روی هر دو در اعمال می‌شوند: میزبان ورود داده، و POST /v1/events روی میزبان مدیریتی.

سقفمقدارروی چهوقتی رد شود
طول نام رویداد128 bytesفیلد event در trackرد می‌کند، event_name_too_long
طول شناسه256 bytesuser_id و anonymous_id و message_idرد می‌کند، id_too_long
طول شناسه نشست256 bytescontext.session_idبی‌صدا کوتاه می‌کند
شناسه قبلیبدون سقفprevious_id در aliasفقط وجودش بررسی می‌شود، هرگز طولش
کلید ویژگی128 bytesهر کلید، بعد از نرمال‌سازیبی‌صدا کوتاه می‌کند
مقدار ویژگی8192 bytesهر مقدار رشته‌ایبی‌صدا کوتاه می‌کند
تعداد ویژگی در رویداد256properties۲۵۶ تای اول را نگه می‌دارد، too_many_properties
تعداد ویژگی در identify256traits۲۵۶ تای اول را نگه می‌دارد، too_many_traits
تعداد رویداد در دسته500POST /v1/batch و POST /v1/eventsرد می‌کند، batch_too_large
بدنه درخواست5 MiBکل درخواست روی میزبان ورود دادهرد می‌کند، ۴۱۳
نشانی صفحه2048 bytescontext.page.url و .path و .referrerبی‌صدا کوتاه می‌کند
بدنه وب‌هوک1 MiBPOST /v1/hooks/{source}/{token}رد می‌کند
گزارش برگشتی1 MiBPOST /v1/bounce/{local}رد می‌کند، ۴۱۳

فقط یکی از این‌ها کلید پیکربندی دارد. کلید MAX_BODY_BYTES سقف بدنه را می‌گذارد و پیش‌فرضش 5242880 است. بقیه در کد کامپایل شده‌اند، پس نصب خودمیزبان هم نمی‌تواند بالاترشان ببرد.

ترتیب مهم است. رد کردن قبل از کوتاه کردن رخ می‌دهد و کوتاه کردن قبل از ذخیره، پس رویدادی با user_id سیصدبایتی کامل رد می‌شود، نه اینکه با شناسه کوتاه‌شده ذخیره شود.

#سقف‌های بی‌صدا

هر فیلد دیگری داخل context بدون هیچ هشدار و هیچ خطایی کوتاه می‌شود. اینجا آورده شده‌اند چون راه دیگر فهمیدنشان این است که یک سگمنت آدم‌هایی را که انتظار داشتید نگیرد.

بایتفیلدها
8ویژگی currency، با حروف بزرگ
16context.device.push_provider
32context.locale و context.device.type و context.os.name و context.os.version و context.library.version، و نسخه مرورگر که از User-Agent درمی‌آید
64context.timezone و context.ip و context.app.version و context.device.manufacturer و context.network.carrier و context.library.name و context.location.country و context.location.region و context.location.city و context.campaign.variant_id، و نام مرورگر و سازنده دستگاه که از User-Agent درمی‌آیند
128context.device.model و context.campaign.token و هر پنج فیلد utm: source و medium و name و term و content
256context.session_id و context.campaign.message_id
512context.page.title، و خود هدر User-Agent

کشور و استان و شهر و عنوان صفحه و هر نام رویداد پیش از کوتاه شدن از نرمال‌سازی فارسی هم رد می‌شوند، پس ی و ک عربی به ی و ک فارسی تبدیل می‌شوند. همین است که می‌گذارد سگمنت روی city = تهران مشتری‌هایی را بگیرد که اپ‌هایشان سر املا با هم اختلاف دارند.

اگر مقداری برای یک سگمنت یا یک گزارش مهم است، خودتان داخل این کرانه‌ها نگهش دارید.

#پنجره زمانی رویداد

هر رویداد timestamp خودش را دارد. اینکه چقدر می‌تواند به عقب برسد، نگهداشت رویداد حساب خودتان است، نه یک ثابت.

تنظیممقداررفتار
پنجره پیش‌فرض گذشته۳۰ روزکف. حسابی که نگهداشتش ۳۰ روز است هم همان ۳۰ روز کامل را می‌گیرد
پنجره آینده۱ ساعتجلوتر از این، به زمان دریافت چسبانده و timestamp_in_future هشدار داده می‌شود
نگهداشت روی «برای همیشه»۳۶۵۰ روزده سال، که با وجود اسمش متناهی است تا زمان ۱۹۷۰ از یک ساعت خراب همچنان رد شود. پنجره پیش‌فرض حسابی است که هرگز صفحه نگهداشت را باز نکرده

در ورود داده زنده، زمانی قدیمی‌تر از پنجره به لبه پنجره چسبانده می‌شود و رویداد با هشدار timestamp_too_old پذیرفته می‌شود. رد نمی‌شود.

این تنها رفتار پلتفرم است که بیشترین احتمال را دارد یک هفته از شما بگیرد. پیش‌تر همان ۳۰ روز کل پنجره بود، هرچه نگهداشت شما می‌گفت، و نشانه‌اش نامرئی بود: حسابی که دو سال تاریخچه را مهاجرت می‌داد، هر رویداد قدیمی‌تر از سی روز را بی‌صدا درست روی «سی روز پیش» می‌دید، پذیرفته‌شده با یک هشدار و کد ۲۰۰. هیچ‌چیز شکست نخورد. داده فقط غلط بود، همه‌اش روی یک زمان تلنبار، و اولین نشانه‌اش ماه‌ها بعد قیفی بود که هیچ معنی نمی‌داد. حالا پنجره از سیاست نگهداشت شما می‌آید، همان چیزی که این چسباندن همیشه ادعا می‌کرد اعمالش می‌کند.

خواندن نگهداشت یک دقیقه کش می‌شود و وقتی خوانده نشود نرم به ۳۰ روز برمی‌گردد.

در backfill همین شرط به‌جای چسباندن رد می‌کند، با timestamp_too_old، چون در backfill جابه‌جا کردن یک زمان بدتر از رد کردنش است. سطر backfill که هیچ زمانی نداشته باشد هم رد می‌شود.

پنجره‌ای که از نگهداشت می‌آید فقط روی میزبان ورود داده اعمال می‌شود. مسیر POST /v1/events روی میزبان مدیریتی سیاست حساب شما را نمی‌خواند و همیشه همان پیش‌فرض ۳۰ روز را می‌گیرد، چون گزینه‌هایش را بدون MaxPast می‌سازد. هر رویداد قدیمی‌تر از سی روز که از این در بفرستید بی‌صدا روی «سی روز پیش» می‌نشیند و ۲۰۰ می‌گیرد، و پاسخ هیچ هشداری هم ندارد چون این مسیر هشدارها را دور می‌ریزد. تاریخچه را هرگز از اینجا مهاجرت ندهید. وارد کردن رویداد در پنل به‌جای چسباندن رد می‌کند، و رد کردن همان چیزی است که مهاجرت لازم دارد.

#نگهداشت پنجره ورود است، نه عمر داده

این دو عدد یکی نیستند و اشتباه گرفتنشان گران است. سیاست نگهداشت تا ۳۶۵۰ روز اعتبارسنجی می‌شود و کف غیرصفرش ۳۰ روز است. ولی جدول رویدادها در کلیک‌هاوس یک TTL ثابت چهارصد روزه روی event_time دارد که به سیاست حساب کار ندارد و هر سطری را می‌اندازد.

پس نگهداشت ده ساله را می‌شود ذخیره کرد و در عمل هیچ رویدادی بیشتر از چهارصد روز از زمان خودش زنده نمی‌ماند. سیاست فقط می‌گوید چه زمانی را موقع ورود می‌پذیریم و کی زودتر از چهارصد روز پاک می‌شود؛ بالا بردنش عمر داده را زیاد نمی‌کند.

اگر تاریخچه بلندتر از چهارصد روز لازم دارید، پیش از رسیدن به آن مرز خودتان خروجی بگیرید. جای دیگری برای گرفتنش نیست.

#سقف‌های میزبان مدیریتی

سقفمقدارروی چه
بدنه درخواست8 MiBبیشتر مسیرها
بدنه درخواست256 KiBPOST /v1/messages
بدنه درخواست1 MiBPOST /v1/audiences/validate و POST /v1/audiences/count و دو مسیر گزارش
بیشترین اندازه صفحه100هر مسیر فهرست
اندازه صفحه پیش‌فرض25هر مسیر فهرست
نوع خروجیevents و messages و profiles و segmentPOST /v1/exports
قالب خروجیپیش‌فرض ndjson، تنها جایگزین csvPOST /v1/exports
عمر فایل خروجی۷ روزدر بدنه ۲۰۲ با expires_after_hours: 168 منتشر می‌شود

سه سقف مختلف بدنه اشتباهی نیست که کسی درستش کرده باشد. مسیر POST /v1/messages سهمش 256 KiB است چون payload تراکنشی یک شناسه قالب است و چند متغیر، و آن چهار مسیری که هندلر پنل را قرض می‌گیرند همان 1 MiB هندلر را می‌گیرند.

#صفحه‌بندی

پارامتر limit بریده می‌شود، هرگز رد نمی‌شود. مقدار limit=500 به شما ۱۰۰ می‌دهد. مقدارهای limit=0 و limit=banana هر دو ۲۵ می‌دهند. خطایی نمی‌گیرید که سقف را بگوید؛ آن را از GET /v1/capabilities بخوانید.

کرسر یک رشته مبهم base64url است. کرسری که دیکد نشود بی‌صدا ابتدای فهرست فرض می‌شود، نه خطا، پس کلاینتی که کرسرش را خراب کند تا ابد روی صفحه یک می‌چرخد به‌جای اینکه شکست بخورد. شناسه‌هایی را که می‌گیرید با آنچه دارید مقایسه کنید.

مسیر GET /v1/exports پارامتر limit را می‌گیرد ولی هرگز کرسر برنمی‌گرداند. پاسخش {"data":[...],"has_more":false} است و has_more حتی وقتی کار بیشتری هست هم false است. هیچ راهی برای رفتن به صفحه بعد نیست. بیشترین مقدار یعنی ۱۰۰ را بخواهید و همان را کل فهرست بدانید.

مسیرهای GET /v1/segments و GET /v1/campaigns با شکل خود هندلر پنل جواب می‌دهند، یعنی {"segments":[...]} و {"campaigns":[...]}، نه با پاکت صفحه‌بندی. شکل data و next_cursor فقط روی GET /v1/exports ظاهر می‌شود.

هر دوی آن دو مسیر در خود SQL روی ۲۰۰ سطر بریده شده‌اند: دویست سگمنتی که تازه‌تر از همه به‌روز شده‌اند، و دویست کمپینی که تازه‌تر از همه به‌روز شده‌اند. سقف بی‌صداست. نه has_more هست، نه next_cursor، نه شمارشی، نه هشداری، و ?limit= و ?cursor= هم اینجا خوانده نمی‌شوند. حسابی که ۲۵۰ سگمنت دارد دویست‌تا را می‌بیند و روی هیچ سطحی راهی به آن ۵۰ تای دیگر ندارد، حتی در پنل. اگر کتابخانه شما از این عدد بگذرد، فهرست خودتان را جای دیگری نگه دارید و شناسه را مستقیم به GET /v1/segments/{id} بدهید.

#سقف‌های گزارش

برای POST /v1/reports/funnel و POST /v1/reports/retention.

سقفمقدارچه چیزی را می‌بندد
بازه زمانی۷۳۰ روزگسترده‌ترین پنجره‌ای که این دو گزارش اسکن می‌کنند. دو سال برای یک حساب بزرگ همین حالا صدها میلیارد سطر است
مراحل قیف۱۲برای هر مرحله یک شرط ساخته می‌شود و آدم باید نتیجه را بخواند
دوره‌های ماندگاری۶۰تعداد ستون‌های جدولی که کسی باید بخواند. اگر صفر یا کمتر بفرستید ۳۰ می‌شود
فیلتر در هر گزارش۱۰
طول کلید ویژگی۱۲۸
طول نام رویداد۲۵۶
طول مقدار ویژگی۵۱۲
عمق مسیر۸گزارش مسیرها، که روی این میزبان نیست
سطرهای مسیر۱۰۰گزارش مسیرها، که روی این میزبان نیست

هر کدام از این خرابی‌ها با یک کد برمی‌گردد، invalid_report. پشت آن یک کد سیزده خطای اعتبارسنجی متمایز هست و هیچ راه برنامه‌ای برای جدا کردنشان. نه تای آن‌ها جمله فارسی کاتالوگ را در error می‌گذارند؛ چهار سطر پایینی این جدول، یعنی طول نام رویداد و تعداد فیلتر و طول کلید ویژگی و طول مقدار ویژگی، از شاخه پیش‌فرض رد می‌شوند و متن انگلیسی خود خطا را می‌آورند، مثل analytics: too many filters. اگر لازم دارید روی رشته تطبیق بدهید، و بپذیرید که نه رشته قرارداد است و نه زبانش.

گزارش مسیرها وجود دارد ولی فقط روی mux پنل ثبت شده است. با کلید API دسترس‌پذیر نیست.

#سقف‌های مخاطب و سگمنت

این‌ها تعریفی را می‌بندند که به POST /v1/audiences/validate و POST /v1/audiences/count و POST /v1/segments و PUT /v1/segments/{id} می‌فرستید.

سقفمقدارمتن خطا
عمق تودرتویی۸segment: nesting too deep
تعداد شرط۲۰۰segment: too many conditions
مقدار در یک فهرست۱۰۰۰segment: list has too many values
طول کلید ویژگی۱۲۸

شمارش شرط‌ها گزاره‌های روی ویژگی رویداد را هم شامل می‌شود، نه فقط گره‌های درخت منطقی، پس تعریفی که روی صفحه بیست شرط به نظر می‌رسد می‌تواند اینجا خیلی بیشتر از صد باشد. هر چهارتا با کد filter_invalid و وضعیت ۴۲۲ و جمله خود کامپایلر به‌عنوان متن بیرون می‌آیند.

قبل از ذخیره اعتبارسنجی کنید. مسیر POST /v1/audiences/validate تعریف را بدون دست زدن به پایگاه داده کامپایل می‌کند، یک واحد بودجه خرج دارد، و به‌جای ۲۰۰ با valid: false که پنل می‌دهد، ۴۲۲ می‌دهد.

#سقف‌های ارسال تراکنشی

سقفمقدارکلید پیکربندی
متغیر در هر پیام۴۰ندارد
قالب کلید idempotency^[A-Za-z0-9._:-]{8,200}$ندارد
عمر کلید idempotency۷ روزAPI_IDEMPOTENCY_RETENTION، پیش‌فرض 168h
مهلت رزرو مانده۱ دقیقهAPI_STALE_RESERVATION
بدنه درخواست256 KiBندارد

قالب کلید به‌عمد سخت‌گیر است. کلید بخشی از شناسه پیام می‌شود، و شناسه پیام در دفتر و شمارنده تعداد و مرجع خود ارائه‌دهنده نوشته می‌شود، پس کلیدی که خط جدید یا گیومه داشته باشد راه درازی می‌رفت تا جایی بالاخره ردش کند. شناسه پیام مشتق است نه ساخته‌شده: t<tenant_id>.<کلید شما>، پس یک کلید تا آخر خط همان شناسه را می‌سازد.

فیلد category وقتی نفرستیدش transactional می‌شود. مقدار marketing با ۴۰۰ مستقیم رد می‌شود. این نقطه سقف تعداد و ساعت سکوت را دور می‌زند، پس قبول کردن پیام بازاریابی اینجا یعنی به شما یک راه مستند برای دور زدن قواعد ارسال خودتان بدهیم، و اولین باری که مهم می‌شد یک پیامک تبلیغاتی ساعت سه بامداد به کل فهرست بود.

#بودجه درخواست

هر مسیر میزبان مدیریتی به‌جز GET /v1/status با واحد وزن‌دار سنجیده می‌شود. «درخواست در دقیقه» واحد غلطی است برای سطحی که یک فراخوانی‌اش یک ساختار را می‌خواند و فراخوانی بعدی‌اش یک انبار داده را اسکن می‌کند.

کلاسوزنیعنی چه
ساده1چیزی نمی‌خواند، یا یک سطر با کلید اصلی می‌خواند
کوئری5یک کوئری کران‌دار روی انبار داده
سنگین25اسکنی که هزینه‌اش با تاریخچه شما بزرگ می‌شود

هزینه هر مسیر:

مسیرهزینهمجوز
GET /v1/whoami1ندارد
GET /v1/capabilities1ندارد
GET /v1/schema/events5event.read
GET /v1/schema/traits5event.read
POST /v1/audiences/validate1segment.read
POST /v1/audiences/count25segment.read
GET /v1/segments1segment.read
GET /v1/segments/{id}1segment.read
POST /v1/segments1segment.write
PUT /v1/segments/{id}1segment.write
DELETE /v1/segments/{id}1segment.delete
GET /v1/campaigns1campaign.read
GET /v1/campaigns/{id}5campaign.read
POST /v1/campaigns1campaign.write
PUT /v1/campaigns/{id}/recurrence1campaign.send
DELETE /v1/campaigns/{id}/recurrence1campaign.send
POST /v1/campaigns/{id}/send1campaign.send
POST /v1/campaigns/{id}/submit1campaign.write
POST /v1/events5profile.write
GET /v1/exports1data.export
POST /v1/exports25data.export
POST /v1/reports/funnel25analytics.read
POST /v1/reports/retention25analytics.read
POST /v1/messages1campaign.send

ساز و کارش:

ویژگیمقدار
سهمیه پیش‌فرض600 واحد در دقیقه، از PUBLIC_API_BUDGET_PER_MINUTE
الگوریتمپنجره ثابت، یک رفت و برگشت به ردیس
پنجرهیک دقیقه ساعت دیواری، نه دقیقه غلتان
دامنهبه ازای هر کلید API، نه هر حساب
جهت خرابیبسته شکست می‌خورد. ردیس در دسترس نباشد یعنی ۵۰۳ با budget_unavailable
زمان برداشتقبل از اجرای هندلر، و حتی وقتی هندلر بعدش شکست بخورد هم برداشته می‌شود

۶۰۰ واحد کم‌وبیش یعنی دو دوجین گزارش سنگین در دقیقه، یا ششصد فراخوانی ارزان. دقیقش: ۲۴ فراخوانی سنگین می‌گذرد و بیست‌وپنجمی رد می‌شود.

بودجه برخلاف محدودیت نرخ پایین‌تر، به کلید API کلید خورده است نه به حساب، و این عمدی است. شما یک کلید باریک به یک ایجنت می‌دهید و کلید یکپارچه‌سازی خودتان را جدا نگه می‌دارید، و ایجنتی که در حلقه افتاده نباید بتواند بودجه‌ای را که خط سفارش شما به آن وابسته است تمام کند. MCP را ببینید.

هزینه POST /v1/messages برابر ۱ است، که برای فراخوانی‌ای که می‌تواند به گوشی یک آدم پیام بفرستد غلط به نظر می‌رسد. غلط نیست: هزینه آن فراخوانی از نظر کوئری ناچیز است و از نظر پیامد عظیم، و چیزی که قرار بود بندش بزند بودجه گیرنده است، که وجود ندارد. آنچه سقف ندارد را ببینید.

روی بودجه هیچ هدر X-RateLimit-* وجود ندارد. نه روی پاسخ‌های رد و نه روی پاسخ‌های موفق. مسیر GET /v1/whoami هم بودجه باقی‌مانده را نمی‌گوید. نمی‌توانید ببینید چقدر نزدیک شده‌اید: یا خرج خودتان را از جدول بالا بشمارید، یا ۴۲۹ را مدیریت کنید.

تنها راه برگشت زمان است. کلید ردیس ۷۰ ثانیه بعد از اولین برداشت در آن پنجره منقضی می‌شود و سطل دقیقه با ساعت دیواری می‌چرخد. نه نقطه‌ای برای صفر کردن هست، نه بازنویسی به ازای کلید، و نه راهی برای بالا بردن سهمیه جز عوض کردن متغیر محیطی و ری‌استارت پروسه.

درخواست ردشده یک حساب قفل‌شده همچنان واحد بودجه‌اش را خرج می‌کند، چون بررسی قفل بعد از برداشت بودجه اجرا می‌شود.

#محدودیت نرخ ارسال تراکنشی

ساز و کار دومی که به‌کلی جداست. به‌جای واحد هزینه، درخواست می‌شمارد، دامنه‌اش حساب است نه کلید، و در جهت مخالف شکست می‌خورد.

ویژگیمقدار
روی چه اعمال می‌شودفقط POST /v1/messages و هیچ‌چیز دیگر
الگوریتمپنجره ثابت، با INCR ردیس
پنجرهیک دقیقه ساعت دیواری
دامنهبه ازای هر حساب. چرخاندن کلید سهمیه تازه نمی‌خرد
منبع سقففیلد api_rate_per_minute خود حساب شما، روی هر درخواست و بدون کش خوانده می‌شود
پیش‌فرضAPI_RATE_PER_MINUTE، که با مقدار 0 منتشر شده است
مقدار 0 یعنیاندازه‌گیری به‌کلی خاموش. این پیش‌فرض منتشرشده است
جهت خرابیباز شکست می‌خورد. ردیس در دسترس نباشد یعنی فراخوانی رد می‌شود جلو

به‌عمد باز شکست می‌خورد، و دلیلش ترافیکی است که حمل می‌کند. این نقطه رسید سفارش و کد ورود می‌فرستد. رد کردن همه‌شان چون یک کش پایین است، خرابی ما را تبدیل می‌کند به شکست خوردن پرداخت مشتری شما. محدودیت نرخ هست که جلوی یکپارچه‌سازی در حال فرار را بگیرد، و آن مشکلی است که دیر رسیدن به آن می‌ارزد.

چون پنجره ثابت است، یک فراخوان می‌تواند سر مرز دو پنجره، دو پنجره پیام بفرستد. برای سقفی که کارش متوقف کردن یک حلقه فراری است نه اندازه‌گیری تک‌تک درخواست‌ها، این معامله درستی است.

وقتی سقفی تنظیم شده باشد، دو هدر روی هر پاسخ می‌آیند، حتی پاسخ‌های موفق، تا بتوانید قبل از رد شدن آهسته کنید.

HTTP
HTTP/1.1 200 OK
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 9
Content-Type: application/json; charset=utf-8

مقدار X-RateLimit-Remaining هرگز منفی نمی‌شود. هدر X-RateLimit-Reset و هدر X-RateLimit-Resource وجود ندارند. با پیش‌فرض منتشرشده که صفر است، هیچ هدری فرستاده نمی‌شود.

میزبان ورود داده هیچ محدودکننده نرخی ندارد. تنها کنترل‌های حجمش سقف بدنه، سقف دسته و دروازه سهمیه‌اند.

#سهمیه

سهمیه سقف پلن است که روی یک ماه جلالی شمرده می‌شود.

سنجهچه می‌شمارد
eventsهرچه کالکتور پذیرفته، از جمله تکراری‌های زدوده‌شده
profilesبیشترین تعداد آدم شناسایی‌شده در دوره، نه جمعشان
messages.email و messages.sms و messages.push و messages.web و messages.inappارسال‌ها، یک سنجه برای هر کانال
messages.messengerبله و ایتا و روبیکا با هم در یک سنجه

رویدادها فقط بعد از پذیرفته شدن سنجیده می‌شوند، پس payload ردشده صورتحساب نمی‌شود و تلاش دوباره تکراری‌زدایی‌شده هم نمی‌شود. SDK ای که دوباره می‌فرستد برای ما یک جست‌وجوی ردیس خرج دارد، نه یک خط فاکتور که سرش با ما دعوا کنید. پیام‌ها فقط روی ارسال موفق سنجیده می‌شوند.

پلن دو سقف سخت دارد، max_events و max_messages، که از سهمیه شامل جدا هستند. صفر یعنی بی‌سقف: مازاد صورتحساب می‌شود و همه‌چیز کار می‌کند. رد شدن از سهمیه شامل، پول خرج دارد و یک فاکتور است. رد شدن از سقف، شما را متوقف می‌کند و یک قطعی است.

فقط سقف رویداد اعمال می‌شود. هیچ مسیر کدی سنجه پیام را در برابر max_messages بررسی نمی‌کند، پس quota_message_cap هرگز رخ نمی‌دهد. این فیلد تعریف شده، اعتبارسنجی شده، روی فاکتور چاپ می‌شود، و هیچ‌جا اعمال نمی‌شود.

وقتی به سقف برسید چه می‌شود:

  • درخواست کامل با ۴۰۲ رد می‌شود، هرگز نیم‌بند پذیرفته نمی‌شود. پذیرش جزئی شما را ناتوان می‌گذاشت از اینکه بفهمید کدام رویدادها را دوباره بفرستید، و به هر حال از سقف رد شده‌اید.
  • بررسی یک بار برای کل دسته اجرا می‌شود، پیش از هر کار قلم‌به‌قلم.
  • هر SDK دسته‌ای را که نگه داشته دور می‌ریزد، چون هر سه هر ۴xx به‌جز ۴۲۹ را دائمی می‌شمارند. آن رویدادها رفته‌اند.
  • تلاش دوباره تا کسی پول ندهد هیچ‌چیز را عوض نمی‌کند.

حکم سهمیه ۱۵ ثانیه به ازای هر حساب کش می‌شود، پس می‌توانید به اندازه هرچه در آن پنجره بفرستید از سقف بزنید بیرون. دروازه باز هم شکست می‌خورد: اگر خواندن اشتراک یا مصرف خطا بدهد، ترافیک پذیرفته می‌شود.

دوره یک ماه جلالی است نه میلادی، و روزهای داخلش به وقت محلی تهران شمرده می‌شوند. دوره درست همان‌جا تمام می‌شود که دوره بعد شروع می‌شود، پس هیچ لحظه‌ای بین دو دوره نمی‌افتد.

اعلان‌ها، که چیزی را رد نمی‌کنند، روی ۳۰۰ و ۱۵۰ و ۱۲۵ و ۱۰۰ و ۸۰ درصد سهمیه شامل رخ می‌دهند، هر ماه جلالی یک بار برای هر سنجه.

#قفل نرم

یک کنترل مالی است، نه محدودیت نرخ.

محرکآستانه
فاکتور سررسیدگذشتهفاکتور صادرشده‌ای که دست‌کم ۷۵ روز از سررسیدش گذشته باشد. اعلام واریز خلعش می‌کند
مصرفپرونده‌ها یا رویدادها روی ۳۰۰ درصد سهمیه شامل یا بالاتر

اول سررسید بررسی می‌شود. حکم ۶۰ ثانیه به ازای هر حساب کش می‌شود و روی هر مسیری که نتواند بخواند، باز شکست می‌خورد. عدد پرونده‌ها تا یک ساعت عقب است، چون یک کار پس‌زمینه می‌نویسدش.

درست چهار مسیر میزبان مدیریتی را می‌بندد: GET /v1/exports و POST /v1/exports و POST /v1/reports/funnel و POST /v1/reports/retention.

بقیه به‌عمد باز می‌مانند: ورود داده، ارسال تراکنشی، ساخت کمپین، ارسال کمپین، و نوشتن سگمنت. سوراخ در داده شما را بعدها نمی‌شود پر کرد و بدهی را بعدها می‌شود وصول کرد.

همین قفل همان دو خانواده را در پنل هم می‌بندد. قفلی که یک نوع اعتبارنامه رعایتش کند و نوع دیگر نکند قفل نیست، یک دور زدن است، و آن دور زدن فاصله‌اش تا شما یک اسکریپت است.

#مهلت‌ها

فراخوانیسقف سمت سرور
GET /v1/whoami و GET /v1/capabilities و GET /v1/statusهیچ کار پایگاه داده ندارند
هر خواندن، هر نوشتن، POST /v1/audiences/count، POST /v1/messages30 s، مهلت کوئری
POST /v1/reports/funnel و POST /v1/reports/retentionهندلر 45 s می‌دهد، ولی شنونده پاسخ را سر 30 s می‌برد
هر فراخوانی روی میزبان مدیریتیWriteTimeout 30 s، ReadTimeout 15 s، ReadHeaderTimeout 5 s
هر فراخوانی روی میزبان ورود دادهWriteTimeout 30 s، ReadTimeout 15 s، IdleTimeout 120 s

سطر گزارش‌ها یک تناقض واقعی است، نه اختلاف گردکردن. قیفی که بین ۳۰ و ۴۵ ثانیه طول بکشد را سرور HTTP می‌برد، نه هندلر، پس به‌جای یک خطای تمیز یک پاسخ ناقص می‌بینید. بازه زمانی یا تعداد مراحل را کم کنید.

مهلت ۳۵ ثانیه روی کلاینت هر سقفی که اینجا هست را پوشش می‌دهد. بالاتر رفتن چیزی به شما نمی‌دهد، چون شنونده به هر حال سر ۳۰ ثانیه اتصال را می‌بندد.

#آنچه سقف ندارد

هرکدام از این‌ها سقفی است که خواننده انتظار دارد پیدا کند. هیچ‌کدامشان وجود ندارد.

  • سقفی روی تعداد نام رویداد یا کلید ویژگی متمایز نیست. مقدارهای max_properties و max_traits یک payload را می‌بندند، نه اسکیمای شما را. می‌توانید ده هزار نام رویداد متمایز بسازید و هیچ‌چیز جلویتان را نمی‌گیرد. هیچ‌چیز هم مفیدشان نمی‌کند.
  • سقف سطر روی خروجی نیست. مسیر POST /v1/exports سه فیلد kind و format و spec می‌گیرد، و نه max_rows دارد، نه سقف سمت سرور، و نه expected_count روی کار.
  • محدودیت نرخ به ازای IP هیچ‌جای محصول نیست. نه روی میزبان ورود داده و نه روی میزبان مدیریتی.
  • بودجه گیرنده نیست. هیچ‌چیز نمی‌شمارد که یک کلید در روز به چند نفر می‌تواند بفرستد، و برای همین POST /v1/messages یک واحد بودجه خرج دارد و با صد هزار فراخوانی می‌تواند به صد هزار گوشی برسد. خودتان بندش را بگذارید.
  • سقف پیام اعمال نمی‌شود. بالاتر گفته شد.
  • نقطه import روی میزبان مدیریتی نیست. وارد کردن CSV قابلیت پنل است، با سقف ۵۰۰۰۰۰ سطر و ۶۴ مگابایت، و API ندارد.
  • هدر Accept-Language خوانده نمی‌شود. هیچ‌کدام از دو میزبان نمی‌خوانندش. متن سهمیه و قفل همیشه فارسی است.

مرتبط: کدهای خطا، API ورود داده، API مدیریتی.

قبلیکدهای خطابعدیOpenAPI

در این صفحه

  • سقف‌ها را از سرور بخوانید
  • سقف‌های ورود داده
  • پنجره زمانی رویداد
  • سقف‌های میزبان مدیریتی
  • سقف‌های گزارش
  • سقف‌های مخاطب و سگمنت
  • سقف‌های ارسال تراکنشی
  • بودجه درخواست
  • محدودیت نرخ ارسال تراکنشی
  • سهمیه
  • قفل نرم
  • مهلت‌ها
  • آنچه سقف ندارد

سگمنتیک

این صفحه از روی کد نوشته شده است