日交易,根据权重分配流量的算法,根据权重和交易笔数

日交易,根据权重分配流量的算法,根据权重和交易笔数

交易系统,接入多个通道。确保每个通道按权重每日达到相应的交易笔数。
通过实时交易笔数/权重。然后进行升序排序,得到选择通道的次序,进行选择通道。

//a=当前交易笔数/权重。  权重越大,如果交易笔数相等,a越小。权重不变,交易笔数变。a的值大小也在变。
//相对公平的流量分配。
public static void main(String[] args) {
    //定义三个通道的权重,按随机数选拔使用哪个通道。
    //模拟三个通道的权重A 10  B 70  C 30
    //模拟当前交易笔数 A:10  B:50 C:20
    //从数据库查询出list集合
    ChannelD A=new ChannelD("A",10,10);
    ChannelD B=new ChannelD("B",70,50);
    ChannelD C=new ChannelD("C",30,20);
    List<ChannelD> channels=new ArrayList<ChannelD>();
    channels.add(A);
    channels.add(B);
    channels.add(C);
    
    Map<Double,String> map=new HashMap<Double, String>();
    Double trade=0.0;
    //遍历list集合,将交易笔数/权重的值作为key,通道对象为value 存储到map中
    for (ChannelD channel : channels) {
        trade=(double) (channel.getCount()/channel.getWeight());
        map.put(trade,channel.getName());
    }
    
    //将交易笔数/权重的值转化成数据,进行排序。
    Set<Double> set=map.keySet();
    Double[] d=set.toArray(new Double[set.size()]);
    
    //将数据中的值由小到大进行排序
    boolean flag=true;
    for(int i=0;i<d.length-1;i++){
        flag=true;
        for(int j=0;j<d.length-1-i;j++){
            if(d[j]>d[j+1]){
                double temp=d[j];
                d[j]=d[j+1];
                d[j+1]=temp;
                flag=false;
            }
        }
        if(flag){
            break;
        }
    }
    
    //将排好序的通道名字由小到大的顺序,加入到链表集合中
    LinkedList<String> chan=new LinkedList<String>();
    for(int i=0;i<d.length;i++){
        chan.add(map.get(d[i]));
    }
    Iterator<String> it=chan.iterator();
    while (it.hasNext()) {
        //最优到最次的通道选择
        String channelName=it.next();
        System.out.println("OrderChannelServiceImpl.main()"+channelName);
        
    }
}

class ChannelD{
    private String name;//通道名字
    private Integer weight;//权重
    private Integer count;//当前交易笔数
    
    public ChannelD(String name,Integer weight,Integer count){
        this.name=name;
        this.weight=weight;
        this.count=count;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getWeight() {
        return weight;
    }

    public void setWeight(Integer weight) {
        this.weight = weight;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }
    
    
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值