分布式环境下数据一致性的问题

老娘不能同时被强奸(共享资源竞争问题)
问题描述:X=10,A操作将其增加20,B操作将其减少10;
A读取:10
B读取:10
A写入:10+20 = 30
B写入:10-10 = 0
最终结果0(这是强奸后的结果)。
解决方案:进门请上锁(用锁)
1.锁信息放在公用的存储空间:比如说redis
2.锁必须有唯一标识(能唯一映射所锁定的资源)
3.锁状态status=0,打开;status=1,锁定
接下来,排队进入吧
假如有P1、P2、P3准备潜入。
P1进入前:获取该房门的锁,
P1进入:锁上房门status=1(此时P2、P3在后面排队中)
P1完事:打开锁
接下来.....P2...P3.....

那么问题来了:
1.万一P1这孩子在里面啪啪啪猝死了怎么办?(这房门是不是永远被锁住了)
2.假如P1、P2同时到达房门,两人发现锁都是打开的(因为这儿的判断锁状态是分为读取和判断两步,这两步不具备原子性)。

另外再高级点:
如果这个场景中引入一个第三者:医生。医生负责检查娘们儿是否健康;而检查流程是:进入房门->上锁->检查->开锁->走人
那么P1进入的过程就变成:
P1获取该房门的锁,
P1进入,锁上房门
P1呼叫医生
医生进入房门
医生上锁
医生检查
医生开锁
医生走人
P1啪啪
.......
注意这个过程,1、房门被P1锁上的,医生进入还能继续锁门,2、医生走人前开锁,尼玛,开锁会不会把别的汉子也放进来?这个问题叫“可重入锁”

其次
一般使用锁保持数据的一致性,都不会像我上面描述的一样,房门被锁上之后进行排队。通常情况下是发现房门被锁了,老子就在门口睡觉;这儿有两个问题:
1、如果说睡觉的汉子每隔10分钟醒一次,有可能会造成某段时间房门没有被锁,也没有汉子进去啪啪啪,资源浪费了。
2、如果说门锁打开会通知门口睡觉的汉子,会不会叫醒一堆然后蜂拥而上,饥渴难耐啊(Herd Effect,惊群效应)。
3、如果不用排队了,就可能造成不公平(后来的先进去),没有按照竞争者按顺序获得锁(公平锁和非公平锁问题)。

OK,开个怡红院也不容易。

这是个坑,
[坑]
请自行解决.......

时间: 2024-10-13 12:24:14

分布式环境下数据一致性的问题的相关文章

分布式环境下的数据一致性问题的方案讨论

由于互联网目前越来越强调分布式架构,如果是交易类系统,面临的将会是分布式事务上的挑战.当然目前有很多开源的分布式事务产品,例如java JTA,但是这种解决方案的成本是非常高的,而且实现起来非常复杂,效率也比较低下.对于极端的情况:例如发布,故障的时候都是没有办法保证强一致性的. 首先,在目前的互联网应用中,我们通过一个比较常见的例子,让大家更深入的了解一下分布式系统设计中关于数据一致性的问题.拿我们经常使用的功能来考虑吧,最近网购比较热门,就以京东为例的,我们来看看京东的一个简单的购物流程 用

还没弄懂分布式场景下数据一致性问题?一文教你轻松解决!

文章纲要 此次分享的缘由 目前分布式事务问题是怎么解决的 行业中有什么解决方案 这些解决方案分别有什么优缺点 别人是怎么做的 我们可以怎么来做 此次分享的缘由 支付重构 考虑支付重构的时候,自然想到原本属于一个本地事务中的处理,现在要跨应用了要怎么处理.拿充值订单举个栗子吧,假设:原本订单模块和账户模块是放在一起的,现在需要做服务拆分,拆分成订单服务,账户服务.原本收到充值回调后,可以将修改订单状态和增加金币放在一个mysql事务中完成的,但是呢,因为服务拆分了,就面临着需要协调2个服务才能完成

集群/分布式环境下5种session处理策略

转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时

分布式环境下配置中心实现思考

转载注明出处: 季义钦的博客 最近在考虑分布式环境下配置中心实现. 对于配置中心很难设计. 光用Zookeeper吧,发现一是跨语言支持不好,需要大量跨语言支持的开发,而且没办法在上面增加大量的算法和逻辑. 如果在Zookeeper前面加一层服务的话,又怕成为单点压力. 下面是我画的一个架构图,希望大家帮忙看看,踊跃讨论. 希望各位不管有什么意见和建议.都在下面评论里面留下自己的想法,帮助我改进,谢谢 分布式环境下配置中心实现思考,布布扣,bubuko.com

【转】集群/分布式环境下5种session处理策略

转载至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Sessi

【架构师之路】集群/分布式环境下5种session处理策略

转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页

【转】分布式环境下5种session处理策略(大型网站技术架构:核心原理与案例分析 里面的方案)

前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session.当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面.这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的. 我们应当对

分布式环境下rabbitmq发布与订阅端

假设rabbitmq配置了集群,且客户端连接rabbitmq-server通过lvs实现HA但一般情况下不建议做LB.在分布式系统的环境下,由于节点的非预知性,使用spring amqp模板进行配置不足以灵活到满足弹性扩展的需求,因此,更加方便的方式是通过rabbitmq原生的java client进行订阅和发布.在我们的场景中,某些节点需要同时是发布端和订阅端以便做到弹性扩展,无需额外的配置.以fanout类型为例,如下所示: 发布端: /** * @Title: Send.java * @P

HBase伪分布式环境下,HBase的API操作,遇到的问题

在hadoop2.5.2伪分布式上,安装了hbase1.0.1.1的伪分布式 利用HBase的API创建个testapi的表时,提示 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration        at com.wonderad.mr.ADReport2HBase.main(ADReport2HBase.java:152)