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

运行结果:

f12859f6dd007d051a0684fd2fc5c461.png

可以通过上面的例子看到,web api的传入时间和返回时间几乎相同,说明他们是并行运行的,都在内部等了3秒;Actor有两个实例,是通过ActorID来区分实例的,ID为1开头的两个实例虽然传入时间几乎相同,但在返回时间上,第二次明显是排在第一次返回后的(这正是Actor的串行基本准则),ID为2开头的,可以与1并行。

实际场景是什么呢?前一段时间开发了一套账务系统,场景是有很多账户批量入帐,当然有可能有相同帐户同时入帐,入帐时需要取出旧的帐户余额,加上本次入帐金额,然后更新掉帐户余额;因为是通过web api调过来的并发,处理办法是在表的数据行上用行级锁(DBA会骂娘的),保证两个相同帐户入帐时,不会同时取,然后都用旧余额相加。但如果这里用Actor,就可以释放数据库的压力(DBA会很开心的),相同帐户的Actor是串行执行,所以在业务层就避免了并发,不同帐户不受影响,关键是Actor是细小的颗粒,可以大量创建销毁。篇幅和时间所限,下一篇会用例子来实现这个场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黄聪:wordpress如何开启文章格式post format

发现很多“古老”的WordPress主题使用量非常大&#xff0c;虽然部分也在随着WordPress版本的升级而“升级”&#xff0c;只不过是修复了bug而已&#xff0c;wordpress的新特性并没有使用。而且多数国内的wordpress主题制作者&#xff0c;也都是在这些主题的基础上进行创作&…

11没有源码注释_我们为什么要看源码、应该如何看源码?

看源码的意义看源码只是一种方法、手段&#xff0c;而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标&#xff0c;现在看起来真的很蠢&#xff0c;一点不smart&#xff08;specific、measurable、attainable、relevant、time-bound&#xff09;。只有搞清楚了阅读代码的…

如果你没空读书,就一定要来看看这8个公众号!

全世界只有3.14 % 的人关注了爆炸吧知识不管世界变化多块&#xff0c;阅读仍是个不过时的动作。今天就为大家推荐几个优质公众号&#xff0c;从社会热点、读书成长、生活新知&#xff0c;你的碎片化时间&#xff0c;我们包了&#xff01;一起来看看呀~♥长按二维码&#xff0c;…

03Prism WPF 入门实战 - Region

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopyweb&#xff08;1&#xff09;Prism概览Application&#xff1a;我们开发应用程序&#xff0c;初始化Bootstrapper。Bo…

10月Web服务器调查:Apache下降 Ngnix攀升

来自netcraft的消息&#xff0c;在2010年10月份的Web服务器市场调查中&#xff0c;在232,839,963个网站中&#xff0c;仍有69.8%的站点在使用 Apache服务器&#xff0c;相比于上个月&#xff0c;其市场份额增长了大约1个百分点&#xff0c;Ngnix也有较小幅度的增长&#xff0c;…

Python深度学习029:pytorch中常用的模块或方法

PyTorch是一个广泛使用的深度学习库,提供了许多用于构建和训练神经网络的模块和方法。下面是一些PyTorch中常用的模块和方法的简要介绍: PyTorch常用模块和方法 torch 用途:PyTorch的基础模块,提供了多种数学运算功能。常用方法: torch.tensor():创建张量torch.randn():…

【转载】Android设计中的.9.png

转载自&#xff1a;腾讯ISUX (http://isux.tencent.com/android-ui-9-png.html) 在Android的设计过程中&#xff0c;为了适配不同的手机分辨率&#xff0c;图片大多需要拉伸或者压缩&#xff0c;这样就出现了可以任意调整大小的一种图片格式“.9.png”。这种图片是用于Android开…

如果你没空看书,我强烈建议你做这件事!

知乎上有个高赞问题&#xff1a;有哪些书看完后&#xff0c;会让人后悔没早看到&#xff1f;答案各有不一、包罗万象。但有一点&#xff0c;大家达成了共识&#xff1a;要多读书。人生漫长&#xff0c;而我们都不会是一成不变的&#xff0c;真正决定人与人之间的差距的&#xf…

为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

前言ASP.NET Core的Middleware&#xff08;中间件&#xff09;就是使用了管道模式&#xff1a;Request&#xff08;请求&#xff09;在管道中传递&#xff0c;依次经过管道中的每一个MiddleWare进行处理。MiddleWare就像一层层的“滤网”&#xff0c;过滤所有的请求和响应。这种…

缓存在哪里_什么是MyBatis缓存技术

MyBatis缓存引言在一个Web项目中&#xff0c;查询数据库中的操作算是一个非常常用的操作&#xff0c;但是有些数据会被经常性的查询&#xff0c;而每一次都去数据库中查询这些重复的数据&#xff0c;会很消耗数据库的资源&#xff0c;同时使得查询效率也很低&#xff0c;而 MyB…

WPF开发登录窗口之——窗口布局

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织01—代码如下一、创建项目&#xff0c;命名为LoginWindow&#xff0c;然后创建以下目录结构&#xff1a;二、导入图片三、创建资源字典。一共创建四个&#xff1a;ButtonStyle、WindowStyle、Text…

这个偏僻的小山村竟出了12位博士28位硕士,高产“学霸”背后原因曝光......

全世界只有3.14 % 的人关注了爆炸吧知识考上大学留名祖宗祠堂今早&#xff0c;超模君刷微博的时候&#xff0c;有一则新闻吓得我虎躯一震——一个总共才2000多人小山村&#xff0c;竟然出了12位博士28位硕士。而且考上大学的孩子&#xff0c;他们的名字直接刻进祖宗祠堂。(微博…

牛顿新定律:凭本事得到的,凭什么要还?

后记事后&#xff0c;超模君提出用上帝开过光的真苹果来换回自己的苹果手机&#xff0c;但是惨遭牛顿君拒绝&#xff0c;理由是苹果手机更能激发他的创作灵感……面对这种鬼话&#xff0c;超模君敢怒不敢言。更惨的是&#xff0c;上帝说苹果手机不报销……艾萨克牛顿&#xff0…

04Prism WPF 入门实战 - Module

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?sharesourcecopywebModule&#xff0c;具有特定功能&#xff0c;且独立存在则称为成为模块。下图为Prism体系中的关系结构图。在Prism体…

虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...

安装虚拟机&#xff0c;默认情况下&#xff0c;联网的模式是NAT&#xff0c;即跟主机是转发共用网络资源的&#xff0c;这样就非常慢&#xff0c;时常网页都打不开&#xff0c;现把它改成桥接模式&#xff0c;让它独立成为一台物理机&#xff0c;网速有大大的改善&#xff0c;设…

如何保持纯洁男女关系……

1 倒也没毛病▼2 差点以为是狗子&#xff01;&#xff01;▼3 大哥&#xff1a;我裤子没破&#xff01;▼4 女朋友梦到了啥&#xff1f;&#xff1f;▼5 忍不住了&#xff0c;嘻嘻嘻...&#xff08;via.小风车车&#xff09;▼6 亲爸爸&#xff01;&#xff01;▼7 哈哈哈…

【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了

笔试至少3次见到这个题&#xff0c;都是瞎编的&#xff0c;今天群里有人问&#xff0c;然后有人放出了这个地址&#xff1a;http://coolshell.cn/articles/7965.html&#xff0c;让我恍然大明白&#xff0c;豁然好脾气。 感谢这位陈皓同学&#xff08;名字很熟&#xff0c;不记…

C# 选中 DataGridView 控件中的行时显示不同的颜色

可以利用 DataGridView 控件的 SelectionMode、ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色。SelectionMode属性用于设置如何选择 DataGridView 的单元格。语法如下:public DataGridViewSelectionMode SelectionMode{get;set;}属性值…

32岁武汉硕士毕业4年后重新高考,考上本硕需再读8年:“不是一时冲动”

全世界只有3.14 % 的人关注了爆炸吧知识9月5日&#xff0c;程传坤收到了湖北中医药大学的录取通知书。7月8日下午5时10分&#xff0c;32岁的程传坤走出湖北省武汉市新洲一中考点&#xff0c;一脸轻松&#xff0c;拿着准考证特意在新洲一中门前留影。这是他硕士毕业4年后再战高考…

打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!

面对电脑中日积月累的大量结构式&#xff0c;如何能快速找到自己想要的文件&#xff0c;有时真是一个让人头疼的问题。KingDraw PC版内置的结构式检索功能&#xff0c;可以帮助我们轻松解决这个难题。KingDraw PC版中&#xff0c;我们有两种途径可以检索结构式——右键菜单中检…