.Net core使用XRPC创建远程接口的Actor对象
Actor
是一种高并发处理模型,每个Actor
都有着自己的状态有序消息处理机制,所以在业务处理的情况并不需要制定锁的机制,从而达到更高效的处理能性。XRPC
是一个基于远程接口调用的RPC
组件,它可以简单地实现高性能的远程接口调用;XRPC
在创建远程接口时是支持针对接口创建对应的Actor
实例。当创建接口Actor
后,所有Client针对这一例实例Actor
的所有方法调用都是有序处理。以下介绍如何在XRPC
创建并使用Actor
什么场景适用于Actor
既然每个Actor
都有着自己的状态和顺序处理机制,那可以针对这优点进行相关业务的展开;在棋牌游戏中的桌子可以是一个Actor
,车票里的每一辆车可以是一个Actor
,秒杀里的每一种商品是一个Actor
。在这些Actor
所有的操作都是有序进行,不存在锁,也不需要事务(通过EventSourcing来保障)和不会产生死锁;数据变更全内存操作,通过这样可以大提高业务的处理性能。
引用XRPC
Install-Package BeetleX.XRPC
定义Actor
的RPC服务
XRPC支持的Actor
服务功能是建立在EventNext
之上,它的好处是直接接口行为的Actor
创建,而不是传统的消息加接收方法,这样在应用设计和调用上也是非常方便灵活。接下来定义一个简单的Actor
服务
- 接口定义
public interface IAmountService
{
Task<int> Income(int amount);
Task<int> Payout(int amount);
Task<int> Get();
}以上是一个简单的帐记变更行为接口
实现接口
[Service(typeof(IAmountService))]
public class AmountService : ActorState, IAmountService
{ private int mAmount; public override Task ActorInit(string id)
{
return base.ActorInit(id);
} public Task<int> Get()
{
return mAmount.ToTask();
} public Task<int> Income(int amount)
{
mAmount += amount;
return mAmount.ToTask();
} public Task<int> Payout(int amount)
{
mAmount -= amount;
return mAmount.ToTask();
}
}启动对应的RPC服务
private static XRPCServer mXRPCServer; static void Main(string[] args)
{
mXRPCServer = new XRPCServer();
mXRPCServer.ServerOptions.LogLevel = LogType.Error;
mXRPCServer.Register(typeof(Program).Assembly);
mXRPCServer.Open();
Console.Read();
}以上代码是在默认端口
9090
上绑定RPC
服务,可以通过运行日志查看服务启动情况
创建远程Actor
调用
- 创建RPC Client
client = new XRPCClient("192.168.2.18", );
client.Connect();以上代码是创建一个
RPC
客户端,通过它的Create
可以创建接口代理 - 创建接口Actor实例
IAmountService henry = client.Create<IAmountService>("henry");
IAmountService ken = client.Create<IAmountService>("ken");以上是针对
IAmountService
创建了两个Actor
对象,这两个对象的操作都是相互隔离互不干扰;每个Actor
对象中的方法在并发下都是有序执行,并不会产生线程安全问题,所以在不同方法中操作对像的数据成员都不需要锁来保证数据安全性。
测试
为了更好地验证Actor
的隔离和并发安全性,简单地并发测试一下
for (int i = ; i < concurrent; i++)
{
var task = Task.Run(async () =>
{
for (int k = ; k < requests; k++)
{
await henry.Income();
System.Threading.Interlocked.Increment(ref mCount);
}
});
tasks.Add(task);
task = Task.Run(async () =>
{
for (int k = ; k < requests; k++)
{
await henry.Payout();
System.Threading.Interlocked.Increment(ref mCount);
}
});
tasks.Add(task);
task = Task.Run(async () =>
{
for (int k = ; k < requests; k++)
{
await ken.Income();
System.Threading.Interlocked.Increment(ref mCount);
}
});
tasks.Add(task);
task = Task.Run(async () =>
{
for (int k = ; k < requests; k++)
{
await ken.Payout();
System.Threading.Interlocked.Increment(ref mCount);
}
});
tasks.Add(task);
}
await Task.WhenAll(tasks.ToArray());
double useTime = EventCenter.Watch.ElapsedMilliseconds - start;
Console.WriteLine($"Completed count:{mCount}|use time:{useTime}|rps:{(mCount / useTime * 1000d):###.00} |henry:{await henry.Get()},ken:{await ken.Get()}");
两个程序同时在本机跑了一下,在50并发的情况大概是11万RPS
服务中的Actor
隔离性
服务是通过名称来实例化接口的不同Actor
,同一服务即使多个Client
同时对一名称的Actor
进行创建服务也可以保证它的唯一性。
完整示例代码
https://github.com/IKende/XRPC/tree/master/Samples/Actors
.Net core使用XRPC创建远程接口的Actor对象的更多相关文章
- RMI(远程接口调用)
1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传输层(Transport ...
- C#winForm调用WebService的远程接口
Web Service 的创建简单编码.发布和部署 上一篇详细概述了WebService的创建,编码,发布和部署,那么作为客户端的程序如何访问远程端的WebService 接下来看一下具体步骤: ...
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...
- Android开发,Eclipse创建aidl接口时,出错
Android开发中,当我们需要调用远程Service时,我们一般通过远程接口(RMI)来实现的,而Android的RMI需要AIDL(Android Interface Definition Lan ...
- .net core 在扩展中使用接口实例之IServiceProvider
在.net core 2.0中,我们使用的对象实例大多数都是通过构造函数依赖注入进来的,但那是在一般的类中使用. 如果需要在静态/扩展类中使用某些服务类的对象实例,可以使用如下方式: 1.新建一个Se ...
- 带SSL证书的httpclient 远程接口工具类
package com.iups.wx.util; import java.io.IOException; import java.io.UnsupportedEncodingException; i ...
- Atitit.远程接口 监控与木马 常用的api 标准化v2 q216
Atitit.远程接口 监控与木马 常用的api 标准化v2 q216 1. 木马与远程接口 监控的常用的api2 1.1. 文件复制2 1.2. 屏幕定时截图2 1.3. 邮件发送2 1.4. ...
- HttpClient远程接口调用-实名认证
1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...
- HttpClient 远程接口调用方式
远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端. Httpclient简介 什么是httpclient Htt ...
随机推荐
- DCloud-MUI:文档 UI组件
ylbtech-DCloud-MUI:文档 UI组件 1.返回顶部 1.accordion(折叠面板) 折叠面板从二级列表中演化而来,dom结构和二级列表类似,如下: <ul class=&qu ...
- rufus-scheduler定时任务示例代码
require 'rubygems' require 'rufus/scheduler' scheduler = Rufus::Scheduler.start_new scheduler.in '20 ...
- K.I.S.S 原则
KEEP IT SIMPLE, STUPID! 编写只做一件事情,并且要做好的程序:编写可以在一起工作的程序,编写处理文本流的程序,因为这是通用的接口.这就是UNIX哲学.所有的哲学真 正的浓缩为一个 ...
- Command line option syntax error. Type Command /? for Help.
--------------------------- Microsoft Visual C++ 2005 Redistributable --------------------------- Co ...
- Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定
1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...
- Angular07 路由的工作流程、路由参数、子路由、利用路由加载模块、模块懒加载???
1 Angular路由的工作流程 用户在浏览器输入一个URL -> Angular将获取到这个URL并将其解析成一个UrlTree实例 -> Angular会到路由配置中去寻找并激活与Ur ...
- 8、linux-数字计算
bash内置了对整数四则运算的支持,但是并不支持浮点运算 bc命令是一种支持任意精度的交互执行的计算器语言,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下 在bc工作环境下,可以使用以下计 ...
- [转载]Java程序员掌握的10大项知识体系--精通太难说出口
1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:a ...
- SQL语言 持续更新中……
SQL提供了很多的聚集函数 COUNT([DISTINCT\ALL]*) SUM([DISTINCT\ALL]<列名>)AVG().…… WHERE 子句中是不能用聚集函数作为条件表达式 ...
- 【关于安装mysql5.6的一些问题总结】
1:安装msyql5.6介质(mysql-5.6.24-winx64.msi)以后没有myslq服务: 解决: 管理员身份cmd进入bin目录: mysqld.exe -install Service ...