一步一步來熟悉Akka.Net(一)
標簽(空格分隔): .netcore 分布式
一、不利flag
好久沒寫過文章了,翻開前幾年寫的博客,看到有兩個目標“代碼生成器”和“文件隱身”。說起來並不是太難的東西,難產到現在還沒有出來。還有之前定的學習計划--先學習spring boot,再熟悉spring cloud,再這些基礎上,再去.net環境上去尋找完善更適合的解決方案。不過學完spring boot以后,由於一些原因cloud就沒繼續熟悉了。
所以,先有足夠的時間和動力來實現執行力,再來說目標吧。
二、並行運算
近些日子,遇到一個工作中的場景:將A系統的一些表同步到B系統內。因涉及到數據整合,老版寫的就是按部就班的分頁查詢,然后調用B系統的整合數據接口整合數據,整個同步速度是相當慢的。后來改成了分頁查詢的數據先丟到消息隊列,然后多開幾個消費端去並行處理,速度翻了幾十倍甚至上百倍。當然B系統也優化去掉一些查詢,把能提前的查詢都放到了消息隊列之前,這樣能提高消費速度。
作為一個有追求的人,這樣的結果是十分欣喜的。當然如果批量式的查詢后,批量式的把數據整理后,批量式的提交數據庫操作,速度會更加提升上百倍或千倍以上,但時間有限,牽扯部分太廣,目前處理速度和業務量能應付的來,優化到此為止,思考卻不會停止。
三、面向未來思考
此處說明下,A是業務系統,B是營銷系統。A系統的任何更新都會通知到B系統,B系統聚合數據,然后做出營銷動作,所以B系統的動作處理時間是比A系統的更新數據時間要長的,如果A系統有大批量導入或頻繁更新,B系統是很難在短時間內處理掉的。所以思考方向是:A系統積累一批更新如一分鍾內,再由消息隊列通知B系統,B系統批量處理這些通知。
*舊版
A系統->B系統: A單條數據的任何修改通知B
*思考版
A系統->B系統: A單條數據的修改積累到一批再通知B
以上思路,依賴HttpRuntime或Redis都能實現。但似乎要考慮加鎖的問題,不太好。
上述廢話那么多,是為了講述一個問題點。有了這個點,在熟悉分布式框架的過程中,有參考匹配價值,不會過於迷茫。
來了解下Akka.Net
Akka.Net是用於設計跨越處理器核心和網絡的可擴展的彈性系統,它允許您專注於滿足業務需求,而不是編寫低級代碼以提供可靠的行為,容錯性和高性能。Akka.NET利用參與者模型來提供抽象級別,使得編寫正確的並發,並行和分布式系統變得更加容易。Actor模型跨越了Akka.NET庫的集合,為您提供了一個理解和使用它們的一致方式。
什么是Actor模型
Actor基本特征是他們將世界建模為通過顯式消息傳遞相互通信的有狀態實體。
作為計算實體,Actor有這些特征:
*他們使用異步消息傳遞來取代方法調用
*他們能管理自己的狀態
*當回復一個消息時,他們能:
>創建其他的Actor
>發送消息給其他的Actor
>停止Actors或他們自己。
注意
由於Akka.NET強制實施家長監督,因此每位演員都受到監督,並且(可能)是其子女的監督人,因此建議您熟悉演員系統和監督與監督,並且還可以幫助閱讀演員參考,路徑和地址。
更詳細的說明文檔請跳轉官方網站。
下面開始擼代碼。
示例代碼
*vs新建控制台項目
*Nuget安裝 Akka
*代碼(截圖太麻煩,都放到一個文件里去了)
using Akka.Actor;
using System;
namespace DemoAkka.Simple
{
class Program
{
static void Main(string[] args)
{
var system = ActorSystem.Create("MySystem");
var greeter = system.ActorOf<GreeActor>("Student");
while (true)
{
var i = Math.Abs(Guid.NewGuid().GetHashCode());
greeter.Tell(new GreeMessage()
{
MsgId = i,
RealName = $"Real{i}"
});
var key = Console.ReadLine();
if (key == "exit")
{
break;
}
}
}
}
/// <summary>
/// Actor,可接收消息處理。
/// </summary>
public class GreeActor : ReceiveActor
{
public GreeActor()
{
Receive<GreeMessage>(greet =>
{
Console.WriteLine($"{DateTime.Now}---MsgId:{greet.MsgId},RealName:{greet.RealName}");
});
}
}
/// <summary>
/// 用於傳遞消息的實體。
/// </summary>
public class GreeMessage
{
public long MsgId { get; set; }
public string RealName { get; set; }
}
}
*運行效果(輸入各種字符,消息傳遞到Actor)
以上代碼能有什么用?就我目前體會到的,也就是解耦,方便擴展。當然也是Actor模型的一個特征,消息傳遞來代替方法調用。
我預想的中,應該先來個Akka.Net部分理論說明,再來說明代碼部分的實現原理。可惜想的太遠,實際時間太晚了。一步一步來吧。