使用 Spark 进行微服务的实时性能分析
【编者按】当开发者从微服务架构获得敏捷时,观测整个系统的运行情况成为最大的痛点。在本文,IBM Research 展示了如何用 Spark 对微服务性能进行分析和统计,由 OneAPM 工程师编译整理。
作为一种灵活性极强的构架风格,时下微服务在各种开发项目中日益普及。在这种架构中,应用程序被按照功能分解成一组松耦合的服务,它们通过 REST APIs 相互协作。通过这个设计原则,开发团队可以快速地不断迭代各个独立的微服务。同时,基于这些特性,很多机构可以数倍地提升自己的部署能力。
然而凡事都有两面性,当开发者从微服务架构获得敏捷时,观测整个系统的运行情况成为最大的痛点。如图1所示,多个服务工作联合对用户请求产生响应;在生产环境中,应用程序执行过程中端到端的视图对快速诊断并解决性能退化问题至关重要的,而应用中多达数十的微服务(每个还对应数百个实例)使得理解这点变得非常困难。信息是如何在服务中穿梭流动的?哪里是瓶颈点?如何确定用户体验的延迟是由网络还是调用链中的微服务引起?
与此同时,在云环境下,企业对基于微服务应用的性能分析工具的需求与日俱增,因此 IBM Research 正在尝试构建基于平台的实时的性能分析工具,它的性质类似于自动缩放和负载平衡等服务。通过捕获和分析应用中微服务的网络通信,服务按非侵入式的方式进行。在云环境中,服务分析需要处理海量来自实时租户应用的通信追踪,进一步发现应用程序拓扑结构,跟踪当服务通过网络微服务时的单个请求等。由于需要运行批处理和实时分析应用,所以 Spark 被采用。
图2所示,这里设置了一个简单实验来描述如何利用 Spark 进行操作分析。整体的环境是一个 OpenStack 云,一组基于微服务的应用程序运行在不同租户的网络中,还有一个小型Spark集群。在每个 Nova 计算主机上安装的软件网络 tap 来捕获通过租户网络内的网络数据包。从租户网络中捕获的 Wire-data 被投入 Kafka bus。同时,在 Spark 应用中编写连接器,获取 Kafka 的包并对其进行实时分析。
因此,Spark 应用被编写试图来回答下列问题:
对终端用户的请求响应时,信息流是如何通过服务的?在 IT Operational Analytics领域,这种分析操作通常被称为“事务跟踪”。
在给定时间窗中,应用中各种微服务之间的调用/被调用关系是什么?
在给定时间口中,应用中各种微服务的响应时间是多少?
根据以上问题,这里开发了2个 Spark 应用程序:1个实时事务跟踪的应用程序和1个批量分析应用来生成应用的通信图和延迟统计。前者基于 Spark 流抽象,后者则是一组由 Spark 作业服务器管理的批处理作业。
跟踪不同微服务之间的事务(或请求流)需要根据应用程序中不同微服务之间的请求-响应对创建因果关系。为了完全不受应用程序,这里将该应用当作一个黑盒。因此不妨认为应用程序中没有利用任何全局唯一请求标识符来跟踪跨微服务的用户请求。
为了追踪上文所提的因果关系,这里采用了 Aguilera 等人在 2003 SOSP 论文中提出的一种对黑盒分布式系统进行性能分析的方法,并做细微的修改。对于同步的网络服务,论文提出了一种 nesting algorithm,将分布式应用程序表示为一个图,各条边代表节点之间的相互作用。这个 nesting algorithm 会检查服务之间的调用时间戳,进一步推断其因果关系。简单地说,如果服务 A 调用服务 B,而 A 在返回响应之前会和服务 C 通信,那么服务 B 呼叫 C 被认为是由 A 调用 B 引起的。通过分析一大组消息,这里可以得到服务间有统计性置信度的调用链,并消除可能性较小的选项。论文发表的原始算法旨在离线方式下操作大型的跟踪集。这个用例会修改该算法来操作数据包流的移动窗口,并慢慢逐步完善的拓扑结构推断。
图3显示了事务跟踪应用中作业的部分工作流程。图4显示了在一个租户应用中的事务跟踪,由 Spark 应用推导。Packet 流到达块中,以 PCAP 格式封装。个体流从Packet流中提取并按滑动窗口分组,即 dstreams。在给定的时间窗口内,HTTP请求和请求响应通过对比标准的5个 tuple 提取(src_ip、src_port、dest_ip、dest_port, protocol),组成下一个 DStream,然后到nesting algorithm中实现的其余处理管道(未在图中显示)。事务跟踪应用输出结果会存储到时间序列数据存储区中(InfluxDB)。
第二个 Spark 应用是一个标准批量分析应用程序,在给定的时间窗口产生服务调用图以及调用延迟统计。应用作为标准批处理作业被提交到 Spark 作业服务器。如图5所示,批量分析应用从 InfluxDB 分离出独立事务跟踪,并将每个独立事务跟踪转换为<vertex,edge>
对的列表。列表被聚集成两个 RDDS,一个包含顶点列表,而另一个为边列表。顶点列表根据顶点名称进一步解析。最后,应用程序的调用图在有向图中计算,以及图中每条边延迟时间的统计数据。该图是应用程序时间演变图的一个实例,表示给定时间内的状态。图6和7显示调用图和租户应用延迟时间的统计数据,作为该批次的分析作业输出。
通过 Spark 平台,各种不同类型的分析应用可以同时操作,如利用一个统一的大数据平台进行批量处理、流和图形处理。下一步则是研究系统的可扩展性方面,如通过增加主机线性提升数据提取速度,并同时处理成千上万租户的应用踪迹。后续会继续汇报这方面的进展情况。
原文链接: Real-time Performance Profiling & Analytics for Microservices using Spark
OneAPM 是应用性能管理领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 官方博客。
使用 Spark 进行微服务的实时性能分析的更多相关文章
- 王院生:Apache APISIX 微服务网关极致性能架构解析
2019 年 10 月 27 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 杭州站活动,Apache APISIX PPMC 成员王院生做 ...
- Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战
Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...
- .Net微服务架构之运行日志分析系统
一.引言 .Net技术栈目前还没有像spring cloud相对完整一整微服务架构栈,随着业务发展系统架构演进,自行构建.Net技术体系的微服务架构,配套相关核心组件.因平台基于微服务架构方式研发,每 ...
- TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践
本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享.编辑:Cynthia 王启军:华为架构部资深架构师.负责华为的云化.微服务架构推进落地,前后参与了华为手机祥云4 ...
- 使用Netsil监控Kubernetes上的微服务
ubernetes是容器编排和调度领域的王者,它击败了竞争对手Docker Swarm和Apache Mesos,开启了闪耀的未来,微服务可以自修复,可以自动扩展,可以跨zone,region甚至跨云 ...
- 微服务与网关技术(SIA-GateWay)
一.背景 软件架构,总是在不断的演进中... 把时间退回到二十年之前,当时企业级领域研发主要推崇的还是C/S模式,PB.Delphi这样的开发软件是企业应用开发的主流.随着时间的推移,基于浏览器的B/ ...
- 基于Golang设计一套微服务架构[转]
article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...
- 微服务(Micro Service Architecture)浅析
最近一段时间,微服务的概念很火,可能是跟Docker技术的快速发展和壮大有一定的关系,同时借助于Uber.Netflix.Groupon等公司的实践.宣传和推广,使得MSA渐渐地成为企业或者架构师讨论 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_01-Eureka注册中心-Eureka介绍
1 Eureka注册中心 1.1 需求分析 在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中 心来管理微服务信息. 为什么 要用注册中心 ...
随机推荐
- DOS批处理命令-SET命令
SET是专门用来创建.设置.查看或删除环境变量. 总结了下,SET的使用语法一般有下面几种 1.SET 变量名=变量值 这边有一点要注意的,就是变量名和变量值中间的等号两端不需要也不能有空格 看看下面 ...
- 设置win7任务栏显示标题,而不显示缩略图
win7系统的任务栏可以显示桌面缩略图,这是非常好的一个功能,但是有时候我们希望只显示标题,如下所示 怎样设置呢?只要在桌面上的计算机图标上面“右键”,选择“属性”,在弹出的窗口选择“高级系统设置”, ...
- 第九篇、微信小程序-button组件
主要属性: 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 效果图: ml: <!--默认的but ...
- 获取bundle目录下的所有图片文件名
今天在写代码时候,偶然发现自己忘记了一些oc的基础知识(这里指的是获取bundle目录下的所有图片),感到很不爽.在百度了几次,发现自己的领悟能力实在不行,感觉萌萌的::>_<:: 好了, ...
- javascript原生获取元素的方法对比
document.getElementsByTagName(li)获取的是数组,要获取指定值,需在后面加[0],[1]等,即document.getElementsByTagName(li)[0] d ...
- MQ队列
显示队列名dspmq 打开队列 runmqsc QMSAA 200-远程队列 dis qr(*) 显示所有队列 dis qr(saa_to_cips) all 显示队列参数 20-本地队列 查看队列深 ...
- C# SocketHelper 源码
玄机论坛Socket类库源码+Demo 本类库采用C# TcpLister,TcpClient高度封装,采用C# NetworkStream进行异步模式读取数据.采用C# Semaphore来进行并发 ...
- 【原】在一般处理程序中设置session
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using Syste ...
- HTML邮件制作规范
以下内容有些是别人总结的,有些是自己在工作中总结的. 模板最佳尺寸:显示宽度550px-750px,模板高度控制在一屏以内. 1. 用table+css方式构建模板 Div+css布局不完全被邮件客户 ...
- container_of宏定义分析---linux内核
问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of宏定义在[include/linux/kernel.h]中:/*_** container_of - cast a ...