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