写点什么

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

  • 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:102139

评论

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

叮!Techo Day 腾讯技术开放日如约而至!

CODING DevOps

CODING DevOps Cloud Studio Techo 腾讯技术开放日

Web3.0时代来了,看天翼云存储资源盘活系统如何赋能新基建(上)

天翼云开发者社区

区块链 Web

后端开发—10个小技巧教你保证线程安全

C++后台开发

线程 多线程 后端开发 linux开发 C++开发

VPS是干嘛用的?有哪些知名牌子?与云服务器有什么区别?

行云管家

运维 等保备案 VPS

等保备案主体是谁?在当地网安进行备案是吗?

行云管家

等保 等级保护 等保备案

物联网低代码平台常用《组件介绍》

AIRIOT

低代码 物联网 低代码开发平台 低代码平台 低代码,项目开发

讲师征集令 | Apache DolphinScheduler Meetup分享嘉宾,期待你的议题和声音!

白鲸开源

Apache 大数据 开源 workflow dolpinsheduler

使用Karmada实现Helm应用的跨集群部署

华为云开发者联盟

云原生 后端

AI落地的新范式,就“藏”在下一场软件基础设施的重大升级里

九章云极DataCanvas

当量子计算遇上人工智能

启科量子开发者官方号

人工智能 算力 量子计算

3. Caller 服务调用 - dapr

MASA技术团队

C# .net 框架 Framework dapr

CODING DevOps 助力中化信息打造新一代研效平台,驱动“线上中化”新未来

CODING DevOps

持续集成 CODING DevOps 项目协同 合作 中化信息

Geoffrey Hinton:我的五十年深度学习生涯与研究心法

OneFlow

人工智能 机器学习 深度学习

中能融合携手天翼云打造“能源大脑”

天翼云开发者社区

云计算 大数据 安全

疫情之下,元宇宙游戏开发设计如何发展?

开源直播系统源码

游戏开发 元宇宙

OpenHarmony—内核对象事件之源码详解

OpenHarmony开发者

Open Harmony

使用 Open Connector 进行 HubSpot 和 SAP 系统的集成工作

汪子熙

云原生 系统集成 SAP 6月月更 open-connector

CRM 全栈开发工具 WebClient UI Workbench 的设计细节介绍

汪子熙

CRM webUI SAP 全栈开发 6月月更

大神详解开源 BUFF 增益攻略丨直播讲座

Apache IoTDB

开源 面试 求职 秋招 线上讲座

Wallys/4×4 MU-MIMO 6GHz QCN9074 Single Band Wireless Module

wallys-wifi6

NFT质押LP流动性挖矿系统开发详情

开发微hkkf5566

openGauss内核:SQL解析过程分析

华为云开发者联盟

数据库 sql 后端

中国内地仅四家突围 联想智慧颐和园荣获 “2022年IDC亚太区智慧城市大奖”

科技大数据

有哪些好用的供应商管理系统

优秀

低代码 数字化转型 供应商管理

云上竞技,360°见证速度与激情

天翼云开发者社区

wallys/DR7915-wifi6-MT7915-MT7975-2T2R-support-OpenWRT-802.11AX-supporting-MiniPCIe-Module

wallys-wifi6

字节跳动数据平台技术揭秘:基于ClickHouse的复杂查询实现与优化

字节跳动数据平台

Clickhouse

代理类型升级,APISIX 支持 Kafka 作为上游

API7.ai 技术团队

kafka 后端 代理 网关 APISIX 网关

征文投稿丨使用轻量应用服务器搭建博客环境

阿里云弹性计算

MySQL nginx 博客 Node 轻量应用服务器

跟着官方文档学 Python 之:解释器和IDE

甜甜的白桃

Python pycharm IDLE 6月月更

浅谈 SAP 软件里的价格折扣设计原理

汪子熙

SAP ERP pricing 企业管理软件 6月月更

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