企业网站的职能主要有,建行,昆明优化官网服务,温州网站优化关键词LocalGrainDirectory 详解
LocalGrainDirectory是Orleans分布式系统中负责本地Grain目录管理的核心组件#xff0c;它实现了分布式哈希表(DHT)风格的Grain定位服务。
类图
#mermaid-svg-Y9v3byHPfAfBrOZm {font-family:trebuchet ms,verdana,arial,sans-serif;fon…LocalGrainDirectory 详解LocalGrainDirectory是Orleans分布式系统中负责本地Grain目录管理的核心组件它实现了分布式哈希表(DHT)风格的Grain定位服务。类图LocalGrainDirectory-ILogger log-SiloAddress? seed-ISiloStatusOracle siloStatusOracle-IInternalGrainFactory grainFactory-object writeLock-IServiceProvider _serviceProvider-DirectoryMembership directoryMembership-bool Running-Catalog? _catalogSiloAddress MyAddressIGrainDirectoryCache DirectoryCacheLocalGrainDirectoryPartition DirectoryPartitionRemoteGrainDirectory RemoteGrainDirectoryRemoteGrainDirectory CacheValidatorGrainDirectoryHandoffManager HandoffManagerStart() : voidStopAsync() : TaskSiloStatusChangeNotification(SiloAddress, SiloStatus) : voidRegisterAsync(GrainAddress, int) : TaskAddressAndTagUnregisterAsync(GrainAddress, UnregistrationCause, int) : TaskLookupAsync(GrainId, int) : TaskAddressAndTagLocalLookup(GrainId, out AddressAndTag) : boolCalculateGrainDirectoryPartition(GrainId)«interface»ILocalGrainDirectoryStart() : voidStopAsync() : TaskRegisterAsync(GrainAddress, int) : TaskAddressAndTagUnregisterAsync(GrainAddress, UnregistrationCause, int) : TaskLookupAsync(GrainId, int) : TaskAddressAndTagLocalLookup(GrainId, out AddressAndTag) : bool«interface»ISiloStatusListenerSiloStatusChangeNotification(SiloAddress, SiloStatus) : void«interface»ILifecycleParticipantISiloLifecycleParticipate(ISiloLifecycle) : voidLocalGrainDirectoryPartitionAddSingleActivation(GrainAddress, GrainAddress?) : AddressAndTagRemoveActivation(GrainId, ActivationId, UnregistrationCause) : voidLookUpActivation(GrainId) : AddressAndTagGetItems()«interface»IGrainDirectoryCacheAddOrUpdate(GrainAddress, int) : voidLookUp(GrainId, out GrainAddress) : boolRemove(GrainId) : boolKeyValues IEnumerable~(GrainAddress, int)协作图ClientLocalGrainDirectoryLocalGrainDirectoryPartitionDirectoryCacheRemoteGrainDirectorySiloStatusOracleGrain注册流程RegisterAsync(grainAddress, hopCount)CalculateGrainDirectoryPartition(grainId)AddSingleActivation(address, previousAddress)AddressAndTag resultAddOrUpdate(result.Address, result.VersionTag)返回注册结果RegisterAsync(address, previousAddress, hopCount1)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, hopCount1)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){inthashunchecked((int)grainId.GetUniformHashCode());// 在排序的Silo列表中查找第一个哈希值小于等于目标哈希的Silofor(varindexexisting.MembershipRingList.Count-1;index0;--index){varitemexisting.MembershipRingList[index];if(IsSiloNextInTheRing(item,hash,excludeMySelf)){returnitem;}}}2. 请求转发机制当当前Silo不是Grain的目录所有者时会进行请求转发publicSiloAddress?CheckIfShouldForward(GrainIdgrainId,inthopCount,stringoperationDescription){varownerCalculateGrainDirectoryPartition(grainId);if(ownerisnull||owner.Equals(MyAddress))returnnull;if(hopCountHOP_LIMIT)// 跳数限制为6thrownewOrleansException($Hop limit reached);returnowner;// 转发到目标Silo}3. 缓存管理LocalGrainDirectory维护本地缓存以提高查找性能publicboolLocalLookup(GrainIdgrain,outAddressAndTagresult){// 首先检查缓存varaddressGetLocalCacheData(grain);if(address!default){resultnew(address,0);returntrue;}// 如果是本地分区检查本地目录if(silo.Equals(MyAddress)){resultGetLocalDirectoryData(grain);returnresult.Address!null;}returnfalse;}4. 集群成员变化处理LocalGrainDirectory监听Silo状态变化并相应调整目录和缓存publicvoidSiloStatusChangeNotification(SiloAddressupdatedSilo,SiloStatusstatus){if(status.IsTerminating()){CacheValidator.WorkItemGroup.QueueAction(()RemoveServer(updatedSilo,status));}elseif(statusSiloStatus.Active){CacheValidator.WorkItemGroup.QueueAction(()AddServer(updatedSilo));}}关键设计特点线程安全使用writeLock对象确保目录操作的线程安全容错性支持Silo故障时的目录分区重新分配性能优化本地缓存减少远程查找开销可扩展性支持动态集群成员变化一致性确保目录信息在集群中的一致性LocalGrainDirectory是Orleans分布式系统的核心组件它通过分布式哈希表算法实现了高效的Grain定位服务为整个系统的可扩展性和可靠性提供了基础支撑。