日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Dapr牵手.NET学习笔记:Actor小试

發布時間:2023/12/4 asp.net 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dapr牵手.NET学习笔记:Actor小试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Actor模型是一種避免線程共享數據,相同Actor實體串行化的方案,所以不便dapr的其他功能,幾乎都是非編程入侵的,相反,Dapr Acror深度定制的,關于Actor,.net中有一些通用框架,比如Akka.net,微軟的Orleans,還有最近復活的Proto actor。Dapr下的Actor,是dapr實現了一些庫,基于這些庫來實現actor模型編程的。

本篇開個小頭,實際體會一下actor的作用,actor的一大作用就是實例隔離,相同實例不共享內存,不同實例間還是可以并行的,當然這個實現并不與OOP中的實例相等,還是看下面這個小例子吧,通過代碼來感覺。

一、首先定義一個類庫項目

需要引用Nuget包 Dapr.Actors

public interface IAccountActor : IActor {Task<string> GetTimeAsync(string inTime); }

二、定義一個asp.net api項目

實現上面定義的接口,需要引入Nuget包Dapr.Actors.AspNetCore

public class AccountActor: Actor, IAccountActor{ public AccountActor(ActorHost host) : base(host){ }public async Task<string> GetTimeAsync(string inTime){Console.WriteLine($"{this.Id}開始");Task.Delay(3000).Wait();Console.WriteLine($"{this.Id}結束");return await Task.FromResult($"Actor ID:{this.Id} 傳入時間:{inTime},返回時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}}

需要在向Services中注入Actor

using OrderFactoryService; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting;var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //注入Actor builder.Services.AddActors(options => {options.HttpEndpoint = "http://localhost:3999"; options.Actors.RegisterActor<AccountActor>(); });var app = builder.Build();if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); } app.UseAuthorization();app.UseRouting(); app.UseEndpoints(endpoints => { //Map Actor Handlerendpoints.MapActorsHandlers(); }); app.MapControllers(); app.Run();

為了對比測試,可以定義一個/gettime的api,比較并串行

[ApiController] [Route("[controller]")] public class HomeController : ControllerBase {private readonly ILogger<HomeController> _logger;public HomeController(ILogger<HomeController> logger){_logger = logger;}[HttpGet("/gettime")]public IActionResult Get(string inTime){Task.Delay(3000).Wait();return Ok($"傳入時間:{inTime},返回時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");} }

三、添加一個Actor客戶端項目

需要引用Nuget包?Dapr.Actors

using?Dapr.Actors; using Dapr.Actors.Client; using IOrderFactoryActory.Interfaces;Console.WriteLine("回車開始"); Console.ReadLine();//調用api是并行的 var client = new HttpClient(); var httpTask1 = new Task(async () => {Console.WriteLine(await client.GetStringAsync("http://localhost:5000/gettime?intime=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); }); var httpTask2 = new Task(async () => {Console.WriteLine(await client.GetStringAsync("http://localhost:5000/gettime?intime=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); }); httpTask1.Start(); httpTask2.Start();//相同ID的actor是串行的,不同ID的actor是并行的 var factory = new ActorProxyFactory(new ActorProxyOptions { HttpEndpoint = "http://localhost:3999" }); var account1 = CreateActor(factory, "11111111111"); var account2 = CreateActor(factory, "22222222222"); var actorTask1_1 = new Task(async () => {Console.WriteLine(await account1.GetTimeAsync(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); }); var actorTask1_2 = new Task(async () => {Console.WriteLine(await account1.GetTimeAsync(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); }); var actorTask2 = new Task(async () => {Console.WriteLine(await account2.GetTimeAsync(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); }); actorTask1_1.Start(); actorTask1_2.Start(); actorTask2.Start();Console.WriteLine("回車結束"); Console.ReadLine();static IAccountActor CreateActor(ActorProxyFactory factory, string accountNo) {var actorType = "AccountActor";var actorId = new ActorId(accountNo); return factory.CreateActorProxy<IAccountActor>(actorId, actorType); }

四、開始測試

啟動sidecar

dapr?run?--app-id?account?--app-port?5000?--dapr-http-port?3999

運行結果:

可以通過上面的例子看到,web api的傳入時間和返回時間幾乎相同,說明他們是并行運行的,都在內部等了3秒;Actor有兩個實例,是通過ActorID來區分實例的,ID為1開頭的兩個實例雖然傳入時間幾乎相同,但在返回時間上,第二次明顯是排在第一次返回后的(這正是Actor的串行基本準則),ID為2開頭的,可以與1并行。

實際場景是什么呢?前一段時間開發了一套賬務系統,場景是有很多賬戶批量入帳,當然有可能有相同帳戶同時入帳,入帳時需要取出舊的帳戶余額,加上本次入帳金額,然后更新掉帳戶余額;因為是通過web api調過來的并發,處理辦法是在表的數據行上用行級鎖(DBA會罵娘的),保證兩個相同帳戶入帳時,不會同時取,然后都用舊余額相加。但如果這里用Actor,就可以釋放數據庫的壓力(DBA會很開心的),相同帳戶的Actor是串行執行,所以在業務層就避免了并發,不同帳戶不受影響,關鍵是Actor是細小的顆粒,可以大量創建銷毀。篇幅和時間所限,下一篇會用例子來實現這個場景。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Dapr牵手.NET学习笔记:Actor小试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亲嘴扒胸摸屁股免费视频日本网站 | 国产va| 精品国产成人av在线免 | 精品国精品国产自在久不卡 | 成人动漫h在线观看 | 日韩美在线| 日xxxx| 日本 在线| 麻豆免费在线观看视频 | 羽月希奶水一区二区三区 | 韩国特级毛片 | 青青草视频在线免费观看 | 精品日韩一区二区三区四区 | 麻豆av一区 | 午夜资源 | 欧美成人国产精品一区二区 | 天海翼av | 久久国内精品视频 | 精品免费观看 | 手机在线看a | 成人国产片 | 男人天堂视频在线观看 | 亚洲国产欧美一区 | 精品少妇无码av无码专区 | 色狠久 | 青草草在线观看 | 国产最新地址 | www.人人干| 极品美女啪啪 | 福利网址在线观看 | 欧美日韩18 | 波多野结衣亚洲 | 午夜激情在线观看 | 色片网站在线观看 | 中文字幕日韩一级 | 美女毛片| 亚洲女同一区二区 | 九七人人爽 | 在线你懂的 | 久久中字 | 91网在线播放 | 国产人成在线观看 | 非洲黑人狂躁日本妞 | 伊人久久一区二区三区 | 欧美日韩八区 | 白浆网站| 欧美另类在线播放 | 91成人入口 | 秘密基地免费观看完整版中文 | 欧美狠狠干 | 天天操天天干天天操 | 日本美女一区二区三区 | 亚洲插| 男人的天堂一区 | 97中文字幕在线观看 | 日韩视频在线免费播放 | 99精品视频免费在线观看 | 欧美黄色性生活 | 五月涩| 亚洲精品免费在线观看 | 巨乳美女在线 | 快色视频| 欧美激精品 | 天天干夜夜爽 | 色香蕉影院 | 91av视频 | 国产成人精品免高潮在线观看 | av作品在线 | 91极品在线| 日日夜夜综合 | 日本一区二区三区视频在线播放 | 人人爽人人爽人人片 | 欧洲视频在线观看 | 在线观看你懂的视频 | 中文字幕免费看 | 亚洲av综合色区无码二区爱av | 一级毛毛片 | 伊人久久久| 久青草视频 | 中文字幕日韩欧美在线 | 久成人| 大奶骚 | 国产精品白嫩白嫩大学美女 | 一进一出视频 | 美女打屁股网站 | 丰满人妻一区二区三区大胸 | 久久人人人 | 久久久久久久久久久久久久久久久久久久 | 免费观看黄色一级视频 | 欧美在线专区 | 欧美午夜激情影院 | 2019天天干 | 一级肉体全黄裸片中国 | 五月开心激情网 | 色图色小说 | 国产三级影院 | 青青操91 | 俺也去综合 | 欧美久操 |