使用Akka.net开发第一个分布式应用

既然这个系列的主题是”基于消息的架构模型演变“,少不了说说Actor模型。Akka.net是一个基于Actor模型的分布式框架。如果你对分布式应用还非常陌生,当别人在谈”分布式“、”云计算“等名词时你感到茫然,那么本篇文章将带你进行一次分布式开发之旅。

一、什么是Actor模型

Actor模型由Carl Hewitt于上世纪70年代早期提出并在Erlang语言中得到了广泛应用,目的是为了解决分布式编程中一系列问题。其主要特点如下:

  • 系统由Actor构成

  • Actor之间完全独立

  • 消息传递是非阻塞和异步的

  • 所有消息发送都是并行的

在Actor模型中Everything is an Actor。为什么感觉忽悠又开始了。。。

如果你看过了我写的”基于消息的架构演变“系列,你就会发现软件系统从观察者模式到事件然后再到消息,经过了不断的抽象。当软件通过消息来交互的时候再没有了直接引用,没有了耦合,所有的一切都变成了异步和并行。这时候再加上分布式支持,云计算也就变成了可能。

二、什么是Akka.net

Akka是一个基于scala语言的Actor模型库,旨在构建一套高并发、分布式、自动容错、消息驱动应用的工具集。Akka.net则是C#写的Akka版本,并且有很友好的F#Api接口。git地址:https://github.com/akkadotnet/akka.net

出自微软研究院的另一个Actor模型库:Orleans。此项目旨在提供分布式、高伸缩性的云计算框架。git地址:https://github.com/dotnet/orleans,我随后将写关于orleans的入门文章,请关注。

三、响应式宣言

说到Akka.net不得不提到响应式宣言。随着互联网和软件行业的发展,早先的软件架构已经不适应社会发展的需求。软件系统的架构应该具备:弹性、松耦合、可伸缩性,更加容易开发和维护,发生错误时能够自我容错。所以响应式系统的概念随之而来:

  • Responsive:The system responds in a timely manner if at all possible(系统应尽可能的及时响应)

  • Resilient: The system stays responsive in the face of failure(系统在发生错误时任然能够及时响应)

  • Elastic: The system stays responsive under varying workload(系统在各种负载之下都能及时响应)

  • Message Driven: Reactive Systems rely on asynchronous message-passing to establish a boundary between components that ensures loose coupling, isolation, location transparency, and provides the means to delegate errors as messages.(反应式系统依赖于异步消息组件之间建立边界确保松耦合、隔离、位置透明并提供委托错误消息的手段,这句翻译的有点不够准确)

之所以要提到这个宣言是因为Akka.net正是这样一个能够帮你建立响应式系统的框架。

四、从HelloWorld开始

1、新建一个Console Application

2、从Nuget中安装Akka

3、新建一个GreetMessage类来通知Actor

public  class  GreetingMessage
{
}

重点来了,既然在Akka.net中一切都是Actor,那么我们想要输出一个”Hello world”也需要通过一个Actor来完成。新建GreetingActor类:

public  class  GreetingActor : ReceiveActor
{
     public  GreetingActor()
     {
         Receive<GreetMessage>(greet =>Console.WriteLine( "Hello World" ));
     }
}


正如代码所示:当Actor收到GreetMessage消息时,输出”Hello World”。

4、在Main方法中发送消息

static  void  Main( string [] args)
{
     // Create a new actor system (a container for your actors)
     var  system = ActorSystem.Create( "MySystem" );
     // Create your actor and get a reference to it.
     var  greeter = system.ActorOf<GreetingActor>( "greeter" );
     // Send a message to the actor
     greeter.Tell( new  GreetingMessage());
     Console.ReadLine();
}

一个ActorSystem是一组Actor的容器。

var greeter = system.ActorOf<GreetingActor>("greeter");

创建了一个名为"greeter”的Actor。

greeter.Tell(new GreetingMessage());向greeter这个Actor发送GreetMessage消息。

Ctrl+F5跑起来看看:

这个例子虽然和简单,但是向大家展示了Akka.net中如何使用消息和Actor。

五、开发一个分布式的HelloWorld

这个HelloWorld它的NB之处在于它不是一个简单的HelloWorld,他是一个分布式的HelloWorld。。。

既然是分布式,我们需要建立两个Console Application分别部署在云端和本地,另外新建一个Class liabrary项目用来放公用的message等类型。

这次Client和Server两个项目都需要从Nuget中安装Akka.Remote用来远程通信。

先从Client端开始说起:

1、既然涉及到了远程通信,免不了要配置本地的地址,通信协议,端口等信息。所有的这些配置都可以配置到web.config中。Akka.net使用HOCON(Human-Optimized Config Object Notation)的格式来配置,为了简单期间,我们将这个配置直接写到代码里-其实内容跟写web.config是一样的。

var  config = ConfigurationFactory.ParseString( @"
akka { 
     actor {
         provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
     }
     remote {
         helios.tcp {
             transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
             applied-adapters = []
             transport-protocol = tcp
             port = 0
             hostname = localhost
         }
     }
}

");

你可以看到这个配置描述了远程通信的provider、使用了helios来做TCP通信,另外定义了client的hostname,端口号等。

2、定义Client端的ActorSystem,并向远程发送消息

using  ( var  system = ActorSystem.Create( "MyClient" , config))
     {
         var  greeting = system.ActorSelection( "akka.tcp://MyServer@localhost:8081/user/Greeting" );
         while  ( true )
         {
             var  input = Console.ReadLine();
             if  (input.Equals( "sayHello" ))
             {
                 greeting.Tell( new  GreetingMessage());
             }
         }
     }

这次的重点在于创建Actor是通过system.ActorSelection方法来实现,因为此Actor在云端,我们没有通过引用云端的程序集,而是通过云端的Actor地址akka.tcp://MyServer@localhost:8081/user/Greeting来访问GreetingActor。MyServer是云端的ActorSystem名称,localhost:8081是云端的地址和ip,由于我们在本地模拟,所以任然为localhost。user/Greeting表示我们要选取名称为Greeting的Actor。

当用户在client端输入"sayHello"之后,会向GreetingActor发送一个GreetingMessage的消息。

3、Server端的配置

var  config = ConfigurationFactory.ParseString( @"
akka { 
     actor {
         provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
     }
     remote {
         helios.tcp {
             transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
             applied-adapters = []
             transport-protocol = tcp
             port = 8081
             hostname = localhost
         }
     }
}
" );

Server端的配置跟Client端大同小异,只是拥有不同的端口号,如果部署在云端,应该输入云端的ip。

4、Server端的ActorSystem

using  ( var  system = ActorSystem.Create( "MyServer" , config))
   {
       system.ActorOf<GreetingActor>( "Greeting" );
       Console.ReadLine();

  }

这个代码很简单,跟第一个例子中的代码有点相似。

5、Server端的GreetingActor几乎跟第一个例子一样,不同之处在于使用了IHandle<TMessage>接口,这样显得Actor职责更加清晰,Actor能够处理哪些消息一目了然。

public  class  GreetingActor:TypedActor,IHandle<GreetingMessage>
{
     public  void  Handle(GreetingMessage message)
     {
         Console.WriteLine( "Hello world!" );
     }
}

6、运行

在解决方案中把Client和Server同时设置为启动项

然后Ctrl+F5,在client中输入"sayHello"之后,sever端会输出Hello World。

六、Actor结构

Akka.net中的Actor是一个具有层级结构的模型,每个ActorSystem都有多个Actor构成,而每个父Actor又可以创建自己的子Actor,对应到业务处理过程中,不同的Actor可以模拟面向对象的结构来处理具体的工作。而这个过程又可以分布在不同的服务器上,从而构成了一套完整的分布式计算系统。

七、总结

本文提到的例子非常简单,但是展示了Actor和基于消息通信的方式。Akka.net的强大之处在于它不仅像ESB那样解决了消息的生产和消费,而且提供了Actor并行消费消息的策略和机制,他更多的强调如何让大量的Actor之间协调工作,从而构建分布式和响应式的系统。

使用Akka.net还可以轻松实现CQRS,如果说DDD玩的是面向对象分析,那么Akka.net将为你解决剩下的技术细节。已经有人使用scala在Akka上进行这样的尝试ddd-leaven-akka,期待.net平台下也有更好的应用让我们进一步去学习和了解。

原文地址:http://www.cnblogs.com/richieyang/p/4945905.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

用计算机控制英文,计算机控制

摘要&#xff1a;Flexible Manufacturing Systems-An Integrated Approach to Automate Production Operations;Growth of LD steelmaking in India;H{sub}2 optimal computer control: polynomial toolbox;Implementation of a real-time target tracking behavior using vide…

JAXP操作xml

转载自 JAXP操作xmlDOM对象详解1&#xff0e;基本的DOM对象 DOM的基本对象有5个&#xff1a;Document&#xff0c;Node&#xff0c;NodeList&#xff0c;Element和Attr。下面就这些对象的功能和实现的方法作一个大致的介绍。 Document 对象代表了整个XML的文档&#xff0c;所…

Aaron Stannard谈Akka.NET 1.1

Akka.NET 1.1近日发布&#xff0c;带来新特性和性能提升。InfoQ采访了Akka.net维护者Aaron Stannard&#xff0c;了解更多有关Akka.Streams和Akka.Cluster的信息。Aaron还阐述了与Akka for JVM实现有关的路线图计划。 InfoQ&#xff1a;这个版本有什么突出的特性&#xff1f; A…

以计算机网络为中介的人际传播,以计算机为中介的人际传播理论范式

20世纪90年代以来&#xff0c;以计算机为中介的传播(Computer-Mediated Communication&#xff0c;CMC)成为人类越来越普遍的经验。新技术深刻而全面地影响着人际传播的模式&#xff0c;并成为人际关系建立、发展和维系过程中不可或缺的因素。对实践过程的观察和研究形成了人际…

简单使用JDOM解析XML

转载自 简单使用JDOM解析XML使用JDOM解析XML一、前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果&#xff0c;2000年初&#xff0c;JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。 DOM适合于当今流行的各种语言&#xf…

打造自己的LinqProvider

LinqProvider简介 本篇假设读者对Expression Tree 和Linq是有一定了解的&#xff0c;不了解的可以先看上面介绍Linq两篇文章,补一下课。 首先我们来看一下LinQProvide是如何执行的&#xff1a; 简单说明一下&#xff1a;我们写的Linq查询表达式将会被编译为方法调用链&#xff…

计算机硬件统的构成,计算机硬件统的构成部件.ppt

计算机硬件统的构成部件计算机硬件系统的构成部件 5.1 计算机硬件系统组成 5.2 中央处理器(CPU) 5.3 存 储 系 统 5.4 指令系统 计算机系统的基本构成 计算机硬件系统 指令和程序 计算机的工作过程 微型机主机的逻辑结构 微型计算机概述 计算机的总线 微型机主机的物理构成 BIO…

Java数据库连接池--DBCP浅析

转载自 Java数据库连接池--DBCP浅析前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量&#xff0c;数据库服务器就需要为每次连接创建一次数据库连接…

使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

最新的Mono 4.4已经支持运行asp.net mvc5项目&#xff0c;有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目&#xff0c;然后部署到Mono上&#xff0c;浏览下发现一堆错误出现&#xff0c;心中一万只草泥马奔腾而来&#xff0c;这也叫支持吗&#x…

体质测试数据统计软件,[体质测试数据excel自动统计表]体质测试数据Excel自动统计模板的研制...

《[体质测试数据excel自动统计表]体质测试数据Excel自动统计模板的研制》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《[体质测试数据excel自动统计表]体质测试数据Excel自动统计模板的研制(3页珍藏版)》请在装配图网上搜索。1、体质测试数据excel自动统计表体质测试…

常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

转载自 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源&#xff0c;这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性&#xff0c;影响到程序的性能指标…

分布式基础通信协议:paxos,totem和gossip

背景&#xff1a; 在分布式中&#xff0c;最难解决的一个问题就是多个节点间数据同步问题。为了解决这样的问题&#xff0c;涌现出了各种奇思妙想。只有在解决了如何进行信息同步的基础之上才衍生出形形色色的应用。这里开始介绍几种分布式通信协议。 简单即有效——totem协议:…

计算机专业可以评机械工程师,机械工程师个人评价

人就像一个多面体。仅仅由别人的评价来判定自己是不全面的&#xff0c;当自己也沉淀下来&#xff0c;窥探自己的内心&#xff0c;写下自己的自我评价&#xff0c;这样才可以不断进步。但是自我评价要怎么写呢?下面是学习啦小编带来机械工程师个人评价范文的内容&#xff0c;欢…

分布式系统之消息队列

转载自 分布式系统之消息队列 一、MQ简介 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 使用较多的消息队…

微软准备开源PowerShell

近日微软再次在向开源投出橄榄枝&#xff0c; PowerShell是面向Windows和Windows Server的自动化平台和脚本语言&#xff0c;帮助用户简化系统的管理。在纳德拉的带领下微软也逐渐走向开放&#xff0c;根据相关爆料称微软有计划在近期内 开源该脚本语言。 知名Windows爆料人士W…

华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大

华为荣耀畅玩7C内存多大这是很多朋友咨询的问题&#xff0c;华为荣耀畅玩7C凭借高颜值&#xff0c;双摄&#xff0c;人脸识别受到广泛关注&#xff0c;但是也有很多朋友更关心内存多大的问题&#xff0c;下面就来详细介绍一下华为荣耀畅玩7C内存多大。华为荣耀畅玩7C内存多大?…

谈谈数据库连接池的原理

转载自 谈谈数据库连接池的原理这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理&#xff0c;以及当下最流行的开源数据库连接池jar包。 一.早期我们怎么进行数据库操作1.原理&#xff1a;一般来说&#xff0c;java应用程序访问数据库的过程是&#xff1a…

华为荣耀20计算机,华为云电脑将停止服务/荣耀新机保护壳曝光/小米新机渲染图曝光...

华为云电脑8月16日停止服务和运营近日&#xff0c;华为官方宣布&#xff0c;“华为云电脑”APP将于北京时间2021年8月15日23点59分停止服务和运营&#xff0c;自那之后用户将再无法登录和使用。华为表示“届时及以后您将无法登录和使用。在此之前&#xff0c;有效套餐仍可连接使…

.NET Core系列 :3 、使用多个项目

通过前面的两篇文章.NET Core系列 &#xff1a; 1、.NET Core 环境搭建和命令行CLI入门 和.NET Core系列 &#xff1a; 2 、project.json 这葫芦里卖的什么药&#xff0c;我们已经知道如何创建新的项目&#xff0c;如何生成并运行我们的应用程序&#xff0c;也知道&#xff08;…

Docker 入门教程

转载自 Docker 入门教程2013年发布至今&#xff0c; Docker 一直广受瞩目&#xff0c;被认为可能会改变软件行业。 但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问题&#xff0c;好处又在哪里&#xff1f;本文就来详细解释&#xff0c;帮助大家理…