当前位置: 首页 > news >正文

LocalGrainDirectory详解

LocalGrainDirectory 详解

LocalGrainDirectory是Orleans分布式系统中负责本地Grain目录管理的核心组件,它实现了分布式哈希表(DHT)风格的Grain定位服务。

类图

LocalGrainDirectory
-ILogger log
-SiloAddress? seed
-ISiloStatusOracle siloStatusOracle
-IInternalGrainFactory grainFactory
-object writeLock
-IServiceProvider _serviceProvider
-DirectoryMembership directoryMembership
-bool Running
-Catalog? _catalog
+SiloAddress MyAddress
+IGrainDirectoryCache DirectoryCache
+LocalGrainDirectoryPartition DirectoryPartition
+RemoteGrainDirectory RemoteGrainDirectory
+RemoteGrainDirectory CacheValidator
+GrainDirectoryHandoffManager HandoffManager
+Start() : void
+StopAsync() : Task
+SiloStatusChangeNotification(SiloAddress, SiloStatus) : void
+RegisterAsync(GrainAddress, int) : Task<AddressAndTag>
+UnregisterAsync(GrainAddress, UnregistrationCause, int) : Task
+LookupAsync(GrainId, int) : Task<AddressAndTag>
+LocalLookup(GrainId, out AddressAndTag) : bool
+CalculateGrainDirectoryPartition(GrainId)
«interface»
ILocalGrainDirectory
+Start() : void
+StopAsync() : Task
+RegisterAsync(GrainAddress, int) : Task<AddressAndTag>
+UnregisterAsync(GrainAddress, UnregistrationCause, int) : Task
+LookupAsync(GrainId, int) : Task<AddressAndTag>
+LocalLookup(GrainId, out AddressAndTag) : bool
«interface»
ISiloStatusListener
+SiloStatusChangeNotification(SiloAddress, SiloStatus) : void
«interface»
ILifecycleParticipant<ISiloLifecycle>
+Participate(ISiloLifecycle) : void
LocalGrainDirectoryPartition
+AddSingleActivation(GrainAddress, GrainAddress?) : AddressAndTag
+RemoveActivation(GrainId, ActivationId, UnregistrationCause) : void
+LookUpActivation(GrainId) : AddressAndTag
+GetItems()
«interface»
IGrainDirectoryCache
+AddOrUpdate(GrainAddress, int) : void
+LookUp(GrainId, out GrainAddress) : bool
+Remove(GrainId) : bool
+KeyValues IEnumerable~(GrainAddress, int)

协作图

ClientLocalGrainDirectoryLocalGrainDirectoryPartitionDirectoryCacheRemoteGrainDirectorySiloStatusOracleGrain注册流程RegisterAsync(grainAddress, hopCount)CalculateGrainDirectoryPartition(grainId)AddSingleActivation(address, previousAddress)AddressAndTag resultAddOrUpdate(result.Address, result.VersionTag)返回注册结果RegisterAsync(address, previousAddress, hopCount+1)AddressAndTag resultAddOrUpdate(result.Address, result.VersionTag)返回注册结果alt[当前Silo是Owner][需要转发到其他Silo]Grain查找流程LookupAsync(grainId, hopCount)LookUp(grainId, out address)返回缓存地址返回查找结果CalculateGrainDirectoryPartition(grainId)LookUpActivation(grainId)AddressAndTag result返回查找结果LookupAsync(grainId, hopCount+1)AddressAndTag resultAddOrUpdate(result.Address, result.VersionTag)返回查找结果alt[当前Silo是Owner][需要转发到其他Silo]alt[缓存命中且Silo有效][缓存未命中或无效]Silo状态变化处理SiloStatusChangeNotification(updatedSilo, status)AddServer(updatedSilo)AdjustLocalDirectory(silo, dead: false)AdjustLocalCache(silo, dead: false)RemoveServer(updatedSilo, status)AdjustLocalDirectory(silo, dead: true)AdjustLocalCache(silo, dead: true)alt[Silo变为Active状态][Silo变为Terminating状态]ClientLocalGrainDirectoryLocalGrainDirectoryPartitionDirectoryCacheRemoteGrainDirectorySiloStatusOracle

核心功能详解

1. 分布式哈希表(DHT)分区算法

LocalGrainDirectory使用一致性哈希算法来确定每个Grain的目录分区所有者:

publicSiloAddress?CalculateGrainDirectoryPartition(GrainIdgrainId){inthash=unchecked((int)grainId.GetUniformHashCode());// 在排序的Silo列表中查找第一个哈希值小于等于目标哈希的Silofor(varindex=existing.MembershipRingList.Count-1;index>=0;--index){varitem=existing.MembershipRingList[index];if(IsSiloNextInTheRing(item,hash,excludeMySelf)){returnitem;}}}
2. 请求转发机制

当当前Silo不是Grain的目录所有者时,会进行请求转发:

publicSiloAddress?CheckIfShouldForward(GrainIdgrainId,inthopCount,stringoperationDescription){varowner=CalculateGrainDirectoryPartition(grainId);if(ownerisnull||owner.Equals(MyAddress))returnnull;if(hopCount>=HOP_LIMIT)// 跳数限制为6thrownewOrleansException($"Hop limit reached");returnowner;// 转发到目标Silo}
3. 缓存管理

LocalGrainDirectory维护本地缓存以提高查找性能:

publicboolLocalLookup(GrainIdgrain,outAddressAndTagresult){// 首先检查缓存varaddress=GetLocalCacheData(grain);if(address!=default){result=new(address,0);returntrue;}// 如果是本地分区,检查本地目录if(silo.Equals(MyAddress)){result=GetLocalDirectoryData(grain);returnresult.Address!=null;}returnfalse;}
4. 集群成员变化处理

LocalGrainDirectory监听Silo状态变化并相应调整目录和缓存:

publicvoidSiloStatusChangeNotification(SiloAddressupdatedSilo,SiloStatusstatus){if(status.IsTerminating()){CacheValidator.WorkItemGroup.QueueAction(()=>RemoveServer(updatedSilo,status));}elseif(status==SiloStatus.Active){CacheValidator.WorkItemGroup.QueueAction(()=>AddServer(updatedSilo));}}

关键设计特点

  1. 线程安全:使用writeLock对象确保目录操作的线程安全
  2. 容错性:支持Silo故障时的目录分区重新分配
  3. 性能优化:本地缓存减少远程查找开销
  4. 可扩展性:支持动态集群成员变化
  5. 一致性:确保目录信息在集群中的一致性

LocalGrainDirectory是Orleans分布式系统的核心组件,它通过分布式哈希表算法实现了高效的Grain定位服务,为整个系统的可扩展性和可靠性提供了基础支撑。

http://www.cnnetsun.cn/news/94456.html

相关文章:

  • 视频硬字幕AI去除终极方案:本地化无损修复技术详解
  • BetterNCM插件完整教程:从零开始打造你的专属音乐工作站
  • 大模型注意力机制全解析:从MHA到MoBA,一文掌握七种核心算法
  • LobeChat能否实现AI调酒师?饮品配方创意与口味偏好匹配
  • 如何快速绕过iOS激活锁:AppleRa1n完整解决方案指南
  • 3分钟深入解析LLM注意力机制:轻松掌握核心原理!
  • UnrealPakViewer终极指南:Pak文件分析与虚幻引擎资源管理完整教程
  • TradingView图表库K线生成机制深度解析与实战指南
  • 智能字体协作者:AutoCAD字体自动修复的终极解决方案
  • [深度复盘] 恋爱是一场分布式系统灾难?手把手教你用状态机(FSM)重构女神的“潜台词”逻辑
  • 字符设备驱动(5)
  • Flutter 表单开发实战:表单验证、输入格式化与提交处理
  • 【光子 AI】AI Agent 架构师 / 技术专家 10 道必考面试题和必过答案完整讲解 1
  • Flutter 主题与深色模式:全局样式统一与动态切换
  • 基于 GEE 使用 Sentinel-2 遥感影像数据反演水体叶绿素 a 质量浓度
  • 小红书数据采集架构解析与工程实践
  • 长沙对非合作深化 探索新型易货贸易
  • OpenCore Legacy Patcher终极教程:让老旧Mac完美运行最新macOS
  • 1、开启GIMP图像编辑之旅:从安装到精通
  • 2、开启 GIMP 图形编辑之旅
  • 怎么建立一套高效的设备运维管理体系?
  • 小爱音箱AI升级:让你的智能音箱秒变高智商语音助手
  • UnrealPakViewer终极指南:从入门到精通的Pak文件分析完整教程
  • 俄罗斯T-Tech公司推出T-pro 2.0:让AI说俄语更流利混合智能模型
  • MCP智能体连接协议面临企业级挑战
  • 联想发布数据存储新品助力企业AI发展
  • 人工智能使用大揭秘:OpenRouter公司百万亿规模数据分析报告
  • 微信DAT文件转换神器,牛批了
  • OBS音频插件实用技巧:专业级直播音效快速配置指南
  • BetterNCM插件配置全攻略:5步打造你的专属音乐工作站