日交易,根据权重分配流量的算法,根据权重和交易笔数
交易系统,接入多个通道。确保每个通道按权重每日达到相应的交易笔数。
通过实时交易笔数/权重。然后进行升序排序,得到选择通道的次序,进行选择通道。
//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;
}
}