大家好,今天小编来为大家解答zookeeper实战这个问题,Apache ZooKeeper很多人还不知道,现在让我们一起来看看吧!

websocket 高性能 实战

疯狂创客圈 Java高并发【亿级流量聊天室实战】实战系列【博客园总入口】

zookeeper实战(Apache ZooKeeper)

架构师成长+面试必备之高并发基础书籍【 Netty Zookeeper Redis高并发实战】

很多项目,都需要基于 Websocket协议做在线客服、在线推送、在线聊天,虽然 Tomcat内置支持 Websocket协议,但是由于 Tomcat的吞吐量、连接数都很低,作为测试是可以的。在生产环境,一定需要使用高吞吐量、高连接数的 Netty服务器进行替代。

之所以 Netty性能高,因为其使用的是 Reactor反应器模式。关于反应器模式原理,请参见《Netty Zookeeper Redis高并发实战》一书。

聊天过程gif演示:

聊天示意图:

zookeeper实战(Apache ZooKeeper)

Netty搭建的服务器基本上都是差不多的写法:

绑定主线程组和工作线程组,这部分对应架构图中的事件循环组。其原理,,请参见《Netty Zookeeper Redis高并发实战》一书。

重点就是ChannelInitializer的配置,以异步的方式启动,最后是结束的时候关闭线程组。

下面是用websocket做聊天室的逻辑:

源码网址: Java高并发研习社群【博客园总入口】

疯狂创客圈经典图书:《Netty Zookeeper Redis高并发实战》面试必备+面试必备+面试必备

Hadoop实战的作品目录

第一部分Hadoop——一种分布式编程框架

第1章Hadoop简介2

1.1为什么写《Hadoop实战》3

1.2什么是Hadoop3

1.3了解分布式系统和Hadoop4

1.4比较SQL数据库和Hadoop5

1.5理解MapReduce6

1.5.1动手扩展一个简单程序7

1.5.2相同程序在MapReduce中的扩展9

1.6用Hadoop统计单词——运行第一个程序11

1.7Hadoop历史15

1.8小结16

1.9资源16

第2章初识Hadoop17

2.1Hadoop的构造模块17

2.1.1NameNode17

2.1.2DataNode18

2.1.3Secondary NameNode19

2.1.4JobTracker19

2.1.5TaskTracker19

2.2为Hadoop集群安装SSH21

2.2.1定义一个公共账号21

2.2.2验证SSH安装21

2.2.3生成SSH密钥对21

2.2.4将公钥分布并登录验证22

2.3运行Hadoop22

2.3.1本地(单机)模式23

2.3.2伪分布模式24

2.3.3全分布模式25

2.4基于Web的集群用户界面28

2.5小结30

第3章Hadoop组件31

3.1HDFS文件操作31

3.1.1基本文件命令32

3.1.2编程读写HDFS35

3.2剖析MapReduce程序37

3.2.1Hadoop数据类型39

3.2.2Mapper40

3.2.3Reducer41

3.2.4Partitioner:重定向Mapper输出41

3.2.5Combiner:本地reduce43

3.2.6预定义mapper和Reducer类的单词计数43

3.3读和写43

3.3.1InputFormat44

3.3.2OutputFormat49

3.4小结50

第二部分实战

第4章编写MapReduce基础程序52

4.1获得专利数据集52

4.1.1专利引用数据53

4.1.2专利描述数据54

4.2构建MapReduce程序的基础模板55

4.3计数60

4.4适应Hadoop API的改变64

4.5Hadoop的Streaming67

4.5.1通过Unix命令使用Streaming68

4.5.2通过脚本使用Streaming69

4.5.3用Streaming处理键/值对72

4.5.4通过Aggregate包使用Streaming75

4.6使用combiner提升性能80

4.7温故知新83

4.8小结84

4.9更多资源84

第5章高阶MapReduce85

5.1链接MapReduce作业85

5.1.1顺序链接MapReduce作业85

5.1.2具有复杂依赖的MapReduce链接86

5.1.3预处理和后处理阶段的链接86

5.2联结不同来源的数据89

5.2.1Reduce侧的联结90

5.2.2基于DistributedCache的**联结98

5.2.3半联结:map侧过滤后在reduce侧联结101

5.3创建一个Bloom filter102

5.3.1Bloom filter做了什么102

5.3.2实现一个Bloom filter104

5.3.3Hadoop 0.20以上版本的Bloom filter110

5.4温故知新110

5.5小结111

5.6更多资源112

第6章编程实践113

6.1开发MapReduce程序113

6.1.1本地模式114

6.1.2伪分布模式118

6.2生产集群上的监视和调试123

6.2.1计数器123

6.2.2跳过坏记录125

6.2.3用IsolationRunner重新运行出错的任务128

6.3性能调优129

6.3.1通过combiner来减少网络流量129

6.3.2减少输入数据量129

6.3.3使用压缩129

6.3.4重用JVM132

6.3.5根据猜测执行来运行132

6.3.6代码重构与算法重写133

6.4小结134

第7章细则手册135

7.1向任务传递作业定制的参数135

7.2探查任务特定信息137

7.3划分为多个输出文件138

7.4以数据库作为输入输出143

7.5保持输出的顺序145

7.6小结146

第8章管理Hadoop147

8.1为实际应用设置特定参数值147

8.2系统体检149

8.3权限设置151

8.4配额管理151

8.5启用回收站152

8.6删减DataNode152

8.7增加DataNode153

8.8管理NameNode和SNN153

8.9恢复失效的NameNode155

8.10感知网络布局和机架的设计156

8.11多用户作业的调度157

8.11.1多个JobTracker158

8.11.2公平调度器158

8.12小结160

第三部分Hadoop也疯狂

第9章在云上运行Hadoop162

9.1Amazon Web Services简介162

9.2安装AWS163

9.2.1获得AWS身份认证凭据164

9.2.2获得命令行工具166

9.2.3准备SSH密钥对168

9.3在EC2上安装Hadoop169

9.3.1配置安全参数169

9.3.2配置集群类型169

9.4在EC2上运行MapReduce程序171

9.4.1将代码转移到Hadoop集群上171

9.4.2访问Hadoop集群上的数据172

9.5清空和关闭EC2实例175

9.6Amazon Elastic MapReduce和其他AWS服务176

9.6.1Amazon Elastic MapReduce176

9.6.2AWS导入/导出177

9.7小结177

第10章用Pig编程178

10.1像Pig一样思考178

10.1.1数据流语言179

10.1.2数据类型179

10.1.3用户定义函数179

10.2安装Pig179

10.3运行Pig180

10.4通过Grunt学习Pig Latin182

10.5谈谈Pig Latin186

10.5.1数据类型和schema186

10.5.2表达式和函数187

10.5.3关系型运算符189

10.5.4执行优化196

10.6用户定义函数196

10.6.1使用UDF196

10.6.2编写UDF197

10.7脚本199

10.7.1注释199

10.7.2参数替换200

10.7.3多查询执行201

10.8Pig实战——计算相似专利的例子201

10.9小结206

第11章Hive及Hadoop群207

11.1Hive207

11.1.1安装与配置Hive208

11.1.2查询的示例210

11.1.3深入HiveQL213

11.1.4Hive小结221

11.2其他Hadoop相关的部分221

11.2.1HBase221

11.2.2ZooKeeper221

11.2.3Cascading221

11.2.4Cloudera222

11.2.5Katta222

11.2.6CloudBase222

11.2.7Aster Data和Greenplum222

11.2.8Hama和Mahout223

11.3小结223

第12章案例研究224

12.1转换《****》1100万个库存图片文档224

12.2挖掘中国移动的数据225

12.3在StumbleUpon推荐最佳网站229

12.3.1分布式StumbleUpon的开端230

12.3.2HBase和StumbleUpon230

12.3.3StumbleUpon上的更多Hadoop应用236

12.4搭建面向企业查询的分析系统——IBM的ES2项目238

12.4.1ES2系统结构240

12.4.2ES2爬虫241

12.4.3ES2分析242

12.4.4小结249

12.4.5参考文献250

附录AHDFS文件命令251

【SpringBoot实战】分布式定时任务锁Shedlock

在我们业务开发过程中,经常会有需求做一些定时任务,但是由于定时任务的特殊性,以及一些方法的幂等性要求,在分布式多节点部署的情况下,某个定时任务只需要执行一次。

1.背景介绍

ShedLock()是一个轻量级的分布式定时任务锁组件,使用其可以满足我们上面的技术需求,ShedLock官方简单自我介绍:

ShedLock makes sure that your scheduled tasks are executed at most once at the same time. If a task is being executed on one node, it acquires a lock which prevents execution of the same task from another node(or thread). Please note, that if one task is already being executed on one node, execution on other nodes does not wait, it is simply skipped.

Shedlock从严格意义上来说不是一个分布式任务调度框架,而是一个分布式锁。所谓的分布式锁,解决的核心问题就是各个节点中无法通信的痛点。各个节点并不知道这个定时任务有没有被其他节点的定时器执行,所以理论上只需要有一个各个节点都能够访问到的资源,用这个资源去标记这个定时任务有没有执行就可以了。

[1]2. Shedlock实现

Shedlock实现分布式锁,可以依赖如下组件:

JdbcTemplate

Mongo

DynamoDB

DynamoDB 2

ZooKeeper(using Curator)

Redis(using Spring

RedisConnectionFactory)

Redis(using Jedis)

Hazelcast

Couchbase

ElasticSearch

Co**osDB

Cassandra

Multi-tenancy

本文主要以来 Redis为公共存储,实现定时任务的分布式锁。首先,我们假设你的 Spring Boot项目已经引入了 Redis,在项目的 pom文件中加入依赖:

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-spring</artifactId>

4.14.0

</dependency>

<dependency>

<groupId>net.javacrumbs.shedlock</groupId>

<artifactId>shedlock-provider-redis-spring</artifactId>

4.14.0

</dependency>

开启定时任务锁:

@Configuration

@EnableSche****ng

@EnableSchedulerLock(defaultLockAtMostFor="PT30S")

publicclassShedlockConfig{

@Bean

publicLockProviderlockProvider(RedisTemplateredisTemplate){

returnnewRedisLockProvider(redisTemplate.getConnectionFactory());

}

}

defaultLockAtMostFor=“PT30S”表示默认锁的最大占用时间是 30s;

其次,在定时任务方法上,加上注解@SchedulerLock:

/**

*通过设置lockAtMostFor,我们可以确保即使节点死亡,锁也会被释放;

*通过设置lockAtLeastFor,我们可以确保它在30s内不会执行超过一次;

*/

@Scheduled(cron="00121522*?")

@SchedulerLock(name="testTask-1",lockAtMostFor="30s",lockAtLeastFor="10s")

publicvoidtestTask1(){

LockAssert.assertLocked();

log.info("exectestTask1......");

}

@Scheduled(fixedRate=10000L)

@SchedulerLock(name="testTask-2",lockAtMostFor="10s",lockAtLeastFor="2s")

publicvoidtestTask2(){

LockAssert.assertLocked();

log.info("exectestTask2......");

}

启动多个节点,会发现,每次定时任务只有一个节点执行,定时任务执行后,在 Redis里会看到两个 key:job-lock:default:testTask-1和 job-lock:default:testTask-2。

[2]3. Shedlock原理分析

Shedlock通过 AOP,拿到 TaskScheduler的行为做代理,并加入分布式锁实现所需要的功能。

上锁入口在 RedisLockProvider.java:

@NonNull

publicOptional<SimpleLock>lock(@NonNullLockConfigurationlockConfiguration){

Stringkey=this.buildKey(lockConfiguration.getName());

Expirationexpiration=getExpiration(lockConfiguration.getLockAtMostUntil());

returnBoolean.TRUE.equals(tryToSetExpiration(this.redisTemplate,key,expiration,SetOption.SET_IF_ABSENT))?Optional.of(newRedisLockProvider.RedisLock(key,this.redisTemplate,lockConfiguration)):Optional.empty();

}

privatestaticBooleantryToSetExpiration(StringRedisTemplatetemplate,Stringkey,Expirationexpiration,SetOptionoption){

return(Boolean)template.execute((connection)->{

byte[]serializedKey=template.getKeySerializer().serialize(key);

byte[]serializedValue=template.getValueSerializer().serialize(String.format("ADDED:%s@%s",Utils.toIsoString(ClockProvider.now()),Utils.getHostname()));

returnconnection.set(serializedKey,serializedValue,expiration,option);

},false);

}

可以看出上锁,其实就是 Redis的 set操作的过程。

任务执行的入口,可以参考 net.javacrumbs.shedlock.core.DefaultLockingTaskExecutor:

@Override

@NonNull

public<T>TaskResult<T>executeWithLock(@NonNullTaskWithResult<T>task,@NonNullLockConfigurationlockConfig)throwsThrowable{

Optional<SimpleLock>lock=lockProvider.lock(lockConfig);

StringlockName=lockConfig.getName();

if(alreadyLockedBy(lockName)){

logger.debug("Alreadylocked'{}'",lockName);

returnTaskResult.result(task.call());

}elseif(lock.isPresent()){

try{

LockAssert.startLock(lockName);

logger.debug("Locked'{}',lockwillbeheldatmostuntil{}",lockName,lockConfig.getLockAtMostUntil());

returnTaskResult.result(task.call());

}finally{

LockAssert.endLock();

lock.get().unlock();

if(logger.isDebugEnabled()){

InstantlockAtLeastUntil=lockConfig.getLockAtLeastUntil();

Instantnow=ClockProvider.now();

if(lockAtLeastUntil.isAfter(now)){

logger.debug("Taskfinished,lock'{}'willbereleasedat{}",lockName,lockAtLeastUntil);

}else{

logger.debug("Taskfinished,lock'{}'released",lockName);

}

}

}

}else{

logger.debug("Notexecuting'{}'.It'slocked.",lockName);

returnTaskResult.notExecuted();

}

}

首先判断 lock是否可用,然后再执行任务 task.call()。

来源链接:

(%E5%85%AB)%E4%B9%8B%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E9%94%81Shedlock/#more

专题推荐:

2026年扣篮大赛相关资讯

樊振东最新动态

2026世界杯动态

欧锦赛2024动态

2024年欧洲杯资讯