16
ConnectionFactory factory = new ConnectionFactory {HostName = "localhost"};

using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
    channel.QueueDeclare("hello", false, false, false, null);
    for (int i = 0; i < 100000; i++)
    {
        MemoryStream stream = new MemoryStream();

        var user = new User 
                       {
                           Id = i
                       };

        Serializer.Serialize(stream, user);


        channel.BasicPublish("", "hello", null, stream.ToArray());

    }

}

上記のコードがあり、スレッドセーフに興味があります。

よくわかりませんが、ConnectionFactoryスレッドセーフだと思います。しかし、IConnectionスレッドセーフですか?リクエストごとに接続を作成する必要がありますか? それとも、単一の永続的な接続ですか? チャネル ( IModel) はどうでしょうか。

また、接続を ThreadLocal として保存する必要がありますか? または、リクエストごとに接続を作成する必要がありますか?

4

1 に答える 1

42

IConnectionはスレッドセーフですが、IModelはそうではありません。通常、アプリケーションの存続期間中は接続を開いたままにしておくように努める必要があります。これは、メッセージを受信するためにオープン接続を必要とするコンシューマーがある場合に特に当てはまります。ネットワークまたはブローカーの障害が原因で中断された接続を検出して回復することが重要です。VidelaとWilliamsによる「RabbitMQinAction」、特に第6章「失敗に耐えるコードの記述」を読むことをお勧めします。

今恥知らずなプラグのために。私は、RabbitMQ用の高レベルの.NETAPIであるEasyNetQの作成者です。それはあなたのためにすべての接続管理を行い、ネットワークまたはブローカーの停止があった場合、すべてのサブスクライバーを自動的に再接続して再構築します。また、すぐに使用できるクラスターとフェイルオーバーのサポートも提供します。試してみる。

于 2012-10-09T09:59:17.967 に答える