|
|
51CTO旗下网站
|
|
移动端

2.3.6.5 服务通信

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为大家介绍服务通信。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-12 18:09

2.3.6.5 服务通信

在Reliable Actors 中,Actor 服务通过定义公开接口,来规范Actor 之间的通信;调用方通过相同的接口定义,来获取对应Actor 服务的代理客户端;通过ActorId 和服务名称来定位具体的服务位置;通过消息的形式,向目标Actor 服务发送消息,如果目标Actor 没有激活,就会先激活Actor 对象,然后再执行Actor 服务。这与传统使用的RPC 类似,不同的是,Actor 服务的调用都是异步的,并且目标Actor 服务是由有调用方触发激活的。也就说,在调用之前,目标Actor 服务只是注册在Reliable Actors 的虚拟Actor,只有被调用、被赋予一个ActorId 时,才会在群集的某个分区上创建实例。客户端在与该Actor 通信时,会尽力保证消息送达,如果出现异常,会尝试重新查找该Actor;当故障排除后,Actor 可能会收到一个客户端的重复消息。

1. Actor 代理

Reliable Actors 客户端需要创建一个实现Actor 接口的Actor 代理对象,通过Actor 代理对象与Actor 进行交互。以下是创建Actor 代理对象的C#代码示例:

  1. ActorId actorId = ActorId.CreateRandom();  
  2. IMyActor myActor = ActorProxy.Create<IMyActor>(actorId,  
  3. new Uri("fabric:/MyApp/MyActorService"));  
  4. await myActor.DoWorkAsync(); 

请注意:在创建Actor 代理对象时,需要指定ActorId 和Actor 服务名称。Reliable Actors将ActorId 作为 Actor 的唯一标识,并且用于Actor 分区,而应用服务名称则用于标识注册到Reliable Actors 的Actor 应用程序。当执行ActorProxy.Create 时,系统并不会激活对应的Actor,而是在调用Actor 方法时,才会真正发送消息到Reliable Actors,然后系统才会查找该Actor,如果没有被激活,就会激活该Actor,之后Actor 组件接受并处理消息。

2. 数据序列化

Reliable Actors 以接口的形式来定义服务,而Actor 之间的通信是基于消息的,这也就要求,接口的参数和返回结果必须支持序列化,这样才能够用于网络传输。实际上不仅接口服务的参数和返回结果需要支持序列化,所有存储到状态管理器中的数据也需要支持可序列化。

Reliable Actors 框架使用DataContract 序列化,所以在使用自定义对象时,需要使用DataContract 和DataMember 注解来标识自定义对象和属性。如下C#代码示例,定义了一个Person 的自定义对象:

  1. [DataContract]  
  2. public class Person  
  3. {  
  4. [DataMember]  
  5. public Guid id { get; set; }  
  6. [DataMember]  
  7. public string name { get; set; }  

在自定义对象中标识DataContract 后,就可以在Actor 的接口方法中,直接使用该Actor对象,C#示例如下代码:

  1. [StatePersistence(StatePersistence.Persisted)]  
  2. public class PersonActor : Actor, IPersonActor  
  3. {  
  4. public PersonActor(ActorService actorService, ActorId actorId)  
  5. : base(actorService, actorId)  
  6. {  
  7. }  
  8. public Task<Person> GetPersonAsync()  
  9. {  
  10. return this.StateManager.GetStateAsync<Person>("Person");  
  11. }  

在该示例中,有两个地方会进行对象序列化操作,分别是:

(1) 在Actor 之间相互调用,传输Person 对象时;

(2) 将Person 状态数据保存到状态管理器时,即持久化到磁盘,并复制到其他副本节点时。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读—网络应用(第2版)

本书虽然是《网管员必读—网络应用》的改版,但它绝不是简单的修改,而是完完全全的重写,内容更实用、更专业。全书共9章,13个大小方案,...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊