50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

如何处理分布式系统中的紧急情况?

  • 2021-05-01
  • 本文字数:2116 字

    阅读完需:约 7 分钟

如何处理分布式系统中的紧急情况?

本文最初发表于 gitconnected 博客,经原作者 Gregory Pabian 授权,InfoQ 中文站翻译并分享。


由于发生意外或遭受攻击,任何分布式系统都可能会遇到紧急情况。即便是像执行脚本这样看似无害的操作,也可能会对整个平台造成严重破坏,最终导致用户无法使用。本文作者分享了软件开发者在紧急情况发生之前为系统做好准备的一些方法。

 

免责声明:我不是软件安全专家,而是一名全栈软件开发者,本文中的所有信息都源于我的开发经验。我希望讨论主要的可能性以准备和处理紧急情况,但我不打算就正确和错误的做法提出看法。至于如何设计一个安全的分布式系统,这可能需要用到资深安全工程师的专业知识。

应急预案

 

我相信系统设计者可能会考虑准备一个应急预案,至少要知道如何保护一个分布式系统不受内外威胁。我从各种 OWASP(即 Open Web Application Security Project,开放式 Web 应用程序安全项目,是一个在线社区,在 Web 应用安全领域提供免费的文章、方法、文档、工具和技术。)资源中学到了很多关于网络应用安全的知识。

 

在我看来,应急预案至少应该包括对下列问题的回答:

 

  • 谁可以启动应急预案,以及有哪些权利;

  • 应急预案实施期间将发生什么情况,在哪里发生;

  • 如何才能有人启动应急预案,将会持续多久。

 

本文假定系统管理员可以使用 CLI 以系统上的最高权限启动应急预案,该措施的调用将无限限制多个后台的某些功能。

时间框架

 

这个应急预案可在这两个时间框架下生效:

 

  • 过去和未来:系统会根据指定的过去和所有未来事件改变其行为;

  • 未来:系统会根据所有未来事件改变其行为。

 

当然,并非所有的分布式系统都支持逆行性行为变更。在使用长时间运行事务的系统中,遵守这样的转换要求执行补偿性事务,这样才能明显消除原始过去事务的影响。

解决方案

 

我将所有可能的解决方案分为三组:无状态协议(如 HTTP)中阻止访问的方案、基于消息的系统(如 Kafka)中阻止访问的方案,以及回滚事务的方案。只要它们在所设计的系统中实际发挥作用,系统架构师就可以选择应用这些解决方案中的一些,甚至是并行的。

无状态协议中阻止访问

 

阻止特定的访问令牌(例如 JWT)可以说是通过限制特定用户对资源的访问来解决紧急情况的最精确的方法。若攻击者已获得访问令牌,并且可能将其用于非法用途,则系统可应用此解决方案。根据暴露程度的不同,此解决方案可以影响到一个或多个后端。

 

系统也可以组织访问特定的访问方法(例如 HTTP 端点或 RPC)。如果系统管理员不知道特定攻击者的访问令牌,或者由于最新的部署,端点无法正常工作,那么他们可能会选择此解决方案。在选择用这种方法解决问题之前,我认为人们应该考虑一下锁定整个功能的后果,以及如何与最终用户沟通这个选择。

 

在阻止某些服务中的某些访问方法无效的情况下,可以考虑关闭该服务。在分布式系统中,这相当于禁止在相关服务实例中向负载均衡器转发请求,或者终止所有以上实例。不管选择哪种解决方案,都会对系统造成严重的影响,因为很多功能已经不能工作了。

 

最后,系统管理员可以决定关闭整个系统(或者至少所有后端)。关闭分布式系统的精确算法在很大程度上取决于其基础设施和使用的冗余。若有人考虑到这一可能性,则应考虑到后果,因为除了某些可能在离线模式下工作的前端功能外,系统将会停止工作。

基于消息的系统中阻止访问


系统管理员可以禁止在基于消息的系统内共享特定的消息。有些情况下,消息代理可以应用此类策略,而有些情况下,这一工作属于后端。这样的规则,读者可以将其视为判定函数,它接受一个参数、一条消息,然后返回一个布尔值。

 

另外,人们可以选择阻止特定的主题或通道分发消息。它会间接地影响依赖这种通信方式的后端。此外,人们也可以禁止某种服务通过某一主题或通道收发消息。

 

最后,有人可能会决定阻止整个消息管道。与关闭整个系统一样,这种解决方案对系统内的通信产生巨大影响,并可能导致多个功能失效。软件开发者在出现这种情况之前,应该弄清楚哪些功能可能会崩溃。

回滚事务


在后端向关系数据库提交某些事务之前,系统可能会回滚它们。这类规则的应用要求对后端架构进行有效性检查,并确保后端能够及时接收策略变更信息。此解决方案可以作为取消已启动事务的示例。

 

对于使用依赖注入的后端,一个基于紧急情况的限制列表可以驻留在所有请求或消息处理程序重用的组件中。人们可以使用全局变量实现类似的结果,但是我不赞成这种方法。


处理程序可以运行一个检查函数,以验证对于当前评估的请求是否存在某些限制。当系统使用紧急编排时,接受紧急通告的后端需要与系统的其他部分通过无状态请求或消息管道共享信息。若后端无法执行此操作,则将阻止应急响应的传播。系统设计者应该找到避免这个障碍的方法,例如,让前一个服务等待下一个服务确认信息处理,然后继续进行处理。

总结

 

在本文的开头,我已经指出,由于不同的系统使用不同的模式进行后端到后端的通信,所以在分布式系统中处理紧急情况的方法多种多样。我认为,尝试将危机应对措施融入开发中的系统中,或许可以为系统设计提供许多参考。

 

作者介绍:

 

Gregory Pabian,全栈软件开发者,热爱构建产品。

 

原文链接:

 

https://levelup.gitconnected.com/emergencies-in-distributed-systems-9f93c6d75600

2021-05-01 10:102327

评论

发布
暂无评论
发现更多内容

作为程序员一定不要仅仅追求物质,做了6年Android开发

android 程序员 移动开发

免费Android高级工程师学习资源,苦熬一个月

android 程序员 移动开发

这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

冰河

数据库 分布式 分布式事务 微服务 数据一致性

聊聊产品的使用场景

石云升

场景应用 职场经验 10月月更

对话凡泰极客联合创始人杨涛: 小程序生态市场潜力广阔

FinClip

小程序 金融科技 移动开发

刚从阿里、头条面试回来,动脑学院课程值得买吗

android 程序员 移动开发

Docker环境搭建和使用

Fox666

Docker

华为云数据库内核专家为您揭秘MySQL Volcano模型迭代器性能提升千倍的秘密

华为云数据库小助手

GaussDB 华为云数据库 GaussDB(for MySQL)

谈一谈使用Python入门量化投资

Regan Yue

量化交易 10月月更

从不一样的角度描述Android事件传递,字节跳动面试官

android 程序员 移动开发

紧张的336小时53分钟21秒,我等来了字节跳动offer(Java岗)

Java 编程 程序员 架构 面试

Leetcode 题目解析:70. 爬楼梯

程序员架构进阶

LeetCode 动态规划 算法题 10月月更

自动驾驶 Lidar 激光雷达 易筋 ARTS 打卡 Week 73

John(易筋)

ARTS 打卡计划

模块一学习笔记、总结

吴霏

架构实战营 「架构实战营」

你还在把Java当成Android官方开发语言吗,字节跳动算法工程师总结

android 程序员 移动开发

史上超级详细:扔物线学堂

android 程序员 移动开发

023云原生之Kubernetes的存储

穿过生命散发芬芳

云原生 10月月更

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

码界西柚

云原生 Quarkus 10月月更

架构训练营第3期模块一作业

吴霏

架构实战营 #架构实战营 「架构实战营」

从三流Android外包到秒杀阿里P7,从理论到实践

android 移动开发

作为一个程序员你觉得最大的悲哀是什么,安卓音视频开发

android 程序员 移动开发

做了3年Android还没看过OkHttp源码,学Android看这就完事了

android 程序员 移动开发

含爱奇艺,小米,腾讯,阿里,享学课堂怎么样

android 程序员 移动开发

央行数字货币已落地,来的太快,机遇在哪?

CECBC

三国与AI,交汇在中原

脑极体

中软国际用一场自我进化,推动云市场跨入下一幕

脑极体

区块链与数字化转型携手并进

CECBC

区块链是否正在慢慢演变为中心化的数据库?我们又该如何预防数据中心化?

CECBC

分享Android资深架构师的成长之路,系列篇

android 程序员 移动开发

什么是aPaaS?低代码与高生产率的aPaaS和RAD相比如何?

优秀

低代码 aPaaS RAD

架构设计-电商微服务拆分

小智

架构训练营

如何处理分布式系统中的紧急情况?_文化 & 方法_Gregory Pabian_InfoQ精选文章