一些常用的分布式组件实现技巧

news2024/12/28 21:01:48

广播

可用redis的pubsub机制来支持集群内的广播。

基于redis的分布式锁

加锁

使用setnx命令:

SET lock_key random_value NX PX 5000

其中:
random_value 是客户端生成的唯一的字符串,用于在删除时唯一标识client身份。
NX 代表只在键不存在时,才对键进行设置操作。
PX 5000 设置键的过期时间为5000毫秒,用于异常情况下(如client崩溃),该锁可以被自动释放,供其他client使用。

若命令成功,说明获取到锁。否则,表示未获取到锁。

解锁

使用lua脚本:

-- 只有唯一字符串匹配,才能认定身份,执行删除操作
if redis.call('get',KEYS[1]) == ARGV[1] then 
   return redis.call('del',KEYS[1]) 
else
   return 0 
end

redisson库

前面的内容只是为了说明基于redis分布式锁的实现原理,实际中,可直接使用redisson库的RLock,它在基本的加解锁之外,还提供了同一线程可重入持有锁的能力。
redisson库还提供了很多好用的分布式组件,值得好好学习一下。

分布式超时器

分布式超时器可基于redisson的分布式延迟队列(distributed delay queue)来实现,在此基础上做一些高可用的封装。

redisson分布式延迟队列原理

整个分布式延迟队列用到了3个redis数据结构:

  • 时间最小堆,列头就是最近即将到期的消息
  • 顺序消息队列,按设置的先后顺序排列的消息
  • 目标消息队列,已到期的消息,待消费者拉取

在这里插入图片描述

生产者进程做了两件事:

  1. 往时间最小堆和顺序消息队列插入消息
  2. 定时从时间最小堆和顺序队列里把到期的消息移到目标队列

所以生产者是一个极其重要的角色。

消费者作用相对简单,就是消费到期消息。

设计思路

我们介绍一下分布式超时器的设计思路。

首先,有这么一个原则:超时事件的设置进程不一定是该超时事件的响应进程,因为设置进程有可能在某个时刻恰好挂掉或重启,但超时事件的处理不能丢(确保高可用)。

其次,任何分布式组件的设计难点都在于分布式条件下的异常处理,分布式超时器也不例外,我想到的有如下异常点:

  • redis故障了怎么处理?
  • 超时事件的处理进程未处理完就崩溃,怎么办?
  • 所有进程都不在的情况下,超时事件会不会丢失,待进程起来后能不能补发?
  • 灰度切换对超时事件的处理有无特殊要求?

对上述问题,我们逐一讨论解决:

  • redis故障一般是断AZ的情况,一般redis集群里的master和slave节点分属不同的AZ,理论上不会出现master和slave同时挂掉的情况,那么在master 挂掉时,集群能自动把老master带的slave推举为新master,同时我们把redisson的readmode设为MASTER_SLAVE,以确保在master选举过程中,也能正常读取redis(readmode=MASTER_SLAVE时redisson在读master失败时会去读slave)。当然,由于主从复制的异步特点,新master选举出来后,小概率下可能存在数据丢失。这种情况下,可通过特殊机制去补偿,比如提前将超时事件存入mysql,并定期检查mysql里有无已过期的事件,若有就补偿处理掉。
  • 处理超时事件的进程半途崩溃,超时事件未处理完。同样可在mysql里记录超时事件的处理状态,若有超时事件的处理状态一直是pending,则补偿处理。
  • 如前所述,redisson的分布式延迟队列内部使用了三个专门的redis数据结构来存放未到期和到期的超时事件,所以,如果所有进程不在,这些超时事件还会保留在redis里,待进程恢复后,可以继续处理。
  • 关于灰度,考虑到我们的实际情况是:新版本作为灰度存在只有很短的一段时间,大部分时间都是老版本作为灰度存在,分布式超时器框架可考虑不让灰度节点来处理超时事件(毕竟要做到后向兼容不是一件易事)

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

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

相关文章

【开发实用】还在用BeanUtils?不如用MapStruct

文章目录 1. 什么是MapStruct2. 为什么使用MapStruct3. 如何使用MapStruct 1. 什么是MapStruct MapStruct是一个Java注解处理器,它可以简化Java bean之间的转换。它使用基于生成器的方法创建类型安全的映射代码,这些代码在编译时生成,并且比…

2023夏季黑客松大赛,Moonbeam邀请你来BUIDL

由Parity和OneBlock联合举办的「2023 夏季波卡黑客松大赛」正在火热开启中。自报名开启之日,便获得了来自海内外对波卡生态的高度专注和对Web3开发的热情。 本次黑客松聚焦智能合约、开发工具、社交网络等大赛命题,邀请了行业领军人、技术大咖、投资人等…

推进开源法律知识普及|2023开放原子全球开源峰会开源法律与合规分论坛即将启幕

随着开源在推动创新、促进协作方面的作用日益凸显,开源领域的法律与合规问题日益受到关注。 6月11日,开放原子全球开源峰会开源法律与合规分论坛将在北京经济开发区国家信创园召开,论坛以“开源知识产权的深度现实与广阔未来”为主题&#x…

基于SSM的校园旧书交易交换平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Mybatis_plus——标准分页功能制作

mybatispuls中提供分页查询中需要两个参数,一个是IPage接口的实现类,还有一个后面说。 IPage有且只有一个实现类Page类型在里面已经提供有了,传两个参数即可使用,一个是页码值,一个是每页显示数据的条数。查询完之后可…

chatgpt赋能python:Python代做:让您的网站更友好的SEO利器

Python代做:让您的网站更友好的SEO利器 如果您是一位网站管理员或者SEO工程师,您一定知道SEO对于网站的重要性。那么在SEO中,Python代做可以为您提供什么?在本文中,我们将通过介绍Python代做的技术和方法,…

unity发布webGL后无法预览解决

众所周知,unity发布成webgl后是无法直接预览的。因为一般来说浏览器默认都是禁止webgl运行的。 直接说我最后的解决方法:去vscode里下载一个live server ,安装好。 下载vscode地址Visual Studio Code - Code Editing. Redefined 期间试过几种方法都不管…

Ansys Zemax | 探究 OpticStudio 偏振分析功能

本文介绍了 OpticStudio 模拟基于偏振的光学现象的几种方法。本文的目的是在对基于偏振的光学进行建模时检查这些特征的优势和正确应用。讨论的功能包括偏振光瞳图、琼斯矩阵、双折射、表面涂层等。这些对于波片和隔离器等实际应用很重要。(联系我们获取文章附件&am…

plt.loglog()函数的用法和示例(含代码)

目录 常用坐标下的图像显示在loglog函数下的显示同时显示参考文献 plt.loglog()函数通常是用于和对数函数相关的显示中。 在研究plt.loglog()函数之前,我们可以先从常见的线性平面坐标系入手。 如 np.linespace()函数,它在指定的间隔内返回均等的数字。 np.linespa…

Redis主从架构、数据同步原理、全量同步、增量同步

目录 专栏导读一、Redis主从架构二、数据同步原理三、全量同步的流程三、可以从以下几个方面来优化Redis主从就集群四、全量同步和增量同步区别?五、什么时候执行全量同步?六、什么时候执行增量同步?七、超卖问题 大家好,我是哪吒…

高完整性系统工程(八):Hoare Logic

目录 1. 霍尔逻辑(Proving Programs Correct) 1.1 警告(Caveats) 1.2 误解(Misconception) 1.3 编程语言(Programming Language) 1.4 程序(Programs) 1…

java学习 spring mybatis maven juc并发 缓存 分布式

Spring系列第11篇:bean中的autowire-candidate又是干什么的?_路人甲Java的博客-CSDN博客 Spring系列 Spring系列第1篇:为何要学spring? Spring系列第2篇:控制反转(IoC)与依赖注入(DI…

I.MX RT1170加密启动详解(1):加密Boot镜像组成

使用RT1170芯片构建的所有平台一般都是高端场合,我们需要考虑软件的安全需求。该芯片集成了一系列安全功能。这些特性中的大多数提供针对特定类型攻击的保护,并且可以根据所需的保护程度配置为不同的级别。这些特性可以协同工作,也可以独立工…

macOS Ventura 13.5beta2 OpenCore 双引导分区原版黑苹果镜像

镜像特点(本文原地址:http://www.imacosx.cn/113805.html,转载请注明出处) 完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clove…

【cfeng work】什么是云原生 Cloud Native

WorkProj 内容管理 云原生云原生应用十二要素应用cfeng的work理解 本文introduce 云原生 Cloud Native相关内容 随着技术的迭代,从最初的物理机—> 虚拟机,从单机 —> 分布式微服务, 现在的热门概念就是云☁(cloud&#xff…

Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2023 年 5 月更新)

Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2023 年 5 月更新) 在虚拟机、Mac 电脑和 TPM 不符合要求的旧电脑上安装 Windows 11 的通用方法总结 请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/,查看最新版。原创作品…

Tomcat安全配置

1.删除webapps里面自带文件(关闭manage页面等) 删除webapps目录中的docs、examples、host-manager、manager等正式环境用不着的目录,这一步就可以解决大部分漏洞。有的网站没删除manager页面,并且管理员弱口令,导致直…

PCL点云处理之三维凸包点提取与凸包模型生成,分别保存到PCD与PLY文件(一百七十一)

PCL点云处理之三维凸包点提取与凸包模型生成,分别保存到PCD与PLY文件(一百七十一) 一、算法介绍二、算法实现1.代码2.结果总结一、算法介绍 现给定一块点云,需要实现下面两个功能开发 (1)获取点云的三维凸包点,保存至PCD格式的文件中 (2)获取点云的三维凸包模型,保存…

华为OD机试真题B卷 Java 实现【报数游戏】,附详细解题思路

一、题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少&#xff…

Netty核心源码剖析(一)

准备工作 将Netty的源码包netty-all-4.1.20.Final-sources.jar添加到项目中; 在io.netty.example包下,有很多Netty源码案例,可以用来分析! 1.Netty启动过程源码剖析 1>.将io.netty.exampler.echo包下的文件复制到当前项目的其他目录中; 2>.EchoServer.java /*** Ec…