簡體   English   中英

RabbitMQ和C#

[英]RabbitMQ and C#

使用RabbitMQ有一種方法可以使用它類似於MSSMQ,其中一個可以從隊列中彈出1000條消息,然后插入數據庫並從那里繼續。

我似乎無法通過Subscription對一個頻道進行預測,然后對Subscription中的BasicDeliveryEventArgs進行預測,並使用我想要在給定時間處理的最大消息數進行If語句。

提前謝謝這仍然從隊列中獲取所有22k消息

using (IConnection connection = factory.CreateConnection())
{
    using (IModel channel = connection.CreateModel())
    {
        channel.QueueDeclare("****", true, false, false, null);

        var subscription = new Subscription(channel, "****", false);
        int maxMessages = 5;
        int i = 0;
        foreach (BasicDeliverEventArgs eventArgs in subscription)
        {
            if (++i == maxMessages)
            {
                Console.WriteLine("Took 5 messages");
                subscription.Ack(eventArgs);
                break;
            }
        }
    }
}

我假設您希望通過將組中的組合並到更大的事務中來優化將消息加載到數據庫中,而不是為每條消息承擔交易成本。 強制警告這樣做意味着大量的消息可以一起失敗,即使其中只有一個會導致問題,這就是你如何去做...

在頻道上設置QOS:

channel.BasicQos(0, 1000, false);

這將預先獲取1000條消息並阻止進一步的流量,直到您確認某事為止。 請注意,它不會以1000塊為單位進行提取。而是確保在任何時候都預取最多1000條UNACK消息。 模擬塊傳輸就像首先處理1000個消息一樣簡單,然后一次性確認它們。

請參閱此處此處獲取比我更具權威性的解釋。

還有一點:即使您沒有獲得1000條消息的配額,您也可能希望在消息可用時立即刷新隊列。 你應該能夠通過調用foreach循環中的queue.BasicGet()直到它干涸,然后將你擁有的任何東西(包括你從subscription取出的消息)傳遞到數據庫。 警告:我自己沒試過,所以我可以說垃圾,但我認為它會起作用。 這種方法的優點在於它可以立即將消息推送到數據庫中,而無需等待整批1000條消息。 如果數據庫因處理太多小事務而落后,則預取積壓將在每個周期之間填充更多。

暫無
暫無

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

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