.NET分散式Orleans - 7 - Streaming

来源:https://www.cnblogs.com/chenyishi/p/18103492
-Advertisement-
Play Games

概念 在Orleans中,Streaming是一組API和功能集,它提供了一種構建、發佈和消費數據流的方式。 這些流可以是任何類型的數據,從簡單的消息到複雜的事件或數據記錄。Streaming API允許你定義、發佈和消費這些流,而無需關心底層的傳輸機制或數據存儲。 每個流都有一個唯一的標識符,稱為 ...


概念

在Orleans中,Streaming是一組API和功能集,它提供了一種構建、發佈和消費數據流的方式。

這些流可以是任何類型的數據,從簡單的消息到複雜的事件或數據記錄。Streaming API允許你定義、發佈和消費這些流,而無需關心底層的傳輸機制或數據存儲。

每個流都有一個唯一的標識符,稱為StreamId,用於區分不同的流。流可以是持久的,也可以是臨時的,具體取決於所使用的流提供者(Stream Provider)。流提供者負責處理流的存儲、傳輸和故障恢復。

作用

Streaming在Orleans中起到了至關重要的作用,主要體現在以下幾個方面:

  1. 解耦:Streaming允許將數據的產生者和消費者解耦。生產者可以發佈數據到流中,而消費者可以獨立地訂閱這些流並處理數據。這種解耦使得系統更加靈活和可擴展。

  2. 實時性:通過Streaming,你可以實時地處理和響應數據流。這對於需要實時分析、監控或響應的場景非常有用。

  3. 故障恢復:Orleans的Streaming機制具有強大的故障恢復能力。即使在出現網路分區或節點故障的情況下,流提供者也能夠確保數據的可靠性和一致性。

應用場景

  1. 實時日誌分析:你可以將應用程式的日誌消息發佈到流中,並使用專門的消費者來分析這些日誌。這允許你實時地監控和響應應用程式的行為。

  2. 事件驅動架構:在事件驅動架構中,你可以使用Streaming來發佈事件,並由多個消費者來處理這些事件。這有助於構建松耦合、可擴展和響應式的系統。

  3. 分散式協作:Streaming也可以用於實現分散式系統中的協作和通信。例如,多個節點可以發佈狀態更新到流中,其他節點可以訂閱這些流以獲取最新的狀態信息。

示例

安裝nuget包

<PackageReference Include="Microsoft.Orleans.Streaming" Version="8.0.0" />

配置Streaming

siloHostBuilder.AddMemoryStreams("StreamProvider").AddMemoryGrainStorage("PubSubStore");

定義一個Grain生成事件

public interface ISender : IGrainWithStringKey
{
    Task Send(Guid rid);
}

public class SenderGrain : Grain, ISender
{
    public Task Send(Guid rid)
    {
        var streamProvider = this.GetStreamProvider("StreamProvider");
        var streamId = StreamId.Create("RANDOMDATA", rid);
        var stream = streamProvider.GetStream<int>(streamId);
        RegisterTimer(_ =>
        {
            return stream.OnNextAsync(Random.Shared.Next());
        }, null, TimeSpan.FromMilliseconds(1_000), TimeSpan.FromMilliseconds(1_000));
        return Task.CompletedTask;
    }
}

再定義一個Grain訂閱事件

public interface IRandomReceiver : IGrainWithGuidKey
{
    Task Receive();
}

[ImplicitStreamSubscription("RANDOMDATA")]
public class ReceiverGrain : Grain, IRandomReceiver
{
    public override async Task OnActivateAsync(CancellationToken cancellationToken)
    {
        var streamProvider = this.GetStreamProvider("StreamProvider");
        var rid = this.GetPrimaryKey();
        var streamId = StreamId.Create("RANDOMDATA", rid);
        var stream = streamProvider.GetStream<int>(streamId);

        await stream.SubscribeAsync<int>(
            async (data, token) =>
            {
                Console.WriteLine(data);
                await Task.CompletedTask;
            });
        base.OnActivateAsync(cancellationToken);
    }
    public async Task Receive()
    {
            
    }
}

然後即可測試

var rid = Guid.NewGuid();
var sender1 = client.GetGrain<ISender>("sender1");
await sender1.Send(rid);
var reciver1 = client.GetGrain<IRandomReceiver>(new Guid());
await reciver1.Receive();

流提供程式

提供程式可以通過在nuget種搜索Orleans.Streaming,也可以通過PersistentStreamProvider 與 IQueueAdapter 重寫來自定義Provider

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • socket在接收數據時,經常會因為網路延遲、緩存區數據處理不及時等原因造成收到的數據是多個包黏在一起的情況。如下圖所示 圖中紅色框部分是通訊的 心跳包 圖中黃色框部分和未框選部分是 兩包 數據包 所以可見此時緩存區裡面同時存在了一個心跳包,兩個數據包 如何分包(此處僅針對幾個完整的數據包在一起的情 ...
  • 首先看完成效果 一個玩家的效果 多個玩家的效果 源碼地址 https://gitee.com/chesterdotchen/snake-with-orleans 項目介紹 Snake.Common項目 IGameGrain:游戲的Grain定義,與State定義 ISnakeGrain:蛇的Grai ...
  • 本章將和大家分享 Elasticsearch 中的數據聚合功能,通過聚合(aggregations)可以實現對文檔數據的統計、分析、運算。 ...
  • 工具類擴展 1. ILSpy 2022 (免費) ILSpy 是 ILSpy 開源反編譯器的 Visual Studio 擴展。 是一款開源、免費的、且適用於.NET平臺反編譯【C#語言編寫的程式和庫(.dll)內容】工具;可以集成在Visual Studio 開發工具中,能夠十分快捷方便的查看源代 ...
  • 前言 WPF中Window相信大家都很熟悉,有時我們有一些自定義需求預設Window是無法滿足的,比如在標題欄上放一些自己東西,這個時候我們就需要寫一個自己的Window,實現起來也很簡單,只要給Window設置一個WindowChrome.WindowChrome附加屬性就可以實現,WindowC ...
  • 前言 上文介紹瞭如何通過一個Form自定義控制項來簡化數據的錄入,並自動實現數據校驗,自動佈局排列等功能。本文繼續介紹如何優化表格控制項的使用,縮減代碼量,實現工作效率的提升。 一、功能實現 上文中分析了DataGrid跟ListView兩種表格控制項的優劣,在這裡我們選擇ListView來實現我們的表格 ...
  • gRPC是一個現代的開源高性能遠程過程調用(RPC)框架,它可以高效地連接數據中心內和跨數據中心的服務,支持負載平衡、跟蹤、運行狀況檢查和身份驗證。 gRPC通過使用 Protocol Buffers 作為數據傳輸格式,實現了在不同平臺上的通信,並支持雙向流和流式傳輸。RPC 是遠程過程調用的縮寫, ...
  • 到目前為止,Orleans7的核心概念基本已經學完,我準備使用Orleans7做一個項目實戰,來總結自己的學習效果。 項目效果 通過Orleans7來完成一個貪吃蛇游戲,要求如下: 可以多人線上玩 貪吃蛇可以上/下/左/右改方向 貪吃蛇吃完食物,身體長度+1 項目暫定架構 初步設想,此游戲包括一個O ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...