1、通过UUID【通用唯一识别码】进行策略生成:
说明:UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。
UUID的组成:日期+时间+适中序列+机器码(全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得)
获取OrderId的接口:
public interface OrderId {
public String getOrderId();
}
通过UUID方式获取实现类:
public class OrderIdByUUID implements OrderId {
@Override
public String getOrderId() {
UUID randomId = UUID.randomUUID();
System.out.println(randomId.toString());
return randomId.toString();
}
}
JUnit单元测试:
OrderIdByUUID orderIdByUUID = new OrderIdByUUID();
A:顺序执行生成测试结果:
@Test
public void test() {
//顺序策略生成
System.out.println("********** get orderId start **********");
for (int i = 0; i < 1000; i++) {
orderIdByUUID.getOrderId();//顺序一条一条执行
}
System.out.println("********** get orderId end **********");
}
B:多线程高并发执行测试结果:
private CountDownLatch cdl = new CountDownLatch(500); //栅栏,类似发令枪
@Test
public void test() throws InterruptedException {
System.out.println("********** get orderId start **********");
//多线程高并发生成策略
for (int i = 0; i < 1000; i++) {
new Thread(new OrderThread()).start();//多线程情况下一条一条执行,并非是并发执行操作
cdl.countDown(); //计算方法,每一次调用数值减1
}
Thread.sleep(2000);
System.out.println("********** get orderId end **********");
}
private class OrderThread implements Runnable{
@Override
public void run() {
try {
cdl.await();//所有线程都在当前位置等待
} catch (InterruptedException e) {
e.printStackTrace();
}
orderIdByUUID.getOrderId();
}
}
说明:UUID方式生成策略优点:实现简单,不占用宽带;缺点:无序、不可读、查询慢
2、通过数据库自增进行策略生成:
说明:数据库(DB)自增方式生成策略优点:无代码递增;缺点:数据库单点故障、扩展瓶颈
例如:
在集群数据库中,三台数据库的自增生成策略可以是:
DB_1 [自增初始值:1,自增步长为3];其自增的值为:1、4、7、10...
DB_2 [自增初始值:2,自增步长为3];其自增的值为:2、5、8、11...
DB_3 [自增初始值:3,自增步长为3];其自增的值为:3、6、9、12...
说明:
1、若出现集群数据库的扩建,新增DB_4时,此时【自增初始值】和【自增步长值】设置存在困惑!
2、若出现DB_1、DB_2、DB_3的任意一台机器的服务挂了,则可能会导致所有服务的挂掉【即:数据库(DB)的单点故障】