大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

Atlassian 使用边车和高容错设计将可用性提升到 6 个 9 以上

  • 2022-10-18
    北京
  • 本文字数:1311 字

    阅读完需:约 4 分钟

Atlassian使用边车和高容错设计将可用性提升到6个9以上

Atlassian 工程播客最近分享了其租户上下文服务(Tenant Context Service,TCS)如何让可用性超过了99.9999%。Atlassian 通过实现高度自治的客户端边车实现了这种高可用性,能够主动保护自己免受 AWS 区域故障的影响。边车通过并发地查询多个 TCS 服务并确保请求在内部是完全隔离的来实现这一目标。


TCS 是 Atlassian 的一项关键基础设施服务,在大多数 Atlassian 云产品的每个 Web 请求路径中都会被多次调用。它提供了“租户元数据”的高可用性、读优化的视图。2022 年 7 月,TCS 每天处理 320 亿次请求,峰值请求率为每秒 586308 次。总体可用性超过了 99.999%,最高吞吐量的客户端在高峰期的平均响应时间约为 11μs。


为了实现这些指标,Atlassian 的工程师采用CQRS模式设计了 TCS。当“租户元数据”目录发生变化时,TCS 将“租户元数据”的转换视图导入AWS DynamoDB。此外,TCS 广泛使用 L1 内存缓存,以及基于 SNS 的缓存失效广播系统。与客户端应用程序一起部署的边车作为 Web 服务器缓存的远程扩展,并通过与多个 TCS 部署通信来提高可用性。下图描绘了 TCS 的架构。



来源:https://www.atlassian.com/engineering/atlassian-critical-services-above-six-nines-of-availability


由于边车的缓存命中率通常超过 99.5%,无法命中的情况相对较少。因此,TCS 边车会在缓存未命中时抢先发送重复的请求——一个发送给选定的“主”父 TCS,一个发送给随机的辅助 TCS。这种方法的一个好处是,边车将无缝地处理父节点或网络故障。它不需要检测失败的请求,因为“后备”请求已经在进行中。


Atlassian 的主要开发者 David Connard 解释了这种方法的细节。


虽然这种逻辑可以很好地应对快速失败的场景,但还需要为缓慢失败的场景做好计划,这通常是系统要处理的最成问题的故障模式,此时关键要进行一些适当的隔离。对于我们来说,适当的隔离意味着任何单亲 TCS、AWS 服务或整个 AWS 区域的故障都不能影响我们的边车在不同区域运行的能力。


为了实现这种高水平的隔离,Atlassian 工程师使用独立的任务队列和线程池来处理请求,对于每个父 TCS 来说是完全隔离的(甚至连 HTTP 连接池实例都是如此)。他们通过减少请求负载(有选择地丢弃请求)和动态调整线程池(限制延迟较低的 TCS 部署的线程池的大小)来防止因任务排队并消耗额外的资源导致的慢故障场景。


在服务器端,失效广播系统进行跨区域调用,发布失效消息。由于跨区域延迟明显较高,可能会影响失效广播。Connard 解释了工程师如何保护 TCS 免受这个问题的影响。


不能让跨区域停机(例如某个目标区域中的AWS SNS 故障)延迟或阻止从该 TCS 服务器向其他区域发送失效广播。为了实现这种隔离,TCS 服务器失效广播系统将所有失效广播数据和处理线程复制到单独的特定于区域的队列中。然后,隔离的工作线程仅从其中一个队列发布到每个目标区域。向一个目标区域发送广播的速度减慢或完全失败只会减缓该区域的处理速度,不会影响向其他目标区域发布消息。


除了提高系统的可用性外,Atlassian 的工程师还采用了多种方法来伸缩系统,包括使用SNS扇出模式、包含边车网络监控功能的自定义请求负载平衡策略,以及采用 gRPC 作为 HTTP API 的低延迟替代方案。


原文链接

Atlassian Exceeds 99.9999% of Availability Using Sidecars and Highly Fault-Tolerant Design

2022-10-18 09:214392

评论 1 条评论

发布
用户头像
对于专有词汇,直接写 sidecar 可能会更好。"边车"有一些懵
2022-10-20 09:49 · 广东
回复
没有更多了
发现更多内容

《Spring实战》读书笔记-第2章 装配Bean,kafka调优面试

Java 程序员 后端

《重构 改善既有代码的设计 3》代码的可理解性应该是我们虔诚追求的目标

Java 程序员 后端

【Java 多线程 2】Java线程池详解,java多线程面试算法

Java 程序员 后端

【Java笔记】数组的处理方法,idea搭建springboot入门

Java 程序员 后端

“三次握手,四次挥手,java程序设计教程第三版雍俊海pdf

Java 程序员 后端

“打工人”都在用的邮件使用规范,springcloud架构源码

Java 程序员 后端

《零基础》MySQL 连接的使用(二十),mybatis实现分页原理

Java 程序员 后端

【Java基础】枚举,nginx源码分析pdf百度网盘

Java 程序员 后端

【Java程序员必知必会的90个细节】1,java面试题选择题

Java 程序员 后端

【MyBatis 6】Statement,mysql基础教程西泽pdf

Java 程序员 后端

【Spring Boot 12】看完这篇,nginxkeepalived原理

Java 程序员 后端

[译] 微服务的设计模式,java后端面经

Java 程序员 后端

【Effective Java】10,javaee架构设计与开发实践

Java 程序员 后端

【Java后端】杭州三面字节,等hr面,虐慌!分享面经和刷过的面试题

Java 程序员 后端

《恋上数据结构第1季》二叉树代码实现,mongodb持久化原理

Java 程序员 后端

《菜菜的机器学习sklearn课堂》数据预处理和特征工程

Java 程序员 后端

《黑马程序员》通讯录管理系统实战,java程序设计实用教程第二版课后题答案

Java 程序员 后端

「Java」几种典型的内存溢出案例,学习linux的书籍

Java 程序员 后端

“我骑着我心爱的小摩托,他又在这里翻车了,mybatisdao接口工作原理

Java 程序员 后端

《恋上数据结构第1季》B树,java基础案例教程第二版答案

Java 程序员 后端

【2021软件创新实验室暑假集训】SpringBoot框架

Java 程序员 后端

【Docker 系列】我们来看看容器数据卷到底是个啥

Java 程序员 后端

【Java 强化】单元测试,linux驱动开发入门与实战pdf

Java 程序员 后端

《JVM系列》 第六章 -- 对象的实例化与内存布局

Java 程序员 后端

《深入理解Java虚拟机 1》Java内存区域与内存分配策略

Java 程序员 后端

「一探究竟」迷之序列化,Java性能优化最佳实践

Java 程序员 后端

【Java核心面试宝典】Day1,java高级工程师面试宝典

Java 程序员 后端

《深入理解Java虚拟机 3》类加载机制与字节码执行引擎

Java 程序员 后端

《零基础》MySQL 管理(三),java程序设计精编教程第三版课后答案

Java 程序员 后端

《码出高效:Java开发手册,java基础编程视频

Java 程序员 后端

【Java8 新特性 3】Supplier简介,springboot面试题

Java 程序员 后端

Atlassian使用边车和高容错设计将可用性提升到6个9以上_软件工程_Eran Stiller_InfoQ精选文章