美文网首页
zk开源客户端/分布式锁

zk开源客户端/分布式锁

作者: bobcorbett | 来源:发表于2017-11-22 10:12 被阅读0次
ZkClient简介

ZkClient是一个开源客户端,在Zookeeper原生API接口的基础上进行了包装,更便于开发人员使用。内部实现了Session超时重连,Watcher反复注册等功能。像dubbo等框架对其也进行了集成使用。
虽然ZkClient对原生API进行了封装,但也有它自身的不足之处:

  • 几乎没有参考文档;
  • 异常处理简化(抛出RuntimeException);
  • 重试机制比较难用;
  • 没有提供各种使用场景的实现;
Curator简介

Curator是Netflix公司开源的一套Zookeeper客户端框架,和ZkClient一样,解决了非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等。目前已经成为Apache的顶级项目。另外还提供了一套易用性和可读性更强的Fluent风格的客户端API框架。
除此之外,Curator中还提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。


  • zkClient
    • ZkClient在ZooKeeper原生API接口之上进行了包装,是一个更易用的ZooKeeper客户端
    • 与ZooKeeper客户端最大区别提供的API没有了Watcher注册的功能,而是引入了Listener的概念
  • Curator
    • Fluent风格的Java编码,流式
    • Curator引入了Cache来替换Watcher实现对ZooKeeper服务端事件的监听
    • 分布式锁/分布式计数器DistributedAtomicInteger/分布式栅栏Barrier
    • 提供一些对数据路径节点操作的ZKPaths和EnsurePath
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;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

/**
* curator分布式锁实现
*/
public class Recipes_lock {
    static String lock_path = "/curator_recipes_lock_path";
    static CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString("127.0.0.1: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 orederNo = sdf.format(new Date());
                    System.out.println("生成的订单号为:" + orederNo);
                    try {
                        lock.release();
                    } catch (Exception e) {
                    }
                }
            }).start();
        }
        down.countDown();
    }
}

输出结果:

生成的订单号为:15:32:33|728
生成的订单号为:15:32:33|781
生成的订单号为:15:32:33|849
生成的订单号为:15:32:33|879
生成的订单号为:15:32:33|897
生成的订单号为:15:32:33|972
生成的订单号为:15:32:34|013
生成的订单号为:15:32:34|057
生成的订单号为:15:32:34|130
生成的订单号为:15:32:34|197
生成的订单号为:15:32:34|232
生成的订单号为:15:32:34|282
生成的订单号为:15:32:34|367
生成的订单号为:15:32:34|404
生成的订单号为:15:32:34|425
生成的订单号为:15:32:34|461
生成的订单号为:15:32:34|482
生成的订单号为:15:32:34|515
生成的订单号为:15:32:34|550
生成的订单号为:15:32:34|573
生成的订单号为:15:32:34|600
生成的订单号为:15:32:34|624
生成的订单号为:15:32:34|647
生成的订单号为:15:32:34|670
生成的订单号为:15:32:34|715
生成的订单号为:15:32:34|752
生成的订单号为:15:32:34|774
生成的订单号为:15:32:34|793
生成的订单号为:15:32:34|811
生成的订单号为:15:32:34|836

相关文章

  • (3)Zookeeper分布式锁实现原理

    本文基于Curator开源框架,建议用封装好分布式锁实现,快捷省事儿 两个客户端争抢zk分布式锁(zk锁,锁zk节...

  • zookeeper分布式锁demo(v1)

    zk客户端依赖 DIY ZK 分布式锁 使用测试 curator 自带分布式锁 参考资料 zookeeper实现分...

  • 分布式锁之ZooKeeper 分布式锁

    一、ZooKeeper 分布式锁机制 当有多个客户端要获取ZK 里中的一把锁,即ZK 上的一个节点。假设客户端 A...

  • zk开源客户端/分布式锁

    ZkClient简介 ZkClient是一个开源客户端,在Zookeeper原生API接口的基础上进行了包装,更便...

  • 分布式锁zk|redis实现demo

    [toc] redis分布式锁 zk分布式锁 zk分布式锁实现原理图 pom中添加依赖 properties添加配...

  • 基于zookeeper的分布式锁

    复习 临时顺序节点 zk实现分布式锁原理 - 加锁 zk实现分布式锁原理 - 解锁

  • 分布式锁(redis和zookeeper)

    zookerper分布式锁zk实现分布式锁原理:使用zk临时节点(连接断开后就会删除) +事件通知(wacther...

  • redis笔记二

    分布式锁redis实现 具体原理参考:老钱掘金小册 分布式锁zk实现

  • zookeeper

    作用 在分布式环境中保证数据的强一致性。 使用场景如 分布式锁zk保证所有客户端只有一个客户端能够创建临时目录,最...

  • 从核心源码分析zookeeper-watch机制

    基于3.4.14zookeeper提供watch机制实现,客户端对节点数据变化的事件监听。再zk实现的分布式锁,注...

网友评论

      本文标题:zk开源客户端/分布式锁

      本文链接:https://www.haomeiwen.com/subject/krknvxtx.html