Zookeeper实例Curator API-分布式锁

来源:互联网 发布:kontakt mac 音源 编辑:程序博客网 时间:2024/05/21 15:50

在分布式环境中,为了保证数据的一致性,经常在程序的某个运行点需要进行同步控制,以一个流水号生成为例,普通的后台应用通常采用时间戳的方式生成流水号,但是在用户量非常大的情况下,可能出现并发放的问题,例如:

一个典型的时间戳并发问题

import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.CountDownLatch;/** * * @ClassName: Recipes_NoLock * @Description: TODO(一个典型的时间戳生成的并发问题) * @author RongShu* @date 2017年6月17日 下午2:01:12 * */public class Recipes_NoLock {public static void main(String[] args) throws Exception {final CountDownLatch down = new CountDownLatch(1);for(int i = 0; i < 10; i++){new Thread(new Runnable() {public void run() {try {down.await();} catch ( Exception e ) {}SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss|SSS");String orderNo = sdf.format(new Date());System.err.println("生成的订单号是 : "+orderNo);}}).start();}down.countDown();}}输出生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473生成的订单号是 : 14:01:51|473


Curator处理并发

package test_test.test_haha;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.CountDownLatch;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.locks.InterProcessMutex;import org.apache.curator.retry.ExponentialBackoffRetry;/** * * @ClassName: Recipes_Lock * @Description: TODO(使用Curator实现分布式锁功能) * @author RongShu* @date 2017年6月17日 下午2:03:07 * */public class Recipes_Lock {static String lock_path = "/curator_recipes_lock_path";    static CuratorFramework client = CuratorFrameworkFactory.builder()            .connectString("localhost:2181")            .retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();public static void main(String[] args) throws Exception {client.start();final InterProcessMutex lock = new InterProcessMutex(client,lock_path);final CountDownLatch down = new CountDownLatch(1);for(int i = 0; i < 30; i++){new Thread(new Runnable() {public void run() {try {down.await();lock.acquire();} catch ( Exception e ) {}SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss|SSS");String orderNo = sdf.format(new Date());System.out.println("生成的订单号是 : "+orderNo);try {lock.release();} catch ( Exception e ) {}}}).start();}down.countDown();}}输出生成的订单号是 : 14:05:24|907生成的订单号是 : 14:05:24|919生成的订单号是 : 14:05:24|948生成的订单号是 : 14:05:24|984生成的订单号是 : 14:05:24|992生成的订单号是 : 14:05:25|005生成的订单号是 : 14:05:25|010生成的订单号是 : 14:05:25|010生成的订单号是 : 14:05:25|029生成的订单号是 : 14:05:25|029生成的订单号是 : 14:05:25|060生成的订单号是 : 14:05:25|067生成的订单号是 : 14:05:25|077生成的订单号是 : 14:05:25|080生成的订单号是 : 14:05:25|085生成的订单号是 : 14:05:25|089生成的订单号是 : 14:05:25|095生成的订单号是 : 14:05:25|098生成的订单号是 : 14:05:25|103生成的订单号是 : 14:05:25|109生成的订单号是 : 14:05:25|121生成的订单号是 : 14:05:25|126生成的订单号是 : 14:05:25|131生成的订单号是 : 14:05:25|135生成的订单号是 : 14:05:25|139生成的订单号是 : 14:05:25|714生成的订单号是 : 14:05:25|725生成的订单号是 : 14:05:25|731生成的订单号是 : 14:05:25|736生成的订单号是 : 14:05:25|742


参考

1.《从Paxos到Zookeeper:分布式一致性原理与实践》

2. http://curator.apache.org/apidocs/index.html



原创粉丝点击