簡體   English   中英

RabbitMQ在WCF Web服務中,模型用法和性能

[英]RabbitMQ in a WCF webservice, model usage and performance

我需要在IIS中托管的C#WCF Web服務中調用RabbitMQ RPC服務。 我們有這個工作正常,但作為一個優秀的小士兵我正在閱讀RabbitMQ客戶端文檔,它聲明以下“IModel不應該在線程之間共享”

我的理解是,在RabbitMQ中, IModel實際上是一個套接字連接。 這意味着對於每次調用,WCF服務都需要創建一個IModel並在完成后處理它。

在我看來,這在性能和套接字使用方面有點過分,我想知道我的理解是否實際上是正確的,或者是否有其他選項可用,比如在線程之間使用IModel連接池。

我們將非常感激地收到任何建議。 這是我在下面使用的代碼的示例,RabbitMQ連接實際上是在Global.asax中初始化的,我只是在那里你可以看到用法。

        var connectionFactory = new ConnectionFactory();
        connectionFactory.HostName = "SampleHostName";
        connectionFactory.UserName = "SampleUserName";
        connectionFactory.Password = "SamplePassword";
        IConnection connection = connectionFactory.CreateConnection();
        // Code below is what we actually have in the service method.
        var model = connection.CreateModel();
        using (model)
        {
            model.ExchangeDeclare("SampleExchangeName", ExchangeType.Direct, false);
            model.QueueDeclare("SampleQueueName", false, false, false, null);
            model.QueueBind("SampleQueueName", "SampleExchangeName", "routingKey" , null);
            // Do stuff, like post messages to queues
        }

IModel實際上是一個套接字連接

這是不正確的。 IConnection表示連接:)引入模型是為了允許多個客戶端使用相同的tcp連接。 因此,模型是“物理”連接的“邏輯”連接。

Model所做的任務之一是拆分和重新組裝大型消息。 如果消息超過一定大小,則將其拆分為幀,標記幀並由接收器組裝回來。 現在,想象一下,2個線程發送大量消息......幀號將被搞砸,你最終將得到Frankenstein消息,其中包含2個消息的隨機部分。

你是正確的假設模型創建有一些成本。 客戶端向服務器發送請求以創建模型,服務器在內存中為此模型創建結構,並將模型ID發送回客戶端。 它是通過已打開的tcp連接完成的,因此不會因建立連接而產生開銷。 但由於網絡往返,仍然存在一些開銷。

我不確定WCF綁定,但base rabbit的.net庫不為模型提供任何池。 如果你的情況有問題,你必須自己想出一些東西。

每個會話都需要一個IModel對象。 這對於基於網絡的API來說非常正常。 例如,Azure表存儲客戶端完全相同。 為什么,你不能擁有一個運行多個並發通信流的單個通道。

我希望發生一定程度的緩存(例如DNS),這將減少創建后續IModel實例的開銷。

使用Azure表做同樣的事情時,性能是可以的,所以IModel應該完全沒問題。 只有當你能證明自己有真正的需要時才嘗試優化這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM