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
这个很有用,event
和state
绑定,通过事件更新状态,注意读写状态
外部的任务和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