一步一步来熟悉Akka.Net(一)

简介: 一步一步来熟悉Akka.Net(一)标签(空格分隔): .netcore 分布式一、不利flag  好久没写过文章了,翻开前几年写的博客,看到有两个目标“代码生成器”和“文件隐身”。说起来并不是太难的东西,难产到现在还没有出来。

一步一步来熟悉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
  img_869e4cf03a0ccfc8c9b26f15962f9fe6.png
*代码(截图太麻烦,都放到一个文件里去了)
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)
img_6f827d8552c1161d3c0e49ec11df6167.png

  以上代码能有什么用?就我目前体会到的,也就是解耦,方便扩展。当然也是Actor模型的一个特征,消息传递来代替方法调用。

  我预想的中,应该先来个Akka.Net部分理论说明,再来说明代码部分的实现原理。可惜想的太远,实际时间太晚了。一步一步来吧。

作者:从此启程/范存威

出处:http://www.cnblogs.com/fancunwei/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。如文章对您有用,烦请点个推荐再走,感谢! 本博客新开通打赏,鼠标移到右侧打赏浮动处,即可赏博主点零花钱,感谢您的支持!

相关文章
|
网络协议
一起谈.NET技术,回顾.NET Remoting分布式开发
  记得在下第一次接触.NET Remoting分布式开发是在2003年,那时候是Framework1.0初次亮相之时,Remoting分布式开发是Framework1.0其中一个亮点。经过多年的发展,在2005年,WCF随着Framework2.0首先亮相。
2772 0
|
6月前
|
开发框架 前端开发 .NET
闲话 .NET(3):.NET Framework 的缺点
闲话 .NET(3):.NET Framework 的缺点
|
6月前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
171 0
|
6月前
|
开发框架 缓存 安全
闲话 .NET(5):.NET Core 有什么优势?
闲话 .NET(5):.NET Core 有什么优势?
127 0
|
开发框架 负载均衡 网络协议
.NET WebSocket 核心原理初体验
本文将利用WebSockets(SignalR的一部分)搭建一个可双向通信的ASP.NETCore5应用。
.NET WebSocket 核心原理初体验
|
网络协议
回顾“.NET技术”.NET Remoting分布式开发
  记得在下第一次接触.NET Remoting分布式开发是在2003年,那时候是Framework1.0初次亮相之时,Remoting分布式开发是Framework1.0其中一个亮点。经过多年的发展,在2005年,WCF随着Framework2.0首先亮相。
1464 0
|
消息中间件 监控 NoSQL
一起谈.NET技术,NET 下RabbitMQ实践 [实战篇]
  之前的文章中,介绍了如何将RabbitMQ以WCF方式进行发布。今天就介绍一下我们产品中如何使用RabbitMQ的!  在Discuz!NT企业版中,提供了对HTTP错误日志的记录功能,这一点对企业版非常重要,另外存储错误日志使用了MongoDB,理由很简单,MongoDB的添加操作飞快,即使数量过亿之后插入速度依旧不减。
794 0
|
Web App开发 XML Java
JAVA与.NET的相互调用——通过Web服务实现“.NET研究”相互调用
  JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方。而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发。而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候对另一种语言感觉到畏惧。
1038 0
|
消息中间件
一起谈.NET技术,NET下RabbitMQ实践 [WCF发布篇]
  在之前的两篇文章中,主要介绍了RabbitMQ环境配置,简单示例的编写。今天将会介绍如何使用WCF将RabbitMQ列队以服务的方式进行发布。  注:因为RabbitMQ的官方.net客户端中包括了WCF的SAMPLE代码演示,很适合初学者,所以我就偷了个懒,直接对照它的SAMPLE来说明了,算是借花献佛吧,呵呵。
1208 0