news 2026/4/15 14:46:02

LocalGrainDirectory详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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定位服务,为整个系统的可扩展性和可靠性提供了基础支撑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 6:30:43

OBS Studio直播画质提升实战指南:7个立竿见影的设置技巧

OBS Studio直播画质提升实战指南&#xff1a;7个立竿见影的设置技巧 【免费下载链接】obs-studio 项目地址: https://gitcode.com/gh_mirrors/obs/obs-studio 想要实现专业级的直播画质&#xff0c;OBS Studio直播优化和推流质量提升是每个主播必须掌握的技能。无论是直…

作者头像 李华
网站建设 2026/4/15 14:13:06

PostgreSQL vs MySQL:工程视角下的数据库选型终极指南

PostgreSQL vs MySQL 数据库选型终极指南(生产级实战版) 数据库选型不是功能清单的比拼,而是对业务复杂度、团队能力与未来不确定性的判断。 在实际项目中,“到底选 PostgreSQL 还是 MySQL”几乎是每个技术团队都会遇到的经典问题。它表面看是数据库对比,实质上是工程哲学…

作者头像 李华
网站建设 2026/4/15 14:10:05

构建AI知识库助手:LobeChat与RAG技术集成方案

构建AI知识库助手&#xff1a;LobeChat与RAG技术集成方案 在企业数字化转型加速的今天&#xff0c;员工每天面对海量文档、政策手册和内部知识库&#xff0c;却常常“知道信息存在&#xff0c;但找不到答案”。传统搜索引擎返回的是链接列表&#xff0c;而通用大模型如ChatGPT虽…

作者头像 李华
网站建设 2026/4/15 13:51:19

FUXA开源SCADA系统实战手册:5步打造工业可视化监控平台

FUXA开源SCADA系统实战手册&#xff1a;5步打造工业可视化监控平台 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA FUXA是一款功能强大的Web开源工业过程可视化软件&#xf…

作者头像 李华
网站建设 2026/4/12 0:01:46

从零开始部署LobeChat:完整教程助你快速上手

从零开始部署 LobeChat&#xff1a;完整教程助你快速上手 在大语言模型&#xff08;LLM&#xff09;席卷全球的今天&#xff0c;越来越多开发者和企业希望拥有一个专属的 AI 对话系统。但直接调用 OpenAI 或 Hugging Face 的 API 接口&#xff0c;往往意味着要面对一堆代码、复…

作者头像 李华