分布式系统你们是怎么实现应用的?

Redis分布式锁的原理是什么?如何续期?

在传统单体应用单机部署的情况下,并发问题可以通过使用Java并发相关的锁如synchronized,但是当规模上升到分布式集群的情况下,要控制共享资源访问,就需要通过分布式锁来实现。常见的分布式锁方案如数据库乐观锁,Redis锁,zk锁等。

公司主营业务:成都网站建设、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出云安免费做网站回馈大家。

Redis分布式锁可以有多种方式实现但是其核心就是通过以下三个Redis命令组合实现。

上面为Redis的一个最简单的锁实现原理,实际中还需要考虑更多具体的情况作出相应的调整。如

实际开发环境中不确定的因素有很多,需要慢慢地去调整实践达到理想状态,可以考虑使用redisson框架来实现。

这个情况比较独特,出现这个问题的根本原因在于锁失效的时间小于业务处理的时间导致业务还没处理完毕锁就释放了。那么解决方案是合理地结合业务去设置锁失效的时间。

但是也有更好的方案就如前文提到的redisson,其中的可重入锁概念。


默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒。

分布式锁的需求产生

分布式锁的需求是伴随着应用分布式部署而来的,在单体应用,且只部署一台服务器的情况下,通过java的同步锁即可实现。同步锁,即是一个原子性的操作。

那么当应用进行了分布式部署,应用有多个服务,这个时候应用服务端就没有一个可提供原子性操作的地方了,Redis性能高,且是单线程,因此可提供一个原子性操作的地方,利用它,就可以实现分布式锁。

用场景说话,使用Redis分布式锁的场景如下图所示:

如下图所示,随后会根据场景说明分布式锁及续期相关问题的来龙去脉。

  1. 图中序号1:进来一个请求,这个请求要求我们保存一个“订单A”;
  2. 图中序号2:2.1 步,请求进来,首先去尝试设置一个Redis 值,他的键就是订单号“订单A”,如果尝试成功,则代表我这个线程是第一次设置,相当于我拿到了这个锁;如果尝试失败,那么,可以抛出异常或者等待一段时候后再次重试,这里可以根据业务场景的不同采取不同的策略。这里的关键是在Redis中的操作是单线程的,因此该操作是原子性的。2.2步,为了防止应用服务意外中断,Redis中的数据一直存活,消耗资源,需要设置一个超时时间。(如果为了严谨,可以将2.1, 2.2 两步封装成一个lua脚本部署在Redis服务器上)
  3. 图中序号3:情况A,这个时候是当Redis的key还未失效,程序就已经执行完成,且删除了Redis中的数据,一切正常;情况B:就是需要续期的场景,如果要避免这个场景的出现,可以将Redis key的失效时间设置长一点,可以应对大多数业务。如果要彻底解决,可以在应用端添加一个Redis锁的注册中心,然后起一个监听线程去监听这个注册中心,发现有锁还在被持有,但是Redis 已经快过期了,则修改相应key的失效时间,进行续期。

分布式系统你们是怎么实现应用的?

分布式系统搭建确实是比较困难的,涉及的点比较多,有幸参与过,来说说自己的拙见吧!

下面以保险公司为例:

1,应用服务:根据业务系统分为契约,核保,批改,理赔,每个大的系统下面可能会有细分!至少要保证四个大的服务群!

服务:都是使用spring cloud搭建公司的微服务,保证各系统之间的服务对外提供,每个服务对外提供都使用nginx进行负载均衡,真正的应用服务有四台或者两台!

数据库:每个业务对应的服务系统连接8库1024表,使用mycat中间件搭建的分库分表,单表保证数据不超过1000万,也就是每个服务的数据容纳能力为102亿的数据记录!数据都是用逻辑删除,考虑对三年期以上的数据进行数据转移保存,在数据库中进行物理删除!

nosql:使用mongoDB对大部分key value形式的中间json数据进行读取效率,使用redis缓存诸如枚举,定义表等可静态处理的数据,使用redis实现分布式锁,全局session等实现单点登录!

2,消息传输:

batch:采用自写的批(i batch)处理框架,根据不同的调用异常,数据错误等采取不同的重试机制,减少人工干预,多次重试不能通过的数据,发邮件进行人工处理!

消息:同时使用消息中间件(kafka.ons都用过)进行服务之间数据传输,消息先进行数据落库,避免数据的丢失,各步骤有返回值判断加重试机制,保证各服务之间数据的一致性!

3,数据驱动:

到此,以上就是小编对于redis分布式应用的方法是什么意思的问题就介绍到这了,希望这2点解答对大家有用。

文章名称:分布式系统你们是怎么实现应用的?
分享路径:http://www.mswzjz.cn/qtweb/news20/229870.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能