百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Autodesk基于Mesos的通用事件系统架构

ccwgpt 2025-07-21 13:20 2 浏览 0 评论

【编者按】本文由Autodesk Cloud软件架构师Olivier Paugam撰写,解释了如何集合Mesos、Kafka、RabbitMQ、Akka、Splunk、Librato、EC2等基础设施解决实际问题。此外,以如此小规模的团队解决问题确实令人赞叹。

以下为分享原文:

数月前分到了一项新的任务:做一个集中事件系统(central eventing system),允许各个后端彼此通讯——包括动态流式(activity streaming)后端、渲染、数据转换、BIM、日志报告、分析等等。最终确定,这应该是一个可以匹配多种负载、使用场景与可扩展配置文件的通用系统。此外,这个系统还需要具备简单易用的接口。最后,这个系统的每部分都应当能够自动扩展。

然而,笔者根本没有那么多的时间去深入开发,再选用稳定通用、性能良好的Kafka作为存储核心(当然这里Kafka并不是唯一选择)。同时需要注意的是,这里还需要通过一些API将之以前端的方式提供。而在一些思考后,使用后端管理offset同样被否决,因为这样做在处理实例错误时需要建立大量约束。

基于这些需求,这里设置了两个独立的层:一个API层,处理接收的信息;还有一个后端层,托管常驻、有状态的Kafka做通信的流处理服务(比如执行生产者和消费者)。这两个独立的层分别具备良好的扩展性,只需要一致的路径以确保客户端与同一个后端流处理服务通讯不会中断。

这两个独立的层完全用Scala实现,并使用了Play!框架。同时,这两个层都非常依赖Akka的actor系统(每个节点通常运行着几百个actor)。后端层执行了定制的Kafka producer与consumer,并使用了独立的actor设置来管理预读与写入缓存。在整套系统中,“ Everything is implemented as nested finite-state machines ”被一直执行。使用Librato收集度量数据,随后转到Splunk处理。

如上所述,这里实现了两个独立的层,那么它们之间的路由机制该如何完成?非常简单,这里使用的是用RabbitMQ——可靠且兼具弹性!对于实现这个“phone-switch”,AMQP队列是良医妙药。同时,使用逻辑分片对其扩展也十分简单(比如对每个事务中出现的cookie使用哈希),它将会把一组固定的后端节点与一个RabbitMQ broker连接起来。

那么,这里为什么不聚合RabbitMQ broker?其主要原因在于这么做并不会带来显著地提升,同时也非常耗时。实际上,各独立broker之间的分区流量更高效易控。跟收益比起来,附加的工作量微不足道。

简而言之,在一些容器拓扑中执行针对路径路径,其取决于不同后端节点主导的是什么样的streaming session。扩展整体与分层拓展一样简单,取决于具体的需求。实际中唯一的限制来自虚拟网络适配器与其带宽。

现在有趣的部分来了:流量的稳定该如何确保,同时还需要避免byzantine 故障?其实这里并不存在太多的挑战,只需使用一个简单的二阶段提交协议,将客户端与后端作为镜像的状态机(比如始终同步),这可以通过让读写操作需求明确的确认请求来实现。尝试读取的做法在失败后进行重试,直到获得确认,接下来会对后端更新(比如将Kafka offset转发,或者编排一系列事件发布)。这样,客户端与后端之间的传输就类似于“分配session”、“读取”、“确认”、“读取”、“确认”……“处理”。

通过这些处理,系统的巨大优势在于可以有效地呈现操作幂等,同时还可以在状态机上编译所有逻辑,无需使用烦人的说明语句(PS,请原谅我追求酷炫的思想)。此外,任何网络故障都可以通过重试解决,从而可以自由地实现control-flow和back-pressure。

这样一来,所有功能都通过Apache ThriftAPI提供(汇聚了压缩和HTTS,并准备实现某些情况下场景的TCP切换)。当下,平台客户端已经使用了Python、Scala、NET和Ruby等多个语言,并使用了大量炫酷的技术。值得一提的是,Kafka offset是由客户端控制的,使得控制后台更为简单。

到了这里,你肯定想问,后端节点挂掉的话该如何处理?这里需要感谢的是二阶段提交协议让读取数据变得简单——客户端复制失败后会使用现有的offset重新分配一个新的streaming session。因此这里的问题存在于向Kafka写入数据,因为它是异步的,因此可能会面临受到下游back-pressure的情况(在节点失败后,Kafka broker也会出现问题,这一点必须注意)。因此这里需要为后端系统实现一个优雅的关闭功能,从而在等待写入时关闭阻止新的请求进入。再不济,也可以将任何等待数据刷新到磁盘中,等待稍后处理。

这里你肯定想问,基础设施问题该如何解决?这里的原理是相同的,任何与处理streaming session的实际后端节点传输中断必然会导致速度变慢,但是由于二阶段提交,这里不会产生令人不快的影响。

此外,在落入Kafka log之前数据会被自动加密(AES 256),当然你一定要在Kafka producers和consumers之间共享秘钥那么只能祝你好运了。关于安全,streaming session通过OAUTH2认证,每个请求单独用MD5-HMAC,并通过TLS向后端集群传输。

那么,这个炫酷的系统是如何部署的?这里使用是Mesos/Marathon集群来运行(现在还不是DCOS,不过在未来会转换过去,并享受其强大的控制面板)。当下,集群托管在AWS EC2 上,在多个c3.2xlarge实例上被复用(在给定区域中执行一个小型部署,10到20算不少了)。请注意,在Kubernetes(不管是EC2还是GCE)也可以使用同样的方法。

使用Ochopod技术完成部署(自集群容器),它同样是开源的。将操作减到最少。比如推进build时,API层只负责分配一些新的容器,等分配好之后再逐步清理旧的。所有这些操作都通过一个专门的、在集群中运行的Jenkins从节点来处理(其本身也是一个Ochopod容器)。

事实上,笔者也开发了Ochothonmini-PaaS,只是为了快速开发运维(devops)所有的容器。

下面让你体会Ocho-* 平台的强大:1个人(笔者)可以管理跨越2个regions上的5个系统部署,包括所有备份基础设施……而且还有时间写写博客和代码。

所以,总体来讲,对它设计与编码是件很有意思的事情,再加上它现在作为Autodesk Cloud基础设施的关键部分在生产环境运行(相当不错)。也欢迎各位提交问题。

相关推荐

ForkJoinPool的了解与使用(fork-join)

ForkJoinPool是一个强大的Java类,用于处理计算密集型任务。使用ForkJoinPool分解计算密集型任务并并行执行它们以获得更好的Java应用程序性能。它的工作原理是将任务分解为更小的子...

Netty 时间轮源码解析(时间轮java实现)

定时任务在中间件和业务系统中有很多应用,比如:注册中心中定期上报状态的心跳机制。RPC框架中定期扫描请求列表移除超时请求。延迟队列提交未来时间的任务。业务系统每日凌晨跑批处理或报表任务。Java原...

Autodesk基于Mesos的通用事件系统架构

【编者按】本文由AutodeskCloud软件架构师OlivierPaugam撰写,解释了如何集合Mesos、Kafka、RabbitMQ、Akka、Splunk、Librato、EC2等基础设施...

全局视角看技术-Java多线程演进史

作者:京东科技文涛全文较长共6468字,语言通俗易懂,是一篇具有大纲性质的关于多线程的梳理,作者从历史演进的角度讲了多线程相关知识体系,让你知其然知其所以然。前言2022年09月22日,JDK19发...

为什么应该使用Dapr来构建事件驱动的微服务?

微服务架构从本质上来说是分布式的。构建微服务总是会遇到极具挑战性的问题,比如说弹性服务调用、分布式事务处理、按需扩容以及严格一次(exactly-once)的消息处理。将微服务放在Kubernet...

WEB前端开发学习流程(web前端开发简明教程)

相对web后端开发来说,web前端开发对大部分初学编程者比较友好,而且入门门槛低,就业范围广。是大部分转行学IT的一个首选方向。web前端开发工程师,主要进行网站浏览器的开发、优化、布局的工作。在了解...

《s24z 编程指南》大纲(AI 提示词)

由于AIGC的迅速发展,本教程《s24z编程指南》,尝试用如下方法:准备《编程指南》的大纲,按章节划分,每小节由相关知识点和文字组成。每次将一小部分文本,以提示词的形式,送入Kimi或Ch...

有哪些常用的Python后端开发框架?

以下为你介绍一些常用的Python后端开发框架,包含各自的特点、适用场景与示例代码:Flask特点:轻量级、灵活,核心代码简洁,几乎不强制开发者使用特定的工具和库,开发者可按需添加扩展。适用场景...

数学分析的结构(数学分析的结构方法)

一、基础结构层实数系统与集合论数学分析的根基建立在实数连续之上,通过集合论(如公理化集合论)定义数学对象的抽象结构。例如,实数集的完备性公理是数学分析区别于其他数学分支的关键特征。此外,点集拓扑学(如...

新手在学习Web前端时需要学习的内容汇总

Web前端开发因为入行门槛低,是很多人转行IT开发行业的首选,但想要成为一名合格的Web前端开发工程师同样要具备过硬的专业技能,而且想要学成后高薪快速的就业,过硬的技术是基本条件。那么,新手小白学习W...

基于 Kotlin KMP 实现 HarmonyOS 与 Android 双平台 SDK 开发实践

背景随着鸿蒙平台的进一步发展,大家的态度也逐渐从观望转向实际投入,越来越多的公司开始考虑将自家应用迁移到鸿蒙平台。但是这一过程并非想象中的那么简单,尤其对于已经存在很多年的大型项目来说,直接投入大量人...

爱奇艺 App 中台技术实践(爱奇艺 app 中台技术实践在哪)

本文来自爱奇艺研究员在ArchSummit全球架构师峰会上的演讲整理,将为大家分享爱奇艺打造移动中台的过程。爱奇艺移动中台的建设过程可分为组件解耦、组件定制化和平台化,未来会利用平台发现、沉淀和复...

软件开发|同样的功能需求,为什么有的软件公司报价高?有的低?

最近有个朋友问我:同样的功能需求,为什么有的公司报价高?有的公司报价低?其实,有很多创业的朋友,在寻找技术开发公司的时候,经常会遇到这个困惑,一样的功能需求,不同的公司有不同的报价,有的差别还很大,那...

零基础要怎么学习Web前端?Web前端学习路径分享

Web前端因为薪资高、入行门槛低,成为很多人转行进入IT行业的首选。对于零基础的人来说,学习之前一定要想清楚为什么而学习Web前端,给自己一个清晰的定位,摆正心态。如果还不清楚学习路线,可以参考千锋武...

MICROCHIP/微芯 KSZ9031RNXIA 以太网芯片

特征o适用于IEEE802.3应用的单片10/100/1000Mbps以太网收发器oGMII/MII标准接口,3.3V/2.5V/1.8V容错I/Oo自动协商以自动选择最高链路连接速度(10/10...

取消回复欢迎 发表评论: