В итоге выбрал редис: проще конфигурировать и планируется пока небольшое кол-во сообщений. Запустили пару месяцев назад, пока исходную версию не пришлось править. Для клиента взял StackExchange.Redis - удобное api.Как работает:
Обработчик подписывается через механизм pub\sub слушать сообщения с определенным ключом. Когда клиент хочет послать таск на обработку, то dto с данными таска кладется в "очередь", реализованную через List в редисе. DTO кладется через команду listLeftPush. После этого делается publish сообщения, которое подхватывают все подписчики. Подписчик, получив сообщение, проверяет "очередь", используя listRightPop. Если вернулся не null, то запускается поток с обработкой таска. listRightPop - атомарная операция: если один из подписчиков получил таск из очереди, то остальные точно его не получат - это исключает возможность коллизии.
Важно, что через pub\sub передаются только уведомления о том, что нужно проверить "очередь" на наличие новых тасков. Механизм pub\sub не гарантирует доставку сообщения. Используя list для очереди мы сводим к минимуму возможность потери таска (только в случае отключения самого редис).
C редис работаем через консоль с помощью redis-cli, пока этого хватает.
Было интересно это настраивать с нуля, я думаю, что по мере добавления новых задач модуль будет дорабатываться и усложняться. Ну и наступим, конечно, на какие-нибудь грабли:) Пока что несколько месяцев все работает без проблем.