分布式助手Zookeeper(七)

2024-05-15 04:38
文章标签 zookeeper 分布式 助手

本文主要是介绍分布式助手Zookeeper(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[b][color=olive][size=large]上篇文章,散仙介绍了,分布式环境下,基于zookeeper实现的公平的锁,这篇,我们来看下,如何使用zookeeper来完成非公平锁的模拟,在这之前,我们先来,了解下公平锁和非公平锁的区别。

JAVA JDK提供了公平锁,与非公平锁,但这种实现是基于同一个JVM来说的,
如果同一台机器上,不同的JVM,则可以使用文件锁,来实现,但是这些并不是分布式的模式,虽然可以通过RMI的方式来实现,
但比较繁琐。在分布式的场景里,我们可以轻松的使用zookeeper来实现公平锁与非公平锁

基于zookeeper实现的公平锁与非公平锁的区别

先来通俗的看下二者的区别

公平锁,即先来者先得,只有一个厕所的卫生间,想进去只能是按排队顺序来的,比较公平,first挂掉或释放后,会由secend得到锁,依次类推。

非公平锁,比较暴力,只有一个厕所的卫生间,不用排队,外面围了一堆人等着上厕所,当里面的人出来时,外面的人谁强势,而且力气大,谁就能进去,
极端情况下,如果两个人一样力气大,这时候就该厕所门发挥作用了,一次只能挤进去一个人,反映到我们的程序中,这时候就需要代码同步了,保证
任何时候,只有一个人可以拿到锁。

二者的相同点,都保证了,任何情况下,都只能一个人得到某种资源。但实现的方式不同。
[/size][/color][/b]
[b][color=green][size=large]
实现简述:分布式非公平锁的创建,除了得到锁外,其他的多个监听器,监听同一个锁的情况

实现的流程步骤如下:
[table]
|序号|介绍
|1|创建一个持久znode
|2|多个程序并发的去zk服务上,创建同一个短暂无时序性的节点路径,当一个程序,得到锁时,其他程序,只能监听,不能再次创建,创建时需要同步策略
|3|同一时刻只能有一个创建成功者,能得到锁
|4|没成功者,统一监视得到锁的节点
|5|如果中间得到锁的节点,释放了,或者出意外挂掉了,则重复步骤1,2,3,4
[/table]
拓扑图如下:
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0094/6184/d1c73404-ca54-3431-bb0c-2f098577ee03.jpg[/img]
[b][color=olive][size=large]代码如下:[/size][/color][/b]
/***
* @author qin dong liang
*
* */
public class LockUnFair3 implements Watcher {


/**
* ZK实例
* */
private ZooKeeper zk;

/**原子计数锁,防止在zk没有连上前,执行CURD操作*/
private CountDownLatch down=new CountDownLatch(1);

public LockUnFair3() {
// TODO Auto-generated constructor stub
}



public LockUnFair3(String host)throws Exception {
this.zk=new ZooKeeper(host, 5000 , new Watcher() {

@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
/**链接上zk服务,岂可取消阻塞计数**/
if(event.getState()==KeeperState.SyncConnected){
down.countDown();
}

}
});
}
/**
* 字符编码
*
* **/
private static final Charset CHARSET=StandardCharsets.UTF_8;

@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub

if(event.getType()==Event.EventType.NodeDeleted){

//如果发现,监听的节点,挂掉了,那么就重新,进行监听
try{
// System.out.println("注意有锁退出或释放,公平锁开始抢占........");
System.out.println("3我可以去抢占了");
createTemp();
// check();
}catch(Exception e){
e.printStackTrace();

}
}
}

SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


/**
* 关闭zk连接
*
* **/
public void close()throws Exception{
zk.close();
}

Random random=new Random();
/***
* 创建锁node,注意是抢占 的
*
*
* */
public void createTemp()throws Exception{


Thread.sleep(random.nextInt(2500));//加个线程休眠,实现模拟同步功能

if(zk.exists("/a/b", this) != null){
System.out.println("锁被占用,监听进行中......");
}else{



String data=zk.create("/a/b", "a".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Lock3创建锁成功,节点路径: "+data);

}

// System.out.println("2"+data);

}

public static void main(String[] args)throws Exception {

//Slave s=new Slave("192.168.120.128:2181");
LockUnFair3 lock=new LockUnFair3("192.168.120.128:2181");
// lock.createPersist();//创建主节点
lock.createTemp();
// lock.check();
Thread.sleep(Long.MAX_VALUE);
lock.close();

}



}


[b][color=green][size=large]以上是实现的代码,需要注意的是,在最后抢占锁时,可能会一下多个节点同时去建立名字一样的节点,由于zookeeper的特点,只能由一个建立成功,其他的会抛出异常,为了避免这种情况,散仙,目前的想到的是,在创建一个节点时,通过线程随机休眠,来达到一个同步情况,但这扔有极端情况,虽然几率很小,就是分布式环境下可能有多个节点随机休眠的时间是一样的,所以第二种做法,可以在zk节点维持一个有序的分布式队列,每次只能第一个得到锁,其他的继续等待,下一次的抢占,如此一来,就能保证任何时刻只有一个节点得到锁。

[/size][/color][/b]
[b][color=olive][size=large]
如有什么不足之处,欢迎指正! ^_^
[/size][/color][/b]

这篇关于分布式助手Zookeeper(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990831

相关文章

基于JMS的分布式爬虫系统的设计与实现7

随着互联网技术的飞速发展,网络信息以指数型趋势高速增长。对于一个要对数据进行统计分析的系统而言,搜集数据的过程是冗长枯燥的。基于这一现实,分布式爬虫系统获得了发展的契机。系统通过多台服务器的协调运行,成倍地提高了爬虫的效率。当然,分布式系统在获得效率提升的同时也大大增加了系统的复杂程度,开发人员需要考虑多方面因素以确保系统的正常运转。 本文对分布式爬虫系统的架构做了深入的讨论,给出了选择该架构的

6,串口编程———通过串口助手发送数据,控制led亮灭

//功能:串口助手每次发送数据格式:@0000& // 第二个字节控制LED1亮灭 // 第三个字节控制LED2亮灭 // 第四个字节控制LED3亮灭 // 第无个字节控制LED4亮灭 //要求:代码能够一直运行,能够接收多字节数据 上节讲了串口的基本发送接收数据,本节应用一下。 以上功能可写成这样:发送和接收数据的解析函数: void DataAnaly(void){if(us

linux-centos安装solr及通过zookeeper搭建solr集群

一、安装单机版solr(以solr-4.9.1.zip为例)1、将solr-4.9.1\example\webapps下的solr.war上传到linux中的tomcat下webapps2、运行tomcat,会自动出现一个solr文件夹3、拷取jar包      将solr-4.9.1\example\lib\ext下的jar包拷至tomcat下/webapps/solr/WEB-INF/lib下

linux下安装zookeeper(Standalone与Distributed模式)

环境准备       三台虚拟机:spark1,spark2,spark3       三台虚拟机已经实现免密码登录 一、搭建zookeeper的Standalone(单机)模式,在spark1上搭建。     1.向服务器上传zookeeper-3.4.6.tar.gz(版本自行选择),或通过wget下载         [root@spark1 soft]# wget http:

linux下安装hadoop3.0(全分布式)

一、hadoop3.x的新特性 1. Java版本需要1.8 2. Shell脚本已部分重写(Shell script rewrite) 3. HDFS新特性 支持可删除编码(Erasure Coding)使用EC来替代副本机制,可省略大约50%的存储空间,此时副本个数为1就行支持两个及以上的namenode(即一个namenode与多个datanode)datanode数据写入平衡默认多

分布式和集群的区别

分布式系统(Distributed System)和集群(Cluster)是两个经常被提及的计算机科学概念,它们在提高系统性能和可靠性方面都扮演着重要角色,很多同学会觉得这俩个是同一种东西,但事实上它们之间有着本质的区别。 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成。在分布式系统中,这些节点可能是物理上分散的,它们之间通过消息传递进行通信和协调。分布式系统的

XTuner 微调个人小助手认知实战

XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。GitHub - InternLM/xtuner: An efficient, flexible and full-featured toolkit for fine-tuning LLM (InternLM2, Llama3, Phi3, Qwen, Mistral, ...)An efficient, flexi

[转载]亿级Web系统搭建——单机到分布式集群

本文转载自徐汉彬前辈的博文,原文地址:点击打开链接 自己通过这篇博文学到了很多,谢谢原文作者,特此转发分享下 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层次的缓存机制。在不同的压力阶段,我们会遇到不同的问题,通过搭建不同的服

Hadoop2.8.0+Zookeeper3.4.8+Hbase1.2.6完全分布式配置

准备环境 三台Ubuntu系统的电脑 同一局域网 Java1.8.0_121 Hadoop2.8.0 Zookeeper3.4.8 Hbase1.2.6 大家可以自行取官网下载各工具的最新版本. Hadoop完全分布配置 安装JDK 解压java1.8.0_121.tar.gz到/opt/jvm下,编辑 vim /etc/profile文件,添加jdk环境变量:

从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

注意: 1. 我们要实现自发自收,要将tx,rx连起来 2.发送的 不能是中文符号,因为这可能导致,读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致 3.注意同时定义两个槽函数的时候两个槽函数都会被调用,我们应该注释掉不需要的那个,爆率剩下的那个避免产生干扰 实现收发消息数的显示: //并且做了一个历史判断 -->避免重复记录