Rate limiters can be configured to ensure that some or all requestors can not overload the server by issuing requests too frequently. ## Example The following JSON is an example for this standardized configuration component: ```json ``` ## Definition The rate limiter control consists of two sets of control: - slots: define the numeric limits. - elements: define the criteria to apply a rate limiter for. ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://invantive.com/schemas/defs/RateLimitControl.schema.json", "title": "RateLimitControl", "description": "Specification of rate limit control.", "type": "object", "additionalProperties": false, "properties": { "RateLimitControlList": { "type": ["array", "null"], "items": { "$ref": "./RateLimitControlElement.schema.json" }, "description": "Ordered list of Rate Limit Controls. First one to apply is used." }, "RateLimitControlSlotList": { "type": ["array", "null"], "items": { "$ref": "./RateLimitControlSlot.schema.json" }, "description": "Set of Rate Limit Control Slots." } } } ``` ## `RateLimitControlElement` An element specifies the applicable rate limiters. Each rate limiter can refer to an existing slot with centralizes the actual limits. ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://invantive.com/schemas/defs/RateLimitControlElement.schema.json", "title": "RateLimitControlElement", "type": "object", "description": "Specification of a rate limit control element.", "additionalProperties": false, "properties": { "Description": { "type": ["string", "null"], "description": "Optional description identifying the rate limit control element." }, "Context": { "type": ["string", "null"], "description": "Optional context limiting the applicability of the rate limit control element. * at the end is a wildcard." }, "Url": { "type": ["string", "null"], "description": "Optional URL. * at the end is a wildcard.", "format": "uri" }, "SlotName": { "type": ["string", "null"], "description": "Name of slot." }, "ValidFromUtc": { "type": ["string", "null"], "format": "date-time", "description": "Start of validity (UTC). Outside of this period the rate limit control element is not enforced." }, "ValidToUtc": { "type": ["string", "null"], "format": "date-time", "description": "End of validity (UTC). Outside of this period the rate limit control element is not enforced." }, "LogOnCode": { "type": ["string", "null"], "description": "Log on code." }, "DataContainerId": { "type": ["string", "null"], "description": "Data container ID." }, "IpAddressClientCidr": { "type": ["string", "null"], "description": "IP address of the client device in CIDR notation (1.2.3.4/5)." } } } ``` ## `RateLimitControlSlot` The slots are defined on a second, minute and hour time window. Each time window specifies: - Maximum number of actions. - Delay in milliseconds per request when limit is exceeded. - Whether to fail when limit is exceeded. ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://invantive.com/schemas/defs/RateLimitControlSlot.schema.json", "title": "RateLimitControlSlot", "type": "object", "additionalProperties": false, "properties": { "Description": { "type": ["string", "null"], "description": "Optional description identifying the rate limit slot." }, "Name": { "type": ["string", "null"], "description": "Name." }, "ActionsPerSecond": { "type": ["integer", "null"], "description": "Maximum number of actions per second; reset on every second switch." }, "ActionsPerMinute": { "type": ["integer", "null"], "description": "Maximum number of actions per minute; reset on every minute switch." }, "ActionsPerHour": { "type": ["integer", "null"], "description": "Maximum number of actions per hour; reset on every hour switch." }, "DelayMsOnOverflowSecond": { "type": ["integer", "null"], "description": "Number of milliseconds to delay an answer when the second level rate limited is exceeded." }, "DelayMsOnOverflowMinute": { "type": ["integer", "null"], "description": "Number of milliseconds to delay an answer when the minute level rate limited is exceeded." }, "DelayMsOnOverflowHour": { "type": ["integer", "null"], "description": "Number of milliseconds to delay an answer when the hour level rate limited is exceeded." }, "FailOnOverflowSecond": { "type": "boolean", "description": "Whether to fail on an overflow on the second level rate limit.", "default": true }, "FailOnOverflowMinute": { "type": "boolean", "description": "Whether to fail on an overflow on the minute level rate limit.", "default": true }, "FailOnOverflowHour": { "type": "boolean", "description": "Whether to fail on an overflow on the hour level rate limit.", "default": true } } } ```