讓DotnetCore.CAP和SignalR接力數據推送

DotnetCore.CAP是一款用於實現數據最終一致性的開源方案,SignalR是微軟ASP.NET/ASP.NET Core體系下的實時數據傳輸解決方案,兩種技術看起來沒什麼交集,但具體的業務讓兩者能夠相互聯繫在一起。


DotnetCore.CAP的基礎實現是將數據庫和消息隊列連接起來,通過數據的發佈/訂閱實現不同數據源之間的最終一致性,其優勢是數據的可靠傳輸(利用了消息隊列的優勢,但也不敢說100%可靠)和應用環境的多樣性(消息隊列支持kafka\rabbitmq\azure等,數據庫支持sqlserver\mysql\mongodb等)。不過DotnetCore.CAP的使用場景一般都是重量級的客戶端,貌似不能直接將數據推送到Web頁面。

SignalR的基礎實現是根據網絡環境自動切換長連接、輪詢或WebSocket來實現數據的實時傳輸,基本使用方法也是發佈/訂閱模式,其優勢是數據的實時傳輸和對Web應用的友好支持,最重要是微軟親兒子,跟ASP.NET Core的融合度高。但SignalR對數據的可靠性並沒有太高的保障,而且高併發的能力跟消息隊列相比還是有差距的。

可以說DotnetCore.CAP和SignalR是連通數據的不同通道,正如同鐵路和公路,各有優勢。將兩者結合到一起的目的是將消息隊列作爲數據傳輸的主幹道,SignalR解決數據傳輸的”最後一公里“,DotnetCore.CAP負責將消息隊列和SignalR 連接到一起。

1.DotnetCore.CAP

1.1.安裝配置

使用Nuget管理器爲ASP.NET Core項目安裝DotNetCore.CAP.Kafka和DotNetCore.CAP.MySql,已包含核心庫DotNetCore.CAP。

打開Startup.cs文件進行配置。在ConfigureServices方法中添加代碼配置數據庫及消息隊列連接字符串。

  services.AddCap(x =>
  {
      x.UseMySql(_appConfiguration["ConnectionStrings:Default"]);
      x.UseKafka(_appConfiguration["MQ:Host"]);
      x.UseDashboard();
  });

在Configure方法中添加代碼啓用數據面板。

	app.UseCapDashboard();

1.2.訂閱/發佈數據

新建ASP.NET Core MVC控制器MessageController,注入DotNetCore.CAP的發佈服務,此外以Attribute屬性的形式定義訂閱數據的方法。

    public class MessageController : Controller
    {
        private readonly ICapPublisher _publisher;
        public MessageController(ICapPublisher publisher)
        {
            _publisher = publisher;
        }

        [NonAction]
        [CapSubscribe(”TopicName“,Group =”GroupName“)]
        public void DataSubscribe(string message)
        {
            try
            {
                Logger.Info(message);
                //你的業務邏輯代碼
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
            }

        }
}

2.SignalR

2.1.安裝配置

使用NuGet管理器爲ASP.NET Core項目安裝Microsoft.AspNetCore.SignalR。

打開Startup.cs文件進行配置。

在ConfigureServices方法中添加代碼設置SignalR基本配置。

	services.AddSignalR();

在Configure方法中配置集線器路由。

      app.UseEndpoints(endpoints =>
      {
          endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
  			//SignalR路由
          endpoints.MapHub<MessageHub>("/messagebus");
      });

2.2.訂閱/發佈數據

新增集線器類MessageHub,繼承自Microsoft.AspNetCore.SignalR.Hub。

    public class MessageHub : Hub
    {
        public MessageHub()
        {
        }
	}

回到MessageController,注入SignalR服務。

    private readonly ICapPublisher _publisher;
    private readonly IHubContext<MessageHub> _hubContext;
    public MessageController(ICapPublisher publisher,IHubContext<MessageHub> hubContext)
    {
        _publisher = publisher;
        _hubContext = hubContext;
    }

修改訂閱數據的方法。

    [NonAction]
    [CapSubscribe(”TopicName“,Group =”GroupName“)]
    public void DataSubscribe(string message)
    {
        try
        {
            Logger.Info(message);
            //你的業務邏輯代碼
    		_hubContext.Clients.All.SendAsync("ReceiveData", message)
        }
        catch (Exception ex)
        {
            Logger.Error(ex.Message);
        }
    }

同樣的也可以將DotNetCore.CAP的數據發佈服務注入到SignalR集線器類中,實現數據發佈。

   private readonly ICapPublisher _publisher;
        
   public MessageHub(ICapPublisher publisher)
   {
       _publisher = publisher;
   }

   public void PublishData(string message)
   {
       _publisher.Publish("TopicName", message);
   }

這裏實際上只用到DotNetCore.CAP的一部分功能,有點不務正業,但是這部分確實好用就拿來了。此外DotNetCore.CAP和SignalR的訂閱/發佈功能都能以服務的形式單獨使用,與更復雜的業務相融合更具優勢。

這樣數據的訂閱和發佈就形成了閉環,數據的傳輸通道打通了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章