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