大白话讲解分布式缓存并发冲突问题及其解决方案:zk分布式锁
大白话讲解分布式缓存并发冲突问题及其解决方案:zk分布式锁
一、背景介绍
如果您更喜欢看视频教程,可以看本头条号发布的视频教程,绝对大白话,手把手带你体验整个冲突的演示过程及解决方案:两种方式,随机挑选 缓存架构之实战演练基于zk分布式锁解决分布式缓存并发冲突问题
1、源架构:
2、分布式缓存并发冲突问题
二、项目整合
1、广告服务系统
**功能:**为媒体提供广告的源头服务
- 从本地缓存中获取广告
- 从redis缓存中获取广告
- 从db获取广告,并更新到redis缓存
2、 缓存服务系统
- 消息监听,实时增量更新redis缓存
- 定时全量更新redis缓存
3、广告管理系统
- 广告的增删改查
- 发送广告更改的mq消息
三、rabbitmq消息重复解决方案
1、是什么造成了消息的重复呢?
生产者在使用publisher confirm机制的时候,发送完一条消息等待RabbitMQ返回确认通知,此时网络断开,生产者捕获到异常情况,为了确保消息可靠性,选择重新发送,这样RabbitMQ中就有两条同样的消息。这样,在消费者消费的时候,就会重复消费,尤其是在交易系统/充值系统/银行转账系统……中,这问题就大了。
2、解决方案
这里进介绍下思路,简单说下处理方案,后面我们将分布式事务的时候,再详细介绍可靠性这一块
- 生产者对于发的每条消息,都带一个唯一UUID
- 消费者通过这个UUID来校验消息的重复性 唯一UUID:
-
- 生产者:两次发送的key必须一致(所以发送前,这个key必须持久化)
-
- 唯一key可以存储到分布式缓存中,如:redis,可以设置个缓存时间
public class AdMessage { /** * 操作类型:1为新增,2是修改 */ private int operation; /** * 主键字段,值为具体的ID值 */ private Long id; /** * 消息的唯一key:用于消息去重 */ private String uuidKey; /** * 广告信息: */ private String content; }
四、实战演练基于zk分布式锁解决分布式缓存并发冲突问题
代码下载地址:https://gitee.com/jikeh/JiKeHCN-RELEASE.git
项目名: 广告服务系统:spring-boot-ad-service 缓存服务系统:spring-boot-cache 广告管理系统:spring-boot-ad
1、zk分布式锁
- 原生zookeeper实现分布式锁
- 使用curator框架实现zookeeper分布式锁
2、广告服务系统应用zk分布式锁
3、广告缓存系统应用zk分布式锁
4、实战演练
1)模拟并发冲突场景
-
广告服务系统redis缓存更新:设置一个sleep阻塞时间
-
启动广告服务系统
-
访问接口:等待刷新redis(旧数据)
-
启动缓存服务系统
-
启动广告管理系统
-
修改广告,瞬时更新redis缓存 (新数据)
-
广告服务系统成功更新redis:旧数据旧覆盖了新数据==>造成缓存冲突问题
2)并发正常演示
更多内容,请关注: 头条号:极客慧
个人网站:极客慧 更多资料分享,请入群讨论:375412858
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
搜索引擎Sphinx亿级数据大并发实时搜索通用架构设计方案
一、市场份额 1.简介 Sphinx 优势: Sphinx是一个基于SQL的C++开发的开源全文检索引擎,在1千万条记录情况下的查询速度为0.x秒(毫秒级) 始于2001年,近20年的市场打磨(本文基于目前最新版3.0.3) 搜索引擎市场份额占比排名第5 阿里云RDS中有1款Mysql存储引擎:SphinxSE就是为此配套,支持SQL JOIN 提供SphinxQL,像使用SQL一样使用搜索引擎 PHP官网文档目前收录了4款搜索引擎扩展,其中1种就是Sphinx 二、基础概念 1.搜索引擎 搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。 2.数据源 数据来源,目前系统支持一些主流存储产品的自动对接。 比如:mysql, pgsql, mssql, xmlpipe, xmlpipe2, odbc... 支持写SQL JOIN语句,作为数据来源。 3.分...
- 下一篇
JavaScript创建对象(三)——原型模式
在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题。本篇文章就来讨论一下该问题的解决方案——原型模式。 首先我们来看下什么是原型。我们在创建一个函数时,这个函数会包含一个属性prototype,这个属性是一个指针,它指向一个对象——该函数的原型对象,这就是原型,它包含了该函数类型的所有实例可共享的属性和方法,见下面示意图: 如图所示,声明了一个函数Person。在JavaScript中,一个函数被声明的同时就具有了一些属性,其中有一个叫做prototype,它指向了该函数的原型对象,即上述示例中的Person Prototype。同时,这个原型对象有一个叫做constructor的属性反过来又指向了该函数对象。 当我们创建一个函数的实例时,例如上面的var personObj = new Person('张三', 12);,这个实例也会有一个属性指向该函数的原型对象,在Chrome的开发工具中显示为__proto__。 上面我们说原型的属性可以被该函数类型的所有实例所共享,那具体是怎么实现呢?看下面的示例: function Per...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器