前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊artemis的ConnectionLoadBalancingPolicy

聊聊artemis的ConnectionLoadBalancingPolicy

作者头像
code4it
发布2020-02-24 20:41:47
5090
发布2020-02-24 20:41:47
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下artemis的ConnectionLoadBalancingPolicy

ServerLocatorImpl.selectConnector

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ServerLocatorImpl.java

代码语言:javascript
复制
public final class ServerLocatorImpl implements ServerLocatorInternal, DiscoveryListener {

   //......

   private TransportConfiguration selectConnector() {
      Pair<TransportConfiguration, TransportConfiguration>[] usedTopology;

      flushTopology();

      synchronized (topologyArrayGuard) {
         usedTopology = topologyArray;
      }

      synchronized (this) {
         if (usedTopology != null && useTopologyForLoadBalancing) {
            if (logger.isTraceEnabled()) {
               logger.trace("Selecting connector from topology.");
            }
            int pos = loadBalancingPolicy.select(usedTopology.length);
            Pair<TransportConfiguration, TransportConfiguration> pair = usedTopology[pos];

            return pair.getA();
         } else {
            if (logger.isTraceEnabled()) {
               logger.trace("Selecting connector from initial connectors.");
            }

            int pos = loadBalancingPolicy.select(initialConnectors.length);

            return initialConnectors[pos];
         }
      }
   }

   //......
}
  • ServerLocatorImpl的selectConnector方法会对于useTopologyForLoadBalancing的会通过loadBalancingPolicy.select(usedTopology.length)来获取pos,之后返回usedTopology[pos].getA();否则通过loadBalancingPolicy.select(initialConnectors.length)获取pos,之后返回initialConnectors[pos]

ConnectionLoadBalancingPolicy

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/loadbalance/ConnectionLoadBalancingPolicy.java

代码语言:javascript
复制
public interface ConnectionLoadBalancingPolicy {

   /**
    * Returns the selected index according to the policy implementation.
    *
    * @param max maximum position index that can be selected
    */
   int select(int max);
}
  • ConnectionLoadBalancingPolicy定义了select接口,返回选中的index;它有四个实现类分别是FirstElementConnectionLoadBalancingPolicy、RandomConnectionLoadBalancingPolicy、RoundRobinConnectionLoadBalancingPolicy、RandomStickyConnectionLoadBalancingPolicy

FirstElementConnectionLoadBalancingPolicy

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/loadbalance/FirstElementConnectionLoadBalancingPolicy.java

代码语言:javascript
复制
public final class FirstElementConnectionLoadBalancingPolicy implements ConnectionLoadBalancingPolicy {

   /**
    * @param max param is ignored
    * @return 0
    */
   @Override
   public int select(final int max) {
      return 0;
   }
}
  • FirstElementConnectionLoadBalancingPolicy实现了ConnectionLoadBalancingPolicy接口,其select方法始终返回0

RandomConnectionLoadBalancingPolicy

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/loadbalance/RandomConnectionLoadBalancingPolicy.java

代码语言:javascript
复制
public final class RandomConnectionLoadBalancingPolicy implements ConnectionLoadBalancingPolicy {

   /**
    * Returns a pseudo random number between {@code 0} (inclusive) and {@code max} exclusive.
    *
    * @param max the upper limit of the random number selection
    * @see java.util.Random#nextInt(int)
    */
   @Override
   public int select(final int max) {
      return RandomUtil.randomInterval(0, max);
   }
}
  • RandomConnectionLoadBalancingPolicy实现了ConnectionLoadBalancingPolicy接口,其select方法使用RandomUtil.randomInterval(0, max)随机返回一个index

RoundRobinConnectionLoadBalancingPolicy

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/loadbalance/RoundRobinConnectionLoadBalancingPolicy.java

代码语言:javascript
复制
public final class RoundRobinConnectionLoadBalancingPolicy implements ConnectionLoadBalancingPolicy, Serializable {

   private static final long serialVersionUID = 7511196010141439559L;

   private boolean first = true;

   private int pos;

   @Override
   public int select(final int max) {
      if (first) {
         // We start on a random one
         pos = RandomUtil.randomInterval(0, max);

         first = false;
      } else {
         pos++;

         if (pos >= max) {
            pos = 0;
         }
      }

      return pos;
   }
}
  • RoundRobinConnectionLoadBalancingPolicy实现了ConnectionLoadBalancingPolicy接口,其select在第一次执行的时候随机选择一个pos,之后对pos递增,对于递增之后大于等于max的重置pos为0

RandomStickyConnectionLoadBalancingPolicy

activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/loadbalance/RandomStickyConnectionLoadBalancingPolicy.java

代码语言:javascript
复制
public final class RandomStickyConnectionLoadBalancingPolicy implements ConnectionLoadBalancingPolicy {

   private int pos = -1;

   /**
    * @see java.util.Random#nextInt(int)
    */
   @Override
   public int select(final int max) {
      if (pos == -1) {
         pos = RandomUtil.randomInterval(0, max);
      }

      return pos;
   }
}
  • RandomStickyConnectionLoadBalancingPolicy实现了ConnectionLoadBalancingPolicy接口,其select方法第一次随机选择一个pos,之后都返回该pos

小结

ConnectionLoadBalancingPolicy定义了select接口,返回选中的index;它有四个实现类分别是FirstElementConnectionLoadBalancingPolicy、RandomConnectionLoadBalancingPolicy、RoundRobinConnectionLoadBalancingPolicy、RandomStickyConnectionLoadBalancingPolicy

doc

  • ConnectionLoadBalancingPolicy
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ServerLocatorImpl.selectConnector
  • ConnectionLoadBalancingPolicy
    • FirstElementConnectionLoadBalancingPolicy
      • RandomConnectionLoadBalancingPolicy
        • RoundRobinConnectionLoadBalancingPolicy
          • RandomStickyConnectionLoadBalancingPolicy
          • 小结
          • doc
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档