Orleans新记录(251)

Grain Identity

  • 获取key有多样的(继承多样:IGrainWithIntegerKey

Timers and Reminders

  • Observers

  • 服务端ObserverSubscriptionManager<> IGrainObserver保持订阅列表,调相应接口来进行通知对应订阅
  • 客户端CreateObjectReference Subscribe向服务器订阅

Reentrancy

  • grain类用[Reentrant]能完全异步,外部调它的方法顺序全是乱的。
  • [AlwaysInterleave]单个方法异步
  • 如果没有异步要注意方法里面出现GetGrain导致的grain之间互相调用会死锁
  • 服务端可以写个属性来进行动态异步交错(感觉没啥用呢)

RequestContext

  • 客户端RequestContext.Set,服务端RequestContext.Get它将与Orleans请求一起流向接收谷物;
    应用程序元数据不会随响应一起流回
    应用场景:请求从客户端到服务器跟踪流程用

JournaledGrain
这个很有用,eventstate绑定,通过事件更新状态,注意读写状态

外部的任务和grain
1) await,Task.Factory.StartNew,Task.ContinuewWith,Task.WhenAny,Task.WhenAll,Task.Delay都遵循当前的任务计划。这意味着以默认方式使用它们,无需传递不同的TaskScheduler,它们会在grain上下文中执行。

2)Task.Factory.FromAsync的Task.Run和endMethod委托,都不遵循当前的任务调度程序。它们都使用TaskScheduler.Default调度程序,即.NET线程池任务调度程序。

拦截器
1) 客户端调用grain用呼出,可以向RequestContext添加认证的东西
2} 服务端grain配置呼入,检查每个调用请求

GrainServices
GrainService是一种特殊的grain;它没有身份标识,并且在每个silo中运行,从silo的启动到关闭。

  • 如果可能,使GrainService可重入,以获得更好的性能
  • GrainService无法写入Orleans流,因为它不能在grain任务调度程序中工作

有点像数据服务的代理,其他grain注入这个来访问数据啥的

无状态grain

  • 对无状态工作器grain的请求总是在本地执行,身份标识是 0或Guid.Empty

事务
需要配合存储使用

启动任务
在许多情况下,一旦silo可用,就需要自动执行某些任务。启动任务提供此功能。

一些用例包括但不限于:

  • 启动后台计时器,以执行周期性的”家务”式的任务
  • 使用从外部的后备存储下载的数据,预加载一些缓存的grain
// //