事物中调用RPC

事物中调用RPC

RPC的设计和使用核心是design for failure,从这个角度介绍一下事物中调用RPC,谈谈我自己的理解。

1.场景

一个事物中可能包含N个RPC调用,可能因为各种原因,RPC会调用失败,而事物又不能一直等待,因此需要做系统上的涉及保证系统能正常使用。

2.服务使用方策略

2.1.超时重试

因为RPC请求肯定都是会设置超时的,如果不设置可能造成链路阻塞,但是超时的原因多种多样,有些可能仅仅因为网络抖动。

因此重试是必不可少的,对于不同的服务可以采取不同的超时策略。

  • 不进行重试的

    • 业务逻辑错

    • 下游系统挂掉

  • 进行重试的

    • 网络抖动

    。。。

可以通过业务异常进行区分判断

  • 对实时性有要求的

    • 请求重要度低的

对于这样的超时可以直接执行failfast,或者降级返回mock数据。

  • 请求重要的

基本上是需要根据异常情况进行是否重试,或者事物补偿/人工处理,通常来说对实时性有要求的重试会在固定时间间隔发起。

  • 对实时性要求低的

这样的重试可以采用指数退避的方式,即第一次等N 第二次等2N...这样的方式,不会对下游造成太大压力

2.1.1.如何重试

重试是Design for failure的重要部分

常用的方式有:

  • failover

  • failfast(不重试)

  • failBack

2.2.幂等设计

2.2.1.是不是需要幂等

首先要明确的是不是所有请求都需要做幂等操作的,因为幂等是需要代价的(通常都依赖存储层唯一键,和全局唯一id).类似Restful接口中DELETE GET HEAD等都不需要增加幂等操作,同样RPC也一样,对数据状态不影响的请求不应该过多的增加幂等。

2.2.2.如何保证幂等

通常来说RPC需要带一个全局id(可以考虑snowflake),在接收方将id保存到数据库中,如果id冲突说明已经有此id,即消息是重复的。

2.3.对某些服务进行服务降级

降级是针对相对不重要的服务的,如果是重要服务是不能进行降级的。降级是从整体负载考虑的,因此就需要为服务定优先级,确定优先级之后才能合理的进行降级分配。

2.3.1.对非核心链路服务降级

降级一般有两种方式,自动方式和手动方式,这边主要聊一下自动方式。

2.3.1.1.自动降级

通常来说自动降级需要失败记录的配合:

  • 超时降级

  • 失败次数降级

  • 故障降级

  • 限流降级

等等。。。

2.3.1.2.降级方式

一般来说的降级方式是进行mock返回

  • force:return策略:直接返回mock数据

  • fail:return策略:调用后触发重试上限之后返回mock数据。

2.3.对不重要的服务进行熔断

降级是从整体资源分配的考虑上来考虑的,大多数是因为为了应对即将到来的大流量或者弹性的hold住大流量。而系统往往还会遇到下游系统故障导致无法正确返回的问题。这样就需要增加熔断机制,来保证不会造成压力传递,导致雪崩。

2.3.1.熔断怎么做

断路器状态有以下几个

  • 关闭状态

  • 打开状态

  • 半开状态

2.4.事物回滚(补偿机制)

这一步通常是最后才考虑的,因为随着链路的深入,事物补偿的代价变得很大,不过如果必须走到这一步也只能做,同样也有不同策略:

因为补偿通常都是有状态有上下文的,因此需要保存上个状态的数据,可以通过以下两种模式保存

2.4.1.本机保存

直接本机保存补偿数据

  • 优点:方便,快速

  • 缺点:会涉及宕机丢数据,集群处理时数据混乱

2.4.2.持久化保存

持久化保存也是通常的使用方案,(这里不纠结是使用mysql还是redis,存储层的高可用不在这边讨论)

  • 优点:全局共享,不会丢数据

  • 缺点:可能影响性能,对存储带来压力

2.5.人工处理

如果补偿失败,则会触发人工处理,因为补偿失败意味着这个事物进退两难了,至少这个请求已经脱离系统控制。这时候就需要适合的监控报警方式。

至于如何进行人工处理不在本文讨论内容,各自系统都需要自己解决。无外乎数据修修补补,bug修复。

3.服务提供方策略

3.1.服务限流

光是调用方做处理实际上是不够的,还需要服务自身尽量保证自己不会被压力压垮,因此需要用限流的方式拒绝一些流量,来保证自己服务不会被打挂.

3.1.1.常见的限流策略

  • 漏斗桶

  • 令牌桶

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容