ignite源码解析
节点间通信:
ServerImpl.java
节点间通信,使用ping检测节点是否存活:
ServerImpl.java
《|》
pingNode(UUID nodeId)
《|》
pingNode(TcpDiscoveryNode node)
《|》
pingNode(InetSocketAddress addr, UUID nodeId, UUID clientNodeId)
《|》
如果是已经加入的节点: ping(IgniteSpiOperationTimeoutHelper timeoutHelper)
如果是新节点,使用socket实现ping检测节点状态;
新节点加入过程:
GridManagerAdapter.class
《|》
startSpi()
《|》
TcpDiscoverySpi.spiStart(String igniteInstanceName)
《|》
ServerImpl.spiStart(String igniteInstanceName)
《|》
joinTopology()
《|》
sendJoinRequestMessage(DiscoveryDataPacket discoveryData)
再平衡相关部分:
IgniteSystemProperties.class
/**
* Time interval for calculating rebalance rate statistics, in milliseconds. Defaults to 60000.
*/
public static final String IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL = "IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL";
CacheMetricsImpl.REBALANCE_RATE_INTERVAL
CacheMetricsImpl.getEstimatedRebalancingFinishTime()
CacheMetricsImpl.rebalancingKeysRate
CacheMetricsImpl.startRebalance
一致性映射部分
Affinity.java
《|》
mapKeyToNode(K key)
《|》
GridCacheAffinityImpl.mapKeysToNodes(@Nullable Collection<? extends K> keys)
《|》
GridCacheAffinityManager.primaryByKey
《|》
partition(Object key, boolean useKeyPart)
《|》
RendezvousAffinityFunction.partition(Object key)
追踪到其哈希算法如下:
((h = key.hashCode()) ^ (h >>> 16)) & mask
其中mask字段的含义如下
/** Mask to use in calculation when partitions count is power of 2. */
/** 当分区数是2的次幂的时候,掩码mask用于计算,这里测试的时候mask的值为1023,partitions从0开始*/
private int mask = -1;
(h = key.hashCode()) ^ (h >>> 16)
这种用法与jdk中HashMap.java
中的hash(Object key)
实现方式一样,
其原理如下:
h = key.hashCode()
:第一步是得到key的hashcode值;
h ^ (h >>> 16)
:将键的hashcode的高16位异或低16位(高位运算),这样即使数组table的length比较小的时候,也能保证高低Bit都参与到Hash的计算中,同时不会有太大的开销;
& mask
:其中mask是partitions数量减一,这个就等效于对partitions做取模运算(%),能这么做的前提是partitions是2的n次幂,取模运算采用位运算性能更好。
参考链接: https://www.cnblogs.com/rese-t/p/8016642.html
一致性id
Ignition.start(IgniteConfiguration cfg)
《|》
IgniteKernal.start(...)
《|》
startProcessor(new PdsConsistentIdProcessor(ctx));
《|》
一致性哈希
GridConsistentHash.java
http://www.jasongj.com/java/concurrenthashmap/
https://www.cnblogs.com/slwenyi/p/6393808.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人