首頁 後端開發 C#.Net教程 C#實作非同步訊息佇列

C#實作非同步訊息佇列

Dec 27, 2016 pm 02:31 PM

訊息佇列

 

訊息佇列(英文:Message queue)是一種進程間通訊或同一進程的不同執行緒間的通訊方式,軟體的貯列用來處理一系列的輸入,通常是來自使用者。訊息佇列提供了非同步的通訊協議,每一個貯列中的紀錄包含詳細說明的資料,包含發生的時間,輸入裝置的種類,以及特定的輸入參數,也就是說:訊息的發送者和接收者不需要同時與訊息隊列互交。訊息會保存在佇列中,直到接收者取回它。

 

簡單的說隊列就是貯存了我們需要處理的Command但是並不是及時的拿到其處理結果;

 

實現

 

實際上,訊息隊列中通常保存在鍊錶。擁有權限的進程可以寫入或讀取訊息佇列到訊息佇列中。

 

目前,有許多訊息佇列有許多開源的實現,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、Apache Qpid和HTTPSQS。

優點,缺點

訊息佇列本身是異步的,它允許接收者在訊息發送很長時間後再取回訊息,這和大多數通訊協定是不同的。例如WWW中使用的HTTP協定是同步的,因為客戶端在發出請求後必須等待伺服器回應。然而,很多情況下我們需要異步的通訊協定。例如,一個進程通知另一個進程發生了一個事件,但不需要等待回應。但訊息隊列的非同步特點,也造成了一個缺點,就是接收者必須輪詢訊息隊列,才能收到最近的訊息。

和訊號相比,訊息佇列能夠傳遞更多的訊息。與管道相比,訊息佇列提供了有格式的數據,這可以減少開發人員的工作量。但訊息隊列仍然有大小限制。

讀取佇列訊息

主要有兩種(1)服務端的推;(2)客戶端的拉;

拉:主要是客戶端定時輪詢拿走訊息處理;

推:透過事件訂閱方式主動通知訂閱者進行處理;

訊息的貯存

簡單的是透過記憶體鍊錶實現貯存;也可以藉助DB,例如Redis;還可以持久到本地文件中;

如何保證非同步處理的一致性

儘管佇列主要目的是實現訊息貯存,同時將呼叫與實現非同步化。但如果想達到處理訊息一致性,好的方式是區別業務處理順序,例如操作主從DB,主負責寫,從負責讀,我們沒有機會在寫之後立刻從讀資料庫拿到你想要的結果;同時我們需要藉助中間狀態,當多個中間狀態同時符合呼叫結果才到到業務時間被處理,否則將「異常訊息」持久化,待下次操作;

上程式碼

建立訊息對立核心隊列

{    public delegate void MessageQueueEventNotifyHandler(Message.BaseMessage message);
 
    public class MessageQueue:Queue<BaseMessage>
    {
        public static MessageQueue GlobalQueue = new MessageQueue();
 
        private Timer timer = new Timer();
        public MessageQueue() {
            this.timer.Interval = 5000;
            this.timer.Elapsed += Notify;
            this.timer.Enabled = true;
        }
        private void Notify(object sender, ElapsedEventArgs e) {
            lock (this) {
                if (this.Count > 0) {
                    //this.messageNotifyEvent.GetInvocationList()[0].DynamicInvoke(this.Dequeue());
                    var message = this.Dequeue();
                    this.messageNotifyEvent(message);
                }
            }
        }
 
        private MessageQueueEventNotifyHandler messageNotifyEvent;
        public event MessageQueueEventNotifyHandler MessageNotifyEvent {
            add {
                this.messageNotifyEvent += value;
            }
 
            remove {
                if (this.messageNotifyEvent != null) {
                    this.messageNotifyEvent -= value;
                }
            }
        }
    }
}
登入後複製

事件處理

public const string OrderCodePrefix = "P";        public void Submit(Message.BaseMessage message)
        {
            Order order = message.Body as Order;
 
            if (order.OrderCode.StartsWith(OrderCodePrefix))
            {
                System.Console.WriteLine("这个是个正确的以({0})开头的订单:{1}", OrderCodePrefix,order.OrderCode);
            }
            else {
                System.Console.WriteLine("这个是个错误的订单,没有以({0})开头:{1}",OrderCodePrefix,order.OrderCode);
            }
        }
登入後複製

可依據具體業務進行個性化處理;

 

透過Proxy向隊列追加訊息

public class OrderServiceProxy:IOrderService    {
        public void Submit(Message.BaseMessage message)
        {
            MessageQueue.MessageQueue.GlobalQueue.Enqueue(message);
        }
    }
登入後複製

客戶端綁定,同時達到了訊息異步化的目的,希望更細緻的拓展用到後期的專案中。

 以上就是C#實作非同步訊息佇列的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 序列化 C# 序列化 Sep 03, 2024 pm 03:30 PM

C# 序列化指南。這裡我們分別討論C#序列化物件的介紹、步驟、工作原理和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

See all articles