あなたが探していることをする多くの製品があります。 Djangoの経験を持つ人は、おそらく "セロリ"と言うでしょうが、それは完全な答えではありません。 Celeryは実際のキューイングシステムを包む(有用な)ラッパーであり、ラッパーを使用しても、基本的なテクノロジーについて考える必要はありません。
ZeroMQ、Redis、およびRabbitMQは、いくつかの異なる解決策です。もちろん、もっと多くのオプションがあります。私はかなりのキューイングの解決策はあなたの "任意のプロデューサのためにいつでも処理されているメッセージが1つ以上でなければならない"という設定パラメータとしての要件をサポートしないことを確信しています。プロデューサでこの要件を実装する必要があります(つまり、ジョブ#1が完了したという確認を受け取るまで、ジョブ#2を送信しないでください)。
Redisは実際のキューイングシステムではありませんが、pub/sub機能を備えた非常に高速なデータベースです。 Redis pub/subを使用して「ジョブが一度だけ処理されました」という要件を満たすことはできませんが、Redis pub/subを使用して単一のサブスクライバにジョブを発行してから、リスト(貧しい人の列)。あなたの消費者は、リストから仕事をアトミックに引き出します。あなたがこのルートに行きたいなら、それはうまくいくでしょう。
RabbitMQはエンタープライズのキューイングシステムであり、あなたの要件を完全に満たすことができますが、RabbitMQサーバをどこかに配置する必要があり、過度の負荷になる可能性があります。記録のために、私はRabbitMQを多数のプロジェクトで使用しています。 「直接」型交換をセットアップし、それを単一のキューにバインドし、すべてのコンシューマをこのキューにサブスクライブします。あなたはRabbitMQでもかなり良い持続性を得ます。
ZeroMQは非常に柔軟性の高いキューイングモデルを備えており、ZeroMQはあなたの望むことを絶対に行うことができます。 ZeroMQは基本的には転送メカニズムですが、パブリッシャーとサブスクライバー、そしてブローカーにそれらを配布させることになると、あなた自身がロールバックしてしまうかもしれません。
[セロリ](http://celeryproject.org/) – jterrace