Hi,

I'm using Postfix with the pipe transport to deliver mail to an internal application. The transport map is set to forward all messages destined to *@*.pagerduty.com to the application.

This usually works really well, but we occasionally have fairness problems where a sudden burst of messages received nearly simultaneously for one address monopolize our pool of delivery agents. This creates high delivery latencies for messages to other addresses that arrive just after the burst. It looks like Postfix maintains a single delivery queue for all messages due for processing by our application.

What I'd like to do is have Postfix maintain separate delivery queues for each address, and then cycle round-robin through those queues as delivery agents become available.

In other words, if I get burst of 100 emails to "a...@acme.pagerduty.com", and then 5 seconds later (before we've been able to process all of those messages), we receive a single message to "b...@foobar.pagerduty.com", I'd like that single message to b@ to be assigned to the first available transport agent, even though a pure FIFO delivery strategy would have it processed only after we've finished with all 100 a@ messages.

Is this possible? We've sort of been faking it so far by adjusting the transport_destination_concurrency_limit and the max number of transport processes, but it would be better if we could set the queueing to work per-address rather than for the whole transport.

Here's some relevant bits from my Postfix config:

(From the transport map)
/^.*@.*\.pagerduty\.com$/               pagerduty:

(From main.cf)
pagerduty_destination_recipient_limit = 1
pagerduty_destination_concurrency_limit = 1

(From master.cf)
pagerduty unix  -       n       n       -       2       pipe
user=www-data:www-data argv=/opt/ruby-enterprise/bin/ruby /u/apps/ pagerduty/current/lib/parse_email.rb $recipient


Thanks,


Andrew

Reply via email to