1. Grain创建与激活机制
核心流程时序
1. 客户端调用: IGrainFactory.GetGrain<T>(key)
2. Silo接收请求:
- 查询ActivationDirectory
- 若未激活 → 创建ActivationData实例
3. 激活过程:
- 调用Grain构造函数
- 调用ReadStateAsync()加载状态
- 调用OnActivateAsync()
4. 返回客户端:
- 创建Grain引用(代理对象)
源码实现分析
ActivationData类 (src/Orleans.Runtime/Catalog/ActivationData.cs)
public class ActivationData : IGrainContext, IActivationData
{
// 创建Grain实例 (line 120-150)
private Grain CreateGrainInstance()
{
var grainType = _grainActivator.GetGrainType(this);
var grain = _grainActivator.Create(this);
this.GrainInstance = grain; // line 88
return grain;
}
// 激活过程 (line 300-350)
public async Task Invoke()
{
if (!IsActivated)
{
await Activate(); // 执行激活流程
}
// ... 处理请求
}
private async Task Activate()
{
// 1. 创建Grain实例
CreateGrainInstance();
// 2. 加载状态
await LoadState();
// 3. 调用生命周期方法
await Grain.OnActivateAsync();
IsActivated = true;
}
}
2. 自动销毁机制
回收流程时序
1. ActivationCollector定期扫描(默认1分钟)
2. 检查每个ActivationData:
- 计算空闲时间(LastAccessTime - DateTime.Now)
- 若超过CollectionAge阈值(默认10分钟)
3. 触发回收:
- 调用DeactivateOnIdle()
- 执行OnDeactivateAsync()
- 调用WriteStateAsync()保存状态
4. 清理资源:
- 从ActivationDirectory移除
- 释放Grain实例
源码实现分析
ActivationCollector类 (src/Orleans.Runtime/Catalog/ActivationCollector.cs)
internal async Task CollectActivations()
{
foreach (var activation in activations)
{
if (activation.IsInactive && activation.Age > _collectionAge)
{
// 触发停用 (line 80-100)
await activation.DeactivateAsync();
}
}
}
ActivationData停用实现 (src/Orleans.Runtime/Catalog/ActivationData.cs)
public async Task DeactivateAsync()
{
// 1. 调用Grain的停用方法
await Grain.OnDeactivateAsync();
// 2. 保存状态
await WriteStateAsync();
// 3. 清理资源 (line 400-450)
CleanupResources();
// 4. 从目录移除
_activationDirectory.Remove(this);
}
3. 代理代码生成机制
生成流程架构
编译时:
1. MSBuild调用Orleans.CodeGenerator
2. 扫描程序集:
- 识别Grain接口
- 分析接口方法签名
3. 代码生成:
- 生成代理类(实现Grain接口)
- 生成序列化器
4. 输出:
- obj/{config}/OrleansGenerated/*.cs
运行时:
1. 客户端调用代理类方法
2. 代理类:
- 构建InvokeMethodRequest
- 通过GrainReference发送到Silo
源码实现分析
代理类生成 (src/Orleans.CodeGenerator/CodeGenerator.cs)
public void GenerateCode(Assembly input)
{
// 扫描Grain接口 (line 150-180)
var grainInterfaces = FindGrainInterfaces(input);
foreach (var @interface in grainInterfaces)
{
// 生成代理类 (line 200-230)
GenerateProxyClass(@interface);
// 生成序列化器 (line 250-280)
GenerateSerializer(@interface);
}
}
代理类模板 (src/Orleans.CodeGenerator/Templates/GrainInterfaceProxy.tt)
public class <%= interfaceName %>Proxy : ProxyBase, <%= interfaceName %>
{
public <%= interfaceName %>Proxy(IGrainContext context) : base(context) {}
<% foreach (var method in methods) { %>
public <%= method.ReturnType %> <%= method.Name %>(<%= method.Parameters %>)
{
// 构建请求消息 (line 50-70)
var request = CreateRequestMessage(<%= method.Arguments %>);
return InvokeMethodAsync<<%= method.ReturnType %>>(request);
}
<% } %>
}
4. 整体架构设计
Orleans Grain架构组件
+----------------+ +----------------+ +-----------------+
| Client | | Silo | | Storage |
|----------------| |----------------| |-----------------|
| GrainReference | <---> | ActivationData | <---> | RedisGrainStorage
| (Proxy) | | (Grain实例) | | (状态存储) |
+----------------+ +----------------+ +-----------------+
^ ^ ^
| RPC调用 | 生命周期管理 | 状态持久化
| | |
+----------------+ +----------------+ +-----------------+
| CodeGenerator | | Activation | | 存储提供者 |
| (代理生成) | | Directory | | (IGrainStorage) |
+----------------+ +----------------+ +-----------------+
核心接口关系
5. 关键配置点
生命周期配置
// 配置Grain回收时间
siloBuilder.Configure<GrainCollectionOptions>(options =>
{
options.CollectionAge = TimeSpan.FromMinutes(30);
});
// 自定义激活逻辑
public class CustomGrainActivator : IGrainActivator
{
public Grain Create(IGrainContext context)
{
// 自定义创建逻辑
}
}
Redis存储配置
siloBuilder.AddRedisGrainStorage("redis", options =>
{
options.ConnectionString = "localhost:6379";
options.KeyPrefix = "grainState";
options.StateExpiry = TimeSpan.FromDays(30);
});
6. 服务注册与启动流程
Silo服务配置 (src/Orleans.Runtime/Hosting/DefaultSiloServices.cs)
public static void AddDefaultSiloServices(IServiceCollection services)
{
// 注册核心服务 (line 250-300)
services.AddSingleton<ActivationDirectory>();
services.AddSingleton<ActivationCollector>();
services.AddSingleton<PlacementService>();
// 注册生命周期服务 (line 310-350)
services.AddSingleton<GrainLifecycle>();
services.AddSingleton<IGrainActivator, DefaultGrainActivator>();
// 注册存储服务 (line 360-400)
services.AddSingleton<IGrainStorage, RedisGrainStorage>();
}
启动流程
1. 创建SiloHostBuilder
2. 配置服务集合(AddDefaultSiloServices)
3. 启动Silo:
- 初始化ActivationDirectory
- 启动ActivationCollector
- 加载Grain扩展
4. 开始接收客户端请求
7. 性能优化设计
- 激活池:Silo预创建常用Grain实例
- 批处理:状态读写批量操作
- 连接复用:Redis/MongoDB等存储连接共享
- 序列化优化:
- 自动生成高效序列化器
- 支持多种序列化协议(MessagePack, JSON, Protobuf)
- 位置优化:通过
SiloRoleBasedPlacementDirector优化Grain放置
位置优化实现 (src/Orleans.Runtime/Placement/SiloRoleBasedPlacementDirector.cs)
public override SiloAddress OnSelectPlacement(
PlacementStrategy strategy,
GrainId grainId,
IPlacementContext context)
{
// 根据Grain类型和Silo角色选择最优位置
var role = GetPreferredRoleForGrain(grainId);
return context.GetSiloForRole(role);
}
8. 高级特性
1. 事务支持
public class AccountGrain : Grain, IAccountGrain
{
[Transaction(TransactionOption.Join)]
public async Task Transfer(
IAccountGrain toAccount,
decimal amount)
{
this.State.Balance -= amount;
await toAccount.Deposit(amount);
}
}
2. 流处理
public class StockTickerGrain : Grain, IStockTickerGrain
{
public override async Task OnActivateAsync()
{
var stream = this.GetStreamProvider("SMS")
.GetStream<StockPrice>(this.GetPrimaryKey(), "STOCKS");
await stream.SubscribeAsync(HandlePriceUpdate);
}
}
3. 分布式事务
public class ShoppingCartGrain : Grain, IShoppingCartGrain
{
public async Task Checkout()
{
using (var transaction = TransactionFactory.Create())
{
await _inventoryGrain.ReserveItems(items);
await _paymentGrain.ProcessPayment(total);
await _shippingGrain.ScheduleDelivery();
transaction.Commit();
}
}
}
完整源码路径:
- 激活核心:
src/Orleans.Runtime/Catalog/- 生命周期:
src/Orleans.Core/Lifecycle/- 代理生成:
src/Orleans.CodeGenerator/- 存储抽象:
src/Orleans.Core/Storage/- Redis实现:
src/Redis/Orleans.Persistence.Redis/- 服务配置:
src/Orleans.Runtime/Hosting/DefaultSiloServices.cs- 位置策略:
src/Orleans.Runtime/Placement/SiloRoleBasedPlacementDirector.cs
本手册全面覆盖了Orleans Grain的生命周期管理、架构设计和高级特性,结合源码实现提供了专业的技术参考。

1371

被折叠的 条评论
为什么被折叠?



