news 2026/7/7 16:49:23

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/7/7 19:39:13

Kafka 消息积压全攻略:从原理到实战处理方案

Kafka 消息积压全攻略:从原理到实战处理方案 引言 Kafka 在大规模分布式系统中广泛应用,但“消息积压(Consumer Lag)”是最常见、也最令人头疼的运维问题。所谓积压,就是生产速度持续超过消费速度,导致消息在 Kafka 分区中堆积。 在实际生产中,“降低生产速度”通常不…

作者头像 李华
网站建设 2026/7/7 19:00:05

深入理解 RocketMQ 4.x 生产者 SDK:从配置、原理到最佳实践

深入理解 RocketMQ 4.x 生产者 SDK:从配置、原理到最佳实践 Apache RocketMQ 是一个分布式消息和流数据平台,以其低延迟、高吞吐、高可用和强大的消息堆积能力著称。其生产者(Producer)是消息发送的核心组件,理解其内部机制和最佳实践是构建稳定高效消息系统的关键。 一、…

作者头像 李华
网站建设 2026/7/7 0:07:13

CPU中的晶体管是如何忠诚执行你的C代码的?

在计算机技术体系中&#xff0c;高级语言编写的代码最终都要转化为硬件可直接执行的电信号。本文以一段极简C语言代码为起点&#xff0c;逐步拆解其到汇编语言的转换过程&#xff0c;最终深入硬件底层&#xff0c;解析从汇编指令到晶体管导通截止的完整执行链路&#xff0c;清晰…

作者头像 李华
网站建设 2026/7/7 15:43:37

LobeChat停止序列Stop Sequence配置技巧

LobeChat停止序列Stop Sequence配置技巧 在构建现代AI对话系统时&#xff0c;一个看似微小却极为关键的细节往往决定了用户体验的成败&#xff1a;如何让模型“恰到好处”地停下来。大语言模型&#xff08;LLM&#xff09;本质上是自回归生成器&#xff0c;它们擅长延续文本&a…

作者头像 李华
网站建设 2026/7/7 11:54:04

数据库分片是什么?有哪些分片策略?

随着数字时代的爆炸式发展&#xff0c;数据量正以前所未有的速度激增。传统的单体数据库在面对海量数据和高并发访问时&#xff0c;其存储能力、计算性能和I/O吞吐量逐渐成为系统发展的瓶颈。为了突破这些限制&#xff0c;分布式数据库架构应运而生&#xff0c;而数据库分片&am…

作者头像 李华
网站建设 2026/7/6 23:16:30

Python金融数据分析利器:Mootdx通达信数据接口完整教程

Python金融数据分析利器&#xff1a;Mootdx通达信数据接口完整教程 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析的道路上&#xff0c;数据获取往往是最大的瓶颈。面对复杂的通达…

作者头像 李华