mirror of
https://github.com/KumoCorp/kumomta.git
synced 2026-08-19 08:01:07 +00:00
5a1999a1b1
These allow performing arbitrary rate limiting operations at both reception time and when messages are moved from the scheduled queue and into the ready queue. refs: https://github.com/KumoCorp/kumomta/issues/149
55 lines
1.6 KiB
Markdown
55 lines
1.6 KiB
Markdown
# `kumo.on('throttle_insert_ready_queue', function(message))`
|
|
|
|
{{since('dev')}}
|
|
|
|
This event is triggered when a message is ready to move from its
|
|
containing scheduled queue and into a ready queue.
|
|
|
|
Its purpose is to allow you to evaluate any throttles defined by
|
|
your policy; see [kumo.make_throttle()](../kumo/make_throttle.md) for more
|
|
information on throttles.
|
|
|
|
Multiple instances of the `throttle_insert_ready_queue` event can be registered,
|
|
and they will be called in the order in which they were registered,
|
|
until all registered events are called, or until one explicitly
|
|
returns `nil` to signal that no more should be triggered.
|
|
|
|
The example below will limit each tenant to send no more than `1000` messages
|
|
per hour:
|
|
|
|
```lua
|
|
kumo.on('throttle_insert_ready_queue', function(msg)
|
|
-- limit each tenant to 1000/hr
|
|
local tenant = msg:get_meta 'tenant'
|
|
local throttle = kumo.make_throttle(
|
|
string.format('tenant-send-limit-%s', tenant),
|
|
'1000/hr'
|
|
)
|
|
throttle:delay_message_if_throttled(msg)
|
|
end)
|
|
```
|
|
|
|
This example allows each tenant to have an individual limit; you could
|
|
load the limits from a data file or database if you prefer.
|
|
|
|
```lua
|
|
local function per_tenant_throttle(tenant_name)
|
|
-- default to 1000/hr unless otherwise overridden
|
|
local rate = '1000/hr'
|
|
if tenant_name == 'tenant_1' then
|
|
-- Allow increased rate for this tenant
|
|
rate = '10000/hr'
|
|
end
|
|
return kumo.make_throttle(
|
|
string.format('tenant-send-limit-%s', tenant_name),
|
|
rate
|
|
)
|
|
end
|
|
|
|
kumo.on('throttle_insert_ready_queue', function(msg)
|
|
local tenant = msg:get_meta 'tenant'
|
|
local throttle = per_tenant_throttle(tenant)
|
|
throttle:delay_message_if_throttled(msg)
|
|
end)
|
|
```
|