| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- """Runtime configuration for Tencent real-time control."""
- from __future__ import annotations
- import os
- from dataclasses import dataclass
- from decimal import Decimal
- @dataclass(frozen=True)
- class RealtimeControlConfig:
- start_hour: int = 12
- stop_hour: int = 21
- poll_seconds: int = 600
- high_cpm: Decimal = Decimal("250")
- low_cpm: Decimal = Decimal("190")
- bid_up_ratio: Decimal = Decimal("1.05")
- inventory_refresh_minutes: int = 60
- max_partition_lag_hours: int = 2
- lock_name: str = "tencent_realtime_control"
- next_delivery_hour: int = 6
- @classmethod
- def from_env(cls) -> "RealtimeControlConfig":
- config = cls(
- start_hour=int(os.getenv("RTC_START_HOUR", "12")),
- stop_hour=int(os.getenv("RTC_STOP_HOUR", "21")),
- poll_seconds=int(os.getenv("RTC_POLL_SECONDS", "600")),
- high_cpm=Decimal(os.getenv("RTC_HIGH_CPM", "250")),
- low_cpm=Decimal(os.getenv("RTC_LOW_CPM", "190")),
- bid_up_ratio=Decimal(os.getenv("RTC_BID_UP_RATIO", "1.05")),
- inventory_refresh_minutes=int(
- os.getenv("RTC_INVENTORY_REFRESH_MINUTES", "60")
- ),
- max_partition_lag_hours=int(
- os.getenv("RTC_MAX_PARTITION_LAG_HOURS", "2")
- ),
- lock_name=os.getenv(
- "RTC_DB_LOCK_NAME", "tencent_realtime_control"
- ).strip(),
- next_delivery_hour=int(
- os.getenv("RTC_COMMAND_NEXT_DELIVERY_HOUR", "6")
- ),
- )
- if not 0 <= config.start_hour < config.stop_hour <= 23:
- raise ValueError("RTC hours must satisfy 0 <= start < stop <= 23")
- if config.poll_seconds < 60:
- raise ValueError("RTC_POLL_SECONDS must be at least 60")
- if config.low_cpm >= config.high_cpm:
- raise ValueError("RTC_LOW_CPM must be lower than RTC_HIGH_CPM")
- if config.bid_up_ratio <= 1:
- raise ValueError("RTC_BID_UP_RATIO must be greater than 1")
- if config.inventory_refresh_minutes < 5:
- raise ValueError("RTC_INVENTORY_REFRESH_MINUTES must be at least 5")
- if config.max_partition_lag_hours < 1:
- raise ValueError("RTC_MAX_PARTITION_LAG_HOURS must be at least 1")
- if not config.lock_name:
- raise ValueError("RTC_DB_LOCK_NAME must not be empty")
- if not 0 <= config.next_delivery_hour <= 23:
- raise ValueError("RTC_COMMAND_NEXT_DELIVERY_HOUR must be in [0, 23]")
- return config
|