这里以我做的系统案例来说,这是一套短信系统,客户端就扔一个号码和短信内容过来,服务端需要首先根据配置判断是否区分运营商,然后根据号段走不同的运营商网关去提交短信
sourceId表示接入系统的唯一标识ID,如果不区分的,走下面紫色的三条线,服务端为该接入方配置了三个三网(不区分运营商)网关,并且配置了不同的比例,意思就是60%请求走gw1出去,20%走gw2出去,那么gw3虽然配置了,但是给的比例是0,那么剩下的20%就是丢弃了;同样区分的话,走上面的情况,首先根据号段数据找到对应的运营商,去该运营商配置的网关,按照比例下发;
List<GwRouterInfo> gwChoose = new ArrayList<GwRouterInfo>(Collections.nCopies(100, gwNull));首先初始化一个长度100的list,里面的元素都是空元素,gwNull是GwRouterInfo对象,里面的属性设置空
GwRouterInfo gwNull = new GwRouterInfo(); gwNull.setGwId(0L);
int index = 0; for (int i = 0; i < size; i++) { GwRouterInfo gri = griList.get(i); for (int j = index; j < index + gri.getRatio(); j++) { gwChoose.add(j, gri); } index = gri.getRatio(); }这里size就是每组的大小,比如上面不区分运营商的是gw1,gw2,gw3,那么这个size就是3
这里的循环就将gwChoose的list给设置好了,按照预定的比例,在list的各个位置设置好值,20%的那么list里必然有20个位置的值是该网关对象,其它类似;
int gwIndex = Utils.random(100); GwRouterInfo gw = gwChoose.get(gwIndex); if (gw.getGwId() == 0L) { return null; } return gw;
后面就是产生一个0-100的随机数了,根据该随机下标去取list中对应的元素,就得到了该网关,当然这种场景,数据量越大,比例越准确。
以上这种方法实现该功能是最常用简单的;
核心就是各项比例以及每种比例对应的值,通过一个数组或列表按照比例给各项赋值,最终产生一个随机下标拿到该对象即可。