附录:1-Grain生命周期-译注
Grain Lifecycle
Grains are logical entities that always exist, virtually, and have stable logical identities (keys). Application code never creates or destroys grains. Instead, it acts as if all possible grains are always in memory and available for processing requests.
注:
- Grain是一直存在的逻辑实体,有稳定的逻辑标识(键)。应用程序代码永远不会创建或销毁Grain。相反,它的作用就好像所有可能的谷物都在内存中,对于处理请求,一直处于可用状态。
- 永远假设Grain是活着的。
Grains get physically instantiated, activated, by the Orleans runtime automatically on an as-needed to process incoming requests. After a grain has been idle for a certain amount of time, the Orleans runtime automatically removes, deactivates, it from memory.
注:
- 当需要处理请求时,Orleans运行时会将Grain自动activate。
- 当Grain被闲置一段时间时,Orleans运行时会将Grain自动remove、deactivate。
A physical instance of a grain in memory is called a grain activation. Grain activations are invisible to application code as well as the process of activating and deactivating them. Only the grain itself can be aware of that - by overriding virtual methods OnActivateAsync and OnDeactivateAsync that get invoked upon activation and deactivation of the grain respectively.
注:
- 在内存中实例化Grain叫作Grain激活。
- 对应用程序而言,activate与deactivate是透明的。
- activate:override OnActivateAsync虚方法;deactivate: override OnDeactivateAsync 虚方法
Over the course of its eternal, virtual, life a grain goes through the cycles of activations and deactivations, staying always available for callers to invoke it, whether it is in memory at the time of the call or not.
注:
- 无论Grain在不在内存里,Grain对于调用者总是可用的。
When you get a grain reference in a client or in another grain by using GetGrain, you only get a proxy object, called a grain reference, with a logical address (identity) of the grain, but not its physical address. When you call a method using the grain reference, then the grain will get activated in a silo (if it is not already activated in the cluster). Your method calls on the grain reference are sent to the activation by the Orleans runtime.
注:
- 客户端使用Grain引用时,使用的是它的引用代理类,不是物理地址。
- Grain实例在云端的Silo里。
- 使用Grain引用时,如果Grain不存在,Orleans运行时会激活它。
A call to GetGrain is an inexpensive local operation of constructing a grain reference with an embedded identity of the target grain.
Virtual methods
A grain class can optionally override OnActivateAsync and OnDeactivateAsync virtual methods that get invoked by the Orleans runtime upon activation and deactivation of each grain of the class. This gives the grain code a chance to perform additional initialization and cleanup operations. An exception throw by OnActivateAsync fails the activation process. While OnActivateAsync, if overridden, is always called as part of the grain activation process, OnDeactivateAsync is not guaranteed to get called in all situations, for example, in case of a server failure or other abnormal events. Because of that, applications should not rely on OnDeactivateAsync for performing critical operations, such as persistence of state changes, and only use it for best effort operations.
注:
- 重写OnActivateAsync 自定义initialization操作
- 重写OnDeactivateAsync 自定义cleanup操作
- OnActivateAsync中报异常,将阻断实例化过程。
- 不建议重写OnDeactivateAsync。
Declarative persistence
If a grain class uses declarative persistence by inheriting from Grain, the Orleans runtime automatically loads state of grain of that class as part of the activation process by calling ReadStateAsync before invoking OnActivateAsync and processing a request to the grain. A failure to load grain’s state with ReadStateAsync fails the activation process. The Orleans runtime never automatically persists grain’s state, and leaves it up to the application code when to call WriteStateAsync’
Sequence of events in a grain’s life cycle
- 如果Grain继承了Grain,Orleans运行时会在执行OnActivateAsync之前,执行ReadStateAsync,自动加载state。
- 如果加载state失败,则激活过程失败。
- Orleans运行时从不会自动持久化grain的state。
The life cycle of a grain is like this
Another grain or a client calls a method of the grain
The grain gets activated (if it is not activated anywhere in the silo) and an instance of the grain class is created
Constructor of the grain is executed and DI will setup (If you have DI)
If declarative persistence is used, the grain state is read from storage
If overridden, OnActivateAsync is called
The grain processes incoming requests
The grain remains idle for some time
Runtime decides to deactivate the grain
Runtime calls OnDeactivateAsync
Runtime removes the grain from memory
Upon a graceful shutdown of a silo, all grain activations it holds get deactivated. Any requests waiting to be processed in grains’ queues get forwarded to other silos in the cluster, where new activations of deactivated grains get created on an as-needed basis. If a silo shuts down or dies ungracefully, other silos in the cluster detect the failure, and start creating new activations of grains lost on the failed silo, as new requests for those grains arrive. Note that detection of a silo failure takes some time (configurable), and hence the process of reactivating lost grains isn’t instantaneous
注:
- silo正常关闭,所有激活的grain将失活;等待处理的请求将由云中的其他silo处理,在silo里根据需求激活grain。
- silo非正常关闭,请求到达时,其他silo会检测到失败,会在失败的silo上创建grain;因为检测到silo故障需要一定的时间(可配置),丢失的grain不会被立即重新激活。
附录:1-Grain生命周期-译注的更多相关文章
- Angular2 组件生命周期
1. 说明 Angular每个组件都存在一个生命周期,从创建,变更到销毁.Angular提供组件生命周期钩子,把这些关键时刻暴露出来,赋予在这些关键结点和组件进行交互的能力. 2. 接口 按照生命周期 ...
- Android 生命周期 和 onWindowFocusChanged
转载 http://blog.csdn.net/pi9nc/article/details/9237031 onWindowFocusChanged重要作用 Activity生命周期中,onStart ...
- Mvc请求的生命周期
ASP.NET Core : Mvc请求的生命周期 translation from http://www.techbloginterview.com/asp-net-core-the-mvc-req ...
- java基础78 Servlet的生命周期
1.Servlet的生命周期 简单的解析就是: 创建servlet实例(调用构造器)---->调用init()方法---->调用service()方法----->调用destroy( ...
- onWindowFocusChanged重要作用 and Activity生命周期
onWindowFocusChanged重要作用 Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onW ...
- thinkphp5.0生命周期
本篇内容我们对ThinkPHP5.0的应用请求的生命周期做大致的介绍,以便于开发者了解整个执行流程. 1.入口文件 用户发起的请求都会经过应用的入口文件,通常是 public/index.php文件. ...
- 【译】深入理解Rust中的生命周期
原文标题:Understanding Rust Lifetimes 原文链接:https://medium.com/nearprotocol/understanding-rust-lifetimes- ...
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
随机推荐
- 深入理解Amazon Alexa Skill(三)
本节来讨论Alexa Skill中涉及到的授权问题. Alexa内功能的授权 Alexa会发给skill用户的token,然后skill代码使用这个token来访问Web API访问用户的Alexa内 ...
- How to manipulate pixels on a bitmap by scanline property(Ma Xiaoguang and Ma Xiaoming)
We have been developing image processing software for above 14 years with old versions of Delphi, su ...
- 微信小程序把玩(三十三)Record API
原文:微信小程序把玩(三十三)Record API 其实这个API也挺奇葩的,录音结束后success不走,complete不走,fail也不走, 不知道是不是因为电脑测试的原因,只能等公测或者等他们 ...
- SQLSERVER使用密码加密备份文件以防止未经授权还原数据库
原文:SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 在备份数据库的时候,用户可以为媒体集.备份集或两者指定密码 在ba ...
- UWP SQLite的使用
原文:UWP SQLite的使用 1.准备工作 1.首先我们要给项目添加"SQLite for Universal Windows Platform"扩展 点击菜单栏的" ...
- 智能合约开发——以太坊 DApp 实现 购买通证token
合约的buy()方法用于提供购买股票的接口.注意关键字payable,有了它买股票的人才可以付钱给你. 接收钱没有比这个再简单的了! function buy() payable public ret ...
- LOG4NET图文教程
LOG4NET教程 一:简介 从操作系统到大多数的大型软件,都会有自己的程序运行时的日志跟踪API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而软件开发人员需要一套强大的日志系统来记 ...
- 使用Nodejs实现实时推送MySQL数据库最新信息到客户端
下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端.如果服务器的连接的客户 ...
- Linux上vim的使用
.........以下是我在使用vim时的操作经验........... (首先要了解vim主要是命令模式,输入模式,可视化模式,主要区别就是在不同模式下可以完成不同的操作,只是个编辑器,没有必要太纠 ...
- ABP开发框架前后端开发系列---(11)菜单的动态管理
在前面随笔<ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理>中介绍了基于ABP框架服务构建的Winform客户端,客户端通过Web API调用的方式进行获取数据,从而实现 ...