一步一步来熟悉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部分理论说明,再来说明代码部分的实现原理。可惜想的太远,实际时间太晚了。一步一步来吧。

一步一步来熟悉Akka.Net(一)的更多相关文章

  1. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  2. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper

    前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ...

  3. 【新手出发】从搭虚拟机开始,一步一步在CentOS上跑起来.Net Core程序

    文章背景 微软6月26号发布core 1.0版本后,园子里关于这方面的文章就更加火爆了,不管是从文章数量还是大家互动的热情来看,绝对是最热门的技术NO.1.我从去年底开始接触.net core到现在也 ...

  4. 一步一步来做WebQQ机器人-(五)(发送消息||完结)

    × 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个 ...

  5. 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

    cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...

  6. (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...

  7. [ALM]一步一步搭建MS ALM环境 - 安装TFS + SQL SERVER

    描述: 安装SQL SERVER 2012,安装TFS 2013,配置TFS,挽起袖子,准备干活儿 步骤: 1,打开Hyper-V Manager,参考[Hyper-V]使用操作系统模板创建新的虚拟机 ...

  8. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  9. 《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld

    2013-11-14 最近在看<一步一步写嵌入式操作系统>,感觉此书甚好,许多地方讲得很清楚.可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实 ...

随机推荐

  1. jboss-as- 7.1.1.Final配置jndi数据源

    初次使用jboss7.1.1.final部署项目,遇到了很多困难,最终通过查看官方文档和网上资料得以解决,特此记录一下. error information 2016-05-12 12:53:20 J ...

  2. innodb_locks_unsafe_for_binlog分析

    mysql数据库中默认的隔离级别为repeat-read. innodb默认使用了next-gap算法,这种算法结合了index-row锁和gap锁.正因为这样的锁算法,innodb在可重复读这样的默 ...

  3. 【转】Java学习---算法那些事

    [更多参考] LeetCode算法 每日一题 1: Two Sum ----> 更多参考[今日头条--松鼠游学] 史上最全的五大算法总结 Java学习---7大经典的排序算法总结实现 程序员都应 ...

  4. 【QT5】 第一个hello world 程序

    #include <QApplication> #include <QWidget> #include <QPushButton> int main(int arg ...

  5. 题解 P2701 【[USACO5.3]巨大的牛棚Big Barn】

    题面 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚. 他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方. 我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的 ...

  6. 【Alpha 冲刺】 4/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成 会遗漏一些部分的api,但是通过群里询问以及对页面的review解决 孙浩楷 根据UI设计, 实现左侧 ...

  7. 补码与C++的应用

    12.inti=(int)((unsigned int)0xffffffff+(unsigned int)0xffffffff); printf(“%d”,i);结果是:C A.0           ...

  8. Integer、String、StringBuffer、StringBuilder

    Integer Interger 是int基本数据类型的包装类,在Integer内部封装了一个final int value的属性. 构造方法: Integer类提供了两种构造方法:它们都会返回一个I ...

  9. vue项目 使用nginx代理

    nginx是一个高性能的HTTP和反向代理服务器.因此常用来做静态资源服务器和后端的反向代理服务器.本文主要记录使用nginx去部署使用vue搭建的前端项目,项目基于vue官方的脚手架vue-cli构 ...

  10. Oracle RMAN 恢复数据库到不同主机(一)

    一.RMAN 备份的内容 RMAN做数据库全备时包含了 数据文件.归档日志.控制文件和参数文件和备份日志,如下: arch_20160223_08qukp2t_1_1  arch_20160223_0 ...