分布式、锁、延时任务

news2025/2/26 23:02:27

1. redission

3

2.zk

2.1 指令

ls / / 下有哪些子节点
get /zookeeper 查看某个子节点内容
create /aa “test”
delete /aa
set /aa “test01”

2.2 创建节点

模式 默认创建永久
create -e 创建临时
create -e /zz “hello zz”
create -s 创建 有序节点
3
create -s -e 临时序列化节点
3

2.3 节点事件监听

一次性的监听

  1. 节点创建 事件监听 NodeCreated
    stat -w /xx

  2. 节点 删除 监听 NodeDeleted
    stat -w

  3. 节点数据 变化 监听 NodeDataChanged
    get -w /bb
    set /bb “cc” //修改节点数据

  4. 子节点 监听 NodeChildrenChanged
    ls -w /bb

create /bb/cc “test”

2.4 zk 分布式锁

  1. 独占、排它, 其他线程获取不到
  2. 阻塞 解决自旋的消耗 临时 有序节点 + 事件 监听(监听 比他小1的节点),

让最小的节点 获取到锁, 44节点监听43节点,43 节点删除后,唤醒后续44节点 获得锁。公平锁
3. 锁的可重入性
思路1: 在节点的内容中记录 服务器、线程、已经重入信息
思路2 :Threadloacal: 线程的局部变量,线程私有

阻塞操作 获取不到监听 并阻塞

3
创建 临时 有序节点 返回节点路径
// 获取前置节点 ,如果前置节点为空,那么获得锁成功,否则监听 前置节点

countdownLatch(1)
在监听事件的内部 进行一个countDown();
3

可重入锁

threadloacal
在 trylock()
3
unlock 里面 判断:
3

2.5 锁

zk 的节点 存储机制+通知机制
zk 有4中节点类型,持久节点持久顺序节点临时节点临时顺序节点
持久和临时 判断标准依赖于客户端 的生命周期
3
顺序: 节点对应的id

  • 持久节点
    • 持久顺序节点
    • 持久的非顺序节点
  • 临时节点
    • 临时的非顺序节点( 实现分布式锁的条件)
    • 临时的顺序节点
      3

利用zk 支持的临时顺序节点 +通知机制 可以实现分布式锁

  • 加锁:判断是否持有了分布式锁,判断客户端 创建的节点是否是 有序节点中 序号最小的一个
  • 释放锁: 将自己的创建的节点 删除即可。

3. redission zk 分布式锁对比

4. 延时任务

4.0 场景

3

4.1 定时任务数据库轮询

  1. 定时任务轮询数据库,
    采用定时任务失效延迟、对业务表进行轮询判断,到点执行。有一点点误差
    1) 使用单机版本的spring schedule +分布式锁的实现。
    同一个服务,多个节点 同时执行 可能都会执行,需要加分布式锁
    3
  1. 分布式调度框架 xxl-job
    如果处理数据量较大,可以利用分布式调度系统的分片功能并行处理,大大提升数据的处理能力,加快处理速度。

优点
单机版 基于spring,实现简单。不用引入各种中间件,各个模块可以自行定义延迟规则。
缺点
2. 完全由业务代码进行控制,重复代码多,不论是否有待执行的数据,都要空轮询cpu 且频繁的访问数据库 io 消耗
3. 由于是定时轮询,存在一点误差。

基于@schedule

3

取消订单操作
3
3

基于xxl-job 的

3

4.2 Java 的DelayQueue

Java DelayQueue的使用及应用场景

DelayQueue 的实现原理。
1) DelayQueue 是JDK提供的一个无界 BlockQueue ,用于放置实现了Delayed 接口的对象。其中的对象只能在其到期时,才能从队列中拿走。
这种队列 是 有序的,即 队头对象的延迟到期时间最长。
注意不能将null 元素放置 到这种队列中。

2)实现注意事项
队列 里面的元素 需要实现Delayed 这个接口。getDelay 方法用于设置 延迟时间。 compareTo 方法用于对队列的元素 进行排序。

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
    implements BlockingQueue<E> 
// 入队
put(){
offer();} 线程安全  reentrantlock 加锁 
offer(); 线程安全
// 出队 
poll(); 非阻塞方法,没有到期元素 直接返回 null
take(); 阻塞式 获取,没有到期元素,线程将会进行等待。

优点:
jdk 自带的,不需要引入其他框架 中间件,实现简单。
缺点:

  1. 不支持分布式或者 持久化的,重启会丢失。
  2. 如果 并发量 非常大,因为DelayQueue式无界的,队列内的对象越多。可能会造成oom 的风险。
  3. 所以使用 delayQueue实现的定时任务,只适用于任务量较小的情况。

3

4.3 消息中间件

rocketmq如何实现延时队列

rocketmq 先把消息 按照延时时间段(1s,5s,10s) 发到指定的队列中,然后通过一个定时器轮询这些队列。如果到期,就把 这个消息发到指定的topic 队列。
注意点:
3

  1. rocketmq 延时消息的时长不支持随机时长的延迟。是通过特定的延迟等级来指定的。
    默认支持18个等级的延迟消息。
    延时等级 在rocketmq服务端的MessageStoreConfig类中
private String messageDelayLevel ='1s 5s 10s 30s   
		1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 30m 1h 2h'
		发消息时: 设置delayLevel 等级即可  msg.setDelayLevel( level);
		level ==0 消息非延迟
		1<=level <=maxlevel 消息延迟特定的时间。
		level >maxlevel  那么 level=maxlevel  例如leve=20,延迟2h
		

优点:
基于消息中间件可以快速实现延时队列,而且天然支持消息消费的有序性、消息持久化、ack机制
缺点:
需要额外的部署 和运维成本。

4.4 redis zset、 key 过期回调

zrangebyScore

redis 127.0.0.1:6379> ZADD salary 2500 jack               
         # 测试数据
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf           
    # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES  
  # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES  
  # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000     
       # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"

3

4.5 时间轮算法

3

核心参数

每个 刻度 代表一个duration 时长。

  • tickDuration s 、mins、 h
    每个刻度的时长
  • round
    第几圈 后执行,使用延期时长/ 一圈的时长得来
    一个刻度1s,15s 后执行,那么 需要 round =2,没到指定位置,round -1;
  • ticksPerWheel
    一圈下来有几个刻度

工作原理

  • 指针停在0处
  • tickDuration=1
  • ticksPerWheel=12

如果一个25秒才执行的延时任务添加进来,首先它会计算它的round和index,round=25/12 =2
index=25%12=1.
所以时间轮长这样:
34

当指针转到index=1的刻度时,会判断第一个task的round是不是为0,如果为0则取出来,去执行,如果大于0,则将round-1.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试平台项目部署一(手动部署)

手动部署 一、项目框架图1、首先创建一个桥接网络:2、redis3、启动mariadb4、跨域配置5、JWT配置6、celery配置7、启动ck14_django 容器8、安装gunicorn9、数据库迁移10、创建用户11、添加工作进程12、验证异步执行任务、定时执行任务通过二、supervisor1、安装2、创建配置文件…

开源|HDR-ISP开源项目介绍

引言 拖更很久了&#xff0c;本着出品必精的原则&#xff0c;我们更新就来点干货。想起刚入行时&#xff0c;网上并没有很多以及系统的ISP的学习资料&#xff0c;都是边工作、边搜集资料然后边学习&#xff0c;一路坎坎坷坷走到今天算是刚入了ISP的大门。 为了解决新人入门的…

openGauss学习笔记-63 openGauss 数据库管理-资源池化架构

文章目录 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 openGauss学习笔记-63 openGauss 数据库管理-资源池化架构 本文档主要介绍资源池化架构下的一些最佳实践和使用注意事项&#xff0c;用于支撑对相关特性感兴趣的开发者可以快速部署、实践或进行定制化开发。…

【时空融合:改进MRA】

Multiresolution Analysis Pansharpening Based on Variation Factor for Multispectral and Panchromatic Images From Different Times &#xff08;基于变化因子的多光谱和全色图像多分辨率分析&#xff09; 大多数泛锐化方法是将同一区域上同时获取的原始低分辨率多光谱(M…

Redis的数据持久化方案

目录 前言 RDB方式 概述&#xff1a; 1.RDB手动 &#xff12;.RDB自动 RDB优缺点 AOF方式 概述 AOF写数据的三种策略 AOF相关配置 AOF重写 AOF重写方式 手动重写 bgrewriteaof 自动重写 总结 前言 Redis是一个内存型数据库&#xff0c;也就是说如果不将内存中的…

overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表

目录 1 创建一个Overleaf项目 2 导入或创建 .bib 文件 2.1 导入 .bib 文件&#xff1a; 参考文献的 .bib文件获取步骤 &#xff08;1&#xff09;打开谷歌学术 &#xff08;2&#xff09;输入文献题目 &#xff08;3&#xff09;点击引用&#xff0c;然后选择BibTex格式…

af-table-column插件的使用 element el-table-column宽度自适应

af-table-column 是一个用于 Vue.js 的表格列组件&#xff0c;用于在表格中定义列的样式和行为。下面是 af-table-column 的使用方法&#xff1a; 首先&#xff0c;确保已经安装了 af-table-column 包。可以使用以下命令进行安装&#xff1a; npm install af-table-column --…

MySQL——事务

一、事务的开始与结束 一个数据库事务由一条或多条sql语句构成&#xff0c;它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功&#xff0c;要么全部执行失败。 1.1.事物的开始 1.对于DDL&#xff08;create&#xff0c;alter&#xff0c;drop&#xff09;和DCL&…

render函数使用和详解

背景 在平时编程时&#xff0c;大部分是通过template来创建html。但是在一些特殊的情况下&#xff0c;使用template方式时&#xff0c;就无法很好的满足需求&#xff0c;在这个时候就需要 通过JavaScript 的编程能力来进行操作。此时&#xff0c;就到了render函数展示拳脚去时…

【Python】迭代器__iter__、__next__

这里主要纠正迭代器的用法&#xff0c;因为一些教程传播错误示例让我很无语。 最大的错误就是&#xff0c;把__iter__和__next写在同个类里&#xff0c;每每看见都感到诧异。不是说这方法不行&#xff0c;主要是&#xff0c;一旦出现预期之外的运行结果往往很难查到原因(因为它…

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

系列文章 Nomad 系列文章Traefik 系列文章Tailscale 系列文章 概述 终于到了令人启动的环节了&#xff1a;NomadTraefikTailscale 集成实现零信任安全。 在这里&#xff1a; Nomad 负责容器调度&#xff1b;&#xff08;容器编排工具&#xff09;Traefik 负责入口流量&…

文件导入之Validation校验List对象数组

背景&#xff1a; 我们的接口是一个List对象&#xff0c;对象里面的数据基本都有一些基础数据校验的注解&#xff0c;我们怎么样才能校验这些基础规则呢&#xff1f; 我们在导入excel文件进行数据录入的时候&#xff0c;数据录入也有基础的校验规则&#xff0c;这个时候我们又…

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中&#xff0c;系统默认集成了很多netlink实例&#xff0c;比如日志上报、路由系统等&#xff0c;netlink消息是双向的&a…

解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./

问题描述 我们在初次使用tesserocr库的时候&#xff0c;可能会报以下错误&#xff1a; RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 这是因为我们在使用 conda 创建的环境中找不到"tessdata"这个文件夹。 解决办法 这时候把Tessera…

【CMake工具】工具CMake编译轻度使用(C/C++)

目录 CMake编译工具 一、CMake概述 二、CMake的使用 2.1 注释 2.1.1 注释行 2.1.2 注释块 2.2 源文件 2.1.1 共处一室 2.1.2 VIP包房 2.3 私人定制 2.2.1 定义变量 2.2.2 指定使用的C标准 2.2.3 指定输出的路径 2.4 搜索文件 2.3.1 方式1 2.3.2 方式2 2.5 包含…

CRM软件系统能否监控手机的使用

CRM可以监控手机吗&#xff1f;答案是不可以。CRM是一款帮助企业优化业务流程&#xff0c;提高销售效率的工具。例如Zoho CRM&#xff0c;最多也就是听一下销售的通话录音&#xff0c;却不可以监控手机&#xff0c;毕竟CRM不是一款监控软件。 CRM的主要作用有以下几点&#xf…

CASAIM与南京航空航天大学在自动化叶片曲面分析系统开展合作,推动航空航天发动机零部件自动化3D检测进程

近期&#xff0c;CASAIM与南京航空航天大学在自动化叶片曲面分析系统展开深入合作&#xff0c;充分发挥双方在航空航天和智能检测领域优势&#xff0c;共同推动航空航天发动机零部件自动化3D检测进程。 南京航空航天大学创建于1952年10月&#xff0c;是新中国自己创办的第一批…

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

本文是 3 篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…

微信小程序的开发---tabBar的介绍

目录 一、tabBar的介绍 二、tabBar的6个组成部分 三、tabBar节点的配置项 四、tab项的配置选项 五、tabBar的使用 一、tabBar的介绍 tabBar是移动端应用常见的页面效果&#xff0c;用于实现多页面的快速切换。小程序中通常将其分为&#xff1a; &#xff08;1&#xff09;…