快捷搜索:
基于业务的CISO,基于Redis实现分布式锁
分类:互联网科技

原标题:基于Redis实现分布式锁-Redisson使用及源码分析【面试+工作】

原标题:新流量红利期变革时代,9.11媒介匣熊掌号新产品重磅来

原标题:网络风险=业务风险 “基于业务的CISO”时代正在到来!

基于Redis实现分布式锁-Redisson使用及源码分析【面试+工作】

首先恭喜:媒介匣成为百度熊掌号授权全国TP运营服务商成员。

数据泄露、勒索软件以及其他类型的网络攻击行为,已经为全球各地的企业造成了不可估量的损害,例如,无法挽回的声誉损失(如Equifax)、收并购价格的大幅缩水(如雅虎)亦或是全球范围内的业务中断(如NotPetya勒索软件受害者)等。

在分布式场景下,有很多种情况都需要实现最终一致性。在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务(两阶段提交,数据源可分开),也可以借助消息中间件(消费者处理需要能幂等)。通过Observer模式来发布领域事件可以提供很好的高并发性能,并且事件存储也能追溯更小粒度的事件数据,使各个应用系统拥有更好的自治性。

9月11日,媒介匣正式开放百度熊掌号运营权限,上线熊掌号运营服务新产品。

图片 1

本文主要探讨另外一种实现分布式最终一致性的解决方案——采用分布式锁。基于分布式锁的解决方案,比如zookeeper,redis都是相较于持久化(如利用InnoDB行锁,或事务,或version乐观锁)方案提供了高可用性,并且支持丰富化的使用场景。 本文通过Java版本的redis分布式锁开源框架——Redisson来解析一下实现分布式锁的思路。

熊掌号自去年11月正式对外发布以来,已引入260W号入驻,搜索流量面向熊掌号分发完成50%,明年将有80%的流量导入熊掌号生态。敏锐的人已经发现,随着熊掌号的发展,它已经势不可挡地成为了移动时代的“域名”。开一个熊掌号,已成为移动搜索时代的标配。

不过好消息是,日益严峻的威胁场景也顺利地将网络安全问题从服务器机房推到了董事会的关注议程中。

分布式锁的使用场景

图片 2

此外,为了进一步推动企业对网络安全问题的关注,监管机构也正在积极推动网络安全议程,并对未及时修复安全漏洞和未能保护客户数据的企业采取更为严厉和强硬的态度。例如,根据欧盟《通用数据保护条例》(GDPR)规定,公司必须在72小时内向当局报告任何违反个人数据的行为,如果未能遵守,将面临高达2000万欧元或 4%年营业额的罚款(取较高者)。

如果是不跨限界上下文的情况,跟本地领域服务相关的数据一致性,尽量还是用事务来保证。但也有些无法用事务或者乐观锁来处理的情况,这些情况大多是对于一个共享型的数据源,有并发写操作的场景,但又不是对于单一领域的操作。

熊掌号是百度推出的一款战略级产品,这一产品的发布标志着百度搜索生态体系开始从“站时代”“号时代”过渡。如何沉淀与用户之间的关系并建立长久联系,是内容和服务提供者在“站长时代”的关键痛点,而百度熊掌号的推出旨在扭转这种“用完即走”的不利态势。通过帮助生态合作伙伴更加方便、快捷、高效地连接和沉淀庞大的百度用户群体,从而实现对用户资源的沉淀并获得自身价值的快速增长。

可以这样说,如今,网络安全风险已经等同于整个企业业务风险。一旦企业遭受网络攻击,必然会对其整体业务造成无可估量的影响,不仅业务能否正常开展成为问题,还要为此承受沉重的经济损失(包括罚款、事件响应及修复成本、业务中断损失、客户补偿等等)。

举个例子,还是用租书来比喻,A和B两个人都来租书,在查看图书的时候,发现自己想要看的书《大设计》库存仅剩一本。书店系统中,书作为一种商品,是在商品系统中,以Item表示出租商品的领域模型,同时每一笔交易都会产生一个订单,Order是在订单系统(交易限界上下文)中的领域模型。这里假设先不考虑跨系统通信的问题,也暂时不考虑支付环节,但是我们需要保证A,B两个人不会都对于《大设计》产生订单就可以,也就是其中一个人是可以成功下单,另外一个人只要提示库存已没即可。此时,书的库存就是一种共享的分布式资源,下订单,减库存就是一个需要保证一致性的写操作。但又因为两个操作不能在同一个本地事务,或者说,不共享持久化的数据源的情况,这时候就可以考虑用分布式锁来实现。本例子中,就需要对于共享资源——书的库存进行加锁,至于锁的key可以结合领域模型的唯一标识,如itemId,以及操作类型(如操作类型是RENT的)设计一个待加锁的资源标识。当然,这里还有一个并发性能的问题,如果是个库存很多的秒杀类型的业务,那么就不能单纯在itemId 加类型加锁,还需要设计排队队列以及合理的调度算法,防止超卖等等,那些就是题外话了。本文只是将这个场景作为一个切入点,具体怎么设计锁,什么场景用还要结合业务。

未来80%的搜索流量将分发给熊掌号,并且也将为直接提供服务的熊掌号页面导流一系列全新的数据和措施显示,从站到号的改变将成为百度强力推行的政策之一,那些顺应趋势的内容和服务提供者将从中挖掘到巨大的红利。

对于首席信息安全官和其他网络安全专业人员来说,网络安全问题成功升级至董事会议程,也可以帮助他们在董事会和C级高管会议中获取一定的话语权,并获得他们想要的资源和支持。不过,对于那些尚未做好准备的信息安全专业人士而言,董事会对网络安全问题的重视将为他们造成不少的负担。试想一下,作为信息安全专业人士的你,现在已经成功取得了公司高层的关注,但是,你能有效地与他们进行沟通吗?你有能力成为一名“业务一致型”(business-aligned)的首席信息安全官吗?

领域服务概念

媒介匣上线熊掌号新产品

现在,让我们站在企业C级高管和董事会的角度来思考这个问题,看看网络风险对于他们究竟意味着什么:

借用《Implementing Domain-driven Design》里面的对于领域服务的定义。领域的某个操作过程或转换过程不是实体或值对象的职责时,应该将操作放在一个单独的接口中,即领域服务,并且要和通用语言保持一致。这里的非实体或值对象操作会有很多种情况,比如某个操作需要对多个领域对象操作,输出一个值对象。在分层的架构中,有点类似于Manager。但是如果过渡抽象manager就会出现贫血,所以还需要确保领域服务是无状态的,并且做好和贫血模型的权衡。可能大多数情况,领域服务的参数都是比实际的领域模型小的,只有些关键属性的值对象。如果服务只操作领域的实体或值对象,则可以考虑下放到domain model中操作。

媒介匣在流量变革时期,紧抓要素,体现出高度的互联网洞察力,率先发掘潜在流量入口,致力于帮助企业和服务者进行熊掌号托管运营一站式服务,有效地提高品牌知名度。

首先,他们认为网络风险只是开展业务的另一项成本,而且他们正在关注许多企业正在面临的网络风险。网络安全并不是一个特殊的“臭鼬工厂”(SkunkWorks,借指担任秘密研究计划的地方)。当然,它是一个需要大量技术专长的领域,但运营、财务以及其他业务部门也是如此。

前面提到了Manager,但是很多应用中都会把Manager抽象成接口的形式,但大多数情况其实完全没有必要,可以通过服务Factory的方式解耦,或者用Spring的@Service注解来注入真正的服务实现类。对于一些简单的领域操作,还可以抽象一个迷你层,这个迷你层也可以称作是领域服务,只不过是无状态,无事务,安全的一个抽象层。

我们的服务五大赋能手段:

其次,他们习惯将风险呈现为金钱概念的“损失风险”。无论是市场风险、信用风险还是企业风险管理的其他组成部分,其他业务部门都能将这些风险可能造成的损失换算成一连串美元金额。通过这些数字,决策者可以设定“风险偏好”,即自己能够承受的“损失风险”程度,并通过一系列举措来控制这些“损失数字”,例如投入更多控制措施,购买保险等等。

领域事件其实也可以归纳为领域服务,不过领域服务的事件是幂等的。因为领域服务是无事务的,所以事件也是无副作用的,这样在处理聚合依赖的时候,需要保证他们的最终一致性。

1.内容保障

现在,再让我们站在信息安全团队的角度来看这个问题,得到的观点可能会完全不同。

{领域事件

针对原创内容和优质资源进行收录排序、展现上的保护与优待

事实上,信息安全专业人员的观点通常是“以IT为中心”而非“以业务为导向”的观点。在他们看来,网络安全风险可以通过成熟度评级来完成:例如,与IT行业最佳实践清单进行对比——假设“达标”的条件越多便意味着风险越低;或是与IT行业其他人在安全方面的花费进行对比——假设花费更多的便意味着风险更低。一些风险评级甚至可能基于信息风险团队的直觉/经验——这些评级通常被标记为“中等”、“高/低危”,或是被称为“补丁”、“漏洞”或IT以外的人所不理解的其他术语。

将领域中发生的活动建模成一系列的离散事件,每个事件都用领域对象来表示。简而言之,领域事件就是领域中发生的事件。还拿租书为例,一本书被借走了,那么需要产生一个借书订单,并且对于租书者来说,需要能查看自己租书的列表和书籍详情,同时这本书也需要被标记为不能再借出的状态(因为已经被借走了)。这里面bookRent就可以作为一个领域事件来发出。

2.流量拓展

很显然,这些专业性过强的评级,都不是与高级管理层或董事会进行有效沟通的合适工具,因为他们没有按照其他业务部门能够理解的方式来谈论风险。

事件的聚合

全新熊掌号流量分发机制,开放阿拉丁、搜索结果结构化展示等搜索资源

一些网络安全专家仍然坚持,从财务角度来衡量网络风险是不可能的。但目前,这种坚硬的态度正在日渐消退。最近,全球分析公司Gartner就将“风险量化”列为其“运营综合网络风险管理计划的5大必备条件”之一

对于上述的事件模型,我们可以创建具有聚合特性的领域事件。这里我们可以把这个事件本身建模成一个聚合(BookRentEvent 对象),并且有自己的持久化方式。唯一标识可以由一组属性决定,在客户方(Client)调用领域服务的时候创建这个领域事件{new bookRentEvent())},并添加到资源库中,然后再通过消息的方式进行发布。发布成功后再回调更新时间状态。但这里需要注意,消息发布最好和事件资源库在相同的上下文,或共享数据源,这样就可以保证事件的成功提交,在不同上下文系统,就需要做全局事务来保证。而唯一标识在这里的作用就是为了防止消息重发或者重复处理。所以订阅方需要检查重复消息,并且忽略。如果是本地上下文的事件,最好提供equals和hashcode 实现。

3.品牌曝光

衡量和量化风险的一种方法就是使用标准的信息风险因子分析(Factor Analysis of Information Risk,简称FAIR)模型,该模型主要以财务术语来评估信息风险。这种方法可以通过从公司和行业来源收集有关网络安全事件的数据,然后将不同类型的风险呈现为相应的财务价值;同时,它也可以通过Monte Carlo模拟引擎运行数据,再以财务形式生成损失风险值。

结合刚才的例子,在书籍管理上下文中,书被借走了,那么书籍唯一表示和书的状态(Rent被借出)就可以标识一个事件。这个事件中需要有借书人的信息(如id,nick等),那么在持久化这个事件后,可以post一个Eventbus的本地消息,由用户书籍领域服务监听,更新用户书籍列表等一系列操作。然后再Callback到事件源,更新事件状态,处理成功。如果需要处理事件都在本地上下文,处理起来并不麻烦。

以熊掌号为粒度的搜索新呈现,全方位曝光资源方的品牌、logo等信息

就信息风险因子分析(FAIR)模型而言,风险是未来损失的可能程度和可能频率。等式的两边(即程度和频率)都很重要。高程度且低频率的可能是低风险;高频率且低程度的可能会是高风险。

发布领域事件

4.用户运营

想要将业务与损失风险条款中的网络风险保持一致的话,您需要采取下述一些步骤。

领域事件的发布可以用Observer模式。在本地上下文,也要尽量减少对基础设施或者消息中间件暴露领域模型,所以,需要将本地模型(领域模型)封装成事件的聚合。比如我们不能直接发布一个BookRent聚合的事件,而是一个BookRentEvent,这个Event对象,还会持有一些事件特有的属性,比如可能根据需要,会有occurTime(发生时间),isConsumed(是否已经被处理)。事件发布时,所有订阅方都会同步收到通知。领域事件的主要组件就是publisher和subscriber了。

引导用户关注并留存,养成搜索粘性,实现多元化变现

1. 了解业务的最大收益在哪里,以及它是如何创造出最大价值的;进而了解在网络攻击事件中遭受财务影响最严重的地方是哪里。

发送者

5.技术支持

通常来说,电子商务的业务中断,计划、设计或其他知识产权被盗、从数据库中泄露机密的客户信息,这些都会导致销售损失、市场份额损失、法律费用、劳动力成本等等。事实上,只需通过询问您的财务、人力资源、法律或运营部门,或是通过行业报告进行扩充,这些损失都是可以量化的。

发送者本身并不表达一种领域概念,而是作为一种服务的形态。无论用什么技术方式实现,用什么框架,处理事件发送的思路也都可能不尽相同。比如,在web应用中,可以在启动应用的时候处理订阅者向发送者的事件注册(避免注册和处理发送的线程同步问题)。比如可以将关注的事件registe到本地的一个ThreadLocal的publisher List中。应用启动完成后,开始处理领域事件的时候,就可以发送一个事件的聚合。这个事件的聚合是一个事件对象,而不是领域模型中的实体,因为我们要暴露需要暴露的事件给其他上下文,而不是暴露完整的领域对象。如果使用EventBus,我们可以在post的时候,封装一个事件作为参数。

整合支付、AI、账号等技术能力,助力资源方案化流程,服务C端用户

2. 了解造成损失的可能性网络事件的类型和发生频率。

订阅者

熊掌号效果展示:

您的安全运营中心(SOC)或记录网络故障的部门将帮助您了解这些历史网络攻击事件发生的事件和地点。将这些信息与威胁情报供应商和行业报告(如Verizon数据泄露调查报告)相结合,将为您的企业提供有关未来网络攻击的相关预测和建议。返回搜狐,查看更多

事件的订阅者可以作为应用服务的一个独立的组件。因为应用服务是在领域逻辑的外层,如果是纯粹的事件驱动,那么订阅者作为一种应用服务,也可以定位成具有单一职责的,负责事件存储的应用服务组件。

熊掌号主页|支持品牌结构化展现,聚合优质内容和多元化服务

责任编辑:

分布式领域事件

熊掌号寻址权益|熊掌号在搜索结果中的寻址满足需求

在处理分布式事件中,最重要也是最难处理的就是一致性。消息的延迟,处理的不幂等就会影响领域模型状态的准确性和事件的处理。但是我们在系统间交互的过程中,可以用一些技术方式来达到最终一致性。这其中可能就需要进行事件模型的持久化。处理方式可以

熊掌号原创保护|优质原创内容在收录及展现上给予优待

1. 领域模型和消息设施共享持久存储的数据源。这种需要事件作为一种本地事件模型存储在和本地领域模型的同一个数据库中。这样保证了本地事务的一致,性能较好,但是不能和其他上下文共享持久化存储。

熊掌号消息页|搭建运营者与用户间的信息互动桥梁

2. 全局XA事务(两阶段提交)来控制。模型和消息的持久化可以分开,但是全局事务性能差,成本高。

熊掌号展示位置|内容和服务提供者入驻百度生态的认证账号

3. 在领域模型的持久化存储中,单独一块存储区域(单独一张事件表)来存储领域事件。也就是做本地的EventStore。但是需要有一个发布事件的消息机制,消息事件是完全私有的。消息的发送可以交给消息中间件来处理。如果可以的话,还可以将时间存储作为Rest资源。事件就可以以一种存档日志的形式对外发布事件(消息队列,通过消息设施或者中间件发送RabitMQ,MetaQ等)。这样还保证了时间的可追溯性。

图片 3

我们使用事件来解耦,是为了考虑尽量避免RPC,简化系统依赖,减少外部服务不可用对系统模型带来的状态影响。所以领域事件强调的是高度自治,但是也需要斟酌,通过事件处理的情况必须是容许延时的,并且消息的接收方需要是一个幂等接收器(可以自幂等,或者对于重复消息的拒绝处理),因为消息是可能重复发送的。}

媒介匣--百度熊掌号授权全国TP运营服务商(港澳台除外)

需要解决的问题

百度授权|百度熊掌号官方授权核心代理服务商,享有绿色通道

分布式的思路和线程同步锁ReentrantLock的思路是一样的。我们也要考虑如以下几个问题:

全网领先|熊掌号托管运营一站式服务,排名快速上首页,提高品牌知名度

  • 死锁的情况。复杂的网络环境下,当加锁成功,后续操作正在处理时,获得锁的节点忽然宕机,无法释放锁的情况。如A在Node1 节点申请到了锁资源,但是Node1宕机,锁一直无法释放,订单没有生成,但是其他用户将无法申请到锁资源。
  • 锁的性能效率。分布式锁不能成为性能瓶颈或者单点故障不能导致业务异常。
  • 如果关键业务,可能需要重入场景,是否设计成可重入锁。这个可以参考下在多线程的情况下,比如ReentrantLock就是一种可重入锁,其内部又提供了公平锁和非公平锁两种实现和应用,本文不继续探讨。带着以上问题,和场景,沿着下文,来一一找到解决方案。

专业团队|熊掌号专业内容运营团队和深度技术开发团队及渠道关系

本文由wellbet手机吉祥官网发布于互联网科技,转载请注明出处:基于业务的CISO,基于Redis实现分布式锁

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文