谷歌浏览器崩溃设置崩溃_让它崩溃

谷歌浏览器崩溃设置崩溃

“让它崩溃”是Erlang世界中的一个口号,在该上下文中具有非常特定的含义,但是如果脱离上下文可能会被严重误用。

在Erlang世界中,“崩溃”是指参与者在其特定上下文中的终止。 在精心设计的参与者系统中,参与者具有非常具体的工作,如果他们无法完成该工作,他们会立即失败。 对于在JVM领域工作的人们来说,这是一个问题,因为崩溃可能重载,意味着事物会改变事务系统的语义。

真实示例:假设您有一个分布式系统,该系统接受一条消息,将其写入数据存储,然后将新消息传递给其他三个组件。 进一步假设系统的事务语义是,直到所有四个操作都已经完成并且#1永久成功或#2永久失败之后,作业才“完成”。

这里重要的细节是,在执行转帐时,我们希望两个帐户的余额都作为一次交易进行更新并且我们不能处于钱已经离开一个帐户但还没有到达另一个帐户的状态。 为此,需要分布式事务的概念,但不使用“开箱即用”的分布式事务协调器。 为了明确起见,我们将假定所描述的组件是通过Web服务公开的,并且无法访问彼此的基础事务管理系统。

因此,为了进行此设计,简单的实现(将其称为同步模型)如下:

抽奖

在此模型中,我们需要处理以下情况:如果嵌套事务中的任何一个失败,则请求者也可以回滚OTHER事务,并向客户端报告整个事务已失败。 我不会深入研究细节,但这相当复杂,我们将不理会这些细节。 这里的重要细节是整个事务都是同步且阻塞的。 这意味着客户端和请求者必须在其他组件上报告“成功”或“失败”之前在其他组件上报告“成功”或“失败”(通常在内存中),并且必须四处闲逛。 此外,这意味着任何组件最终故障都是“永久性”故障(从客户的角度来看),并且由客户决定重试交易是否重要。 尽管某些故障可能确实是永久的(一个或另一个帐户可能不存在或永远不会存在),而其他一些故障(与一个或另一个帐户更新者的连通性)可能只是短暂的和/或短暂的。

在很多方面,这将事情简化了,因为它将成功或失败的管理职责委派给了最左边的组件。 话虽这么说,例如,如果第一个更新程序成功,但是请求者死亡,并且无法回滚第一个事务,则仍有可能出错。

如此说来,很明显(我希望)是,如果请求处理器死亡,则需要一些中间管理来确定是否存在“部分”事务,如果发生故障,可以立即回滚部分事务。 例如,这可能是这样。

抽奖2

我们仍在回避一些内部事务管理内务处理,但是重要的细节是,在客户失去对请求者的跟踪(因为它死了)与主管的最终“交易失败”之间,客户不知道事务的状态是什么……确实可能是事务成功了,但是传输请求者和客户端之间的连接完全失败了。

因此,此模型中的问题有两个方面:#1“主要”是同步的(尽管“请求管理者”->“客户端消息传递”显然不是),并且“#2”假定传输请求者只要失败就可以“失败”。系统部分发生间歇性故障会导致发生部分更新。 显然,这可能取决于接受的业务规则,但可能是不可接受的,但这肯定是一种通用模型……即您不确定交易是否有效,因为随着客户的出现……您的网络中断了,因此您无法正常工作银行的请求主管发送的乐队电子邮件,确认确实没有失败。

尽管这是一个好方法,但是它确实会占用高度并发系统中的更多资源,不能很好地处理故障(您只能使用几种硬编码策略),并且可以扩展到数十个或数百个组件故障,单个故障的可能性变得如此之大,以致您永远不可能成功。

那有什么选择呢?

这里的细节(它可以提供更大的灵活性)是假设事情会间歇性地失败,并将事务语义设计到应用程序协议中。 这使您可以拥有“不够健壮”的单个组件,但会增加整个系统的事务管理复杂性。 一个可能如何工作的示例:

画3

这里的重要细节是:#1事务细节在传输存储区中保持不变,#2传输主管对如何管理事务策略的语义负责,#3事务具有在短暂故障中变得持久的能力系统中的“大多数”组件,以及#4每个独立组件只需要更短的时间即可使用。 通常,这些都是理想的品质,但是…

细节决定成败

这种方法的一些负面影响是:#1作为系统的设计者,您现在明确负责事务行为的细节;#2如果系统要在组件故障时保持健壮,则操作必须是幂等的(在调用中没有副作用)。 作为此示例如何更健壮的示例,让我们看一下如何实现在瞬态故障中持久的行为:

抽奖4

在此模型中,当帐户请求者不可用时,转帐主管执行简单的重试策略。 尽管这可能使系统更健壮并以更大的灵活性解决故障,但很明显,帐户请求者(或商店)需要能够识别出有时它可能接收重复并能够妥善处理。 另外,了解使状态发生变化的事物与仅承认其与您对系统状态的观点相符的事物之间的区别变得更加重要。

更重要的是,后一种方法现在意味着我们必须考虑“永久性故障”与“暂时性故障”之间的区别,而且这通常不是一件容易的事……即,在不存在的帐户和真实帐户之间进行转移是一个暂时性问题还是不??如果您认为这是一个简单的答案,那么请考虑是否存在另一个异步过程会创建和销毁帐户的情况? 在1分钟内重试是否可以接受(如果您在初次尝试进行转帐时正在创建帐户)?

总而言之,尽管将交易分散成较小的部分可以增加强大的功能,但同时也具有很大的责任感。 这种设计系统的方法是Scala和Erlang助手所倡导的“让它崩溃”的口头禅。 “让它崩溃”并不一定意味着“放松您的事务语义”或“不处理错误”,它意味着您可以委派负责从同步过程中的故障中恢复的责任,并以更健壮和新颖的方式进行处理。

翻译自: https://www.javacodegeeks.com/2016/04/let-it-crash-3.html

谷歌浏览器崩溃设置崩溃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值