使用Apache Spark的微服务的实时性能分析和分析

使用Apache Spark的微服务的实时性能分析和分析

作为一种架构风格,微服务因其极高的灵活性,越来越受欢迎。应用程序在功能上分解为一组松散耦合的协作服务,通过定义良好的(REST)API进行交互。通过采用这些设计原则,开发团队可以以极其快节奏的方式独立开发独立的微服务。已知使用这种开发模式的组织将其部署从每天 50到300次更新......。

采用微服务的最大挑战之一是,虽然我们获得了单个微服务的敏捷性,但获得对系统整个运行(包括数十个交互微服务)的洞察变得更加困难。如图1所示,多个联网服务联合工作以生成对用户请求的响应; 应用程序执行的端到端视图对于快速诊断和解决生产部署中的性能下降问题至关重要。在具有数十个微服务(每个数百个实例)的应用程序中,越来越难以理解信息如何流经各种服务,其中阻塞点是什么以及用户所经历的延迟是网络的人工产物还是呼叫链中的微服务。

图1.应用程序是一个松散耦合的微服务集合,它独立于其他服务而发展。

鉴于对在云环境中运行的基于微服务的应用程序的性能分析工具的需求不断增加,我们正在尝试将实时性能分析器烘焙到平台基板本身的想法,类似于自动缩放,负载平衡等等。该服务通过捕获和分析应用程序中的微服务之间的网络通信以非侵入性方式工作。在云规模运营中,服务的分析方面需要实时处理来自租户应用程序的大量通信跟踪,发现应用拓扑,跟踪在网络上的微服务流动中的各个请求等等。由于我们需要运行批处理和实时分析应用程序,因此我们决定使用Apache Spark作为我们的大数据分析平台。

图2.使用Spark的简化性能分析系统

图2展示了一个简单的实验,我们通过这个实验来了解如何利用Spark进行运营分析。我们的设置包括一个Openstack云,一组基于微服务的应用程序,在不同的租户网络中运行,以及一个小的Spark群集。在每台Nova计算主机上安装软件网络抽头以捕获在租户网络内传输的网络数据包。从租户网络捕获的有线数据被压入Kafka总线。我们在Spark应用程序中编写连接器,将数据包从Kafka中提取出来并实时分析。

我们编写了Spark应用程序来尝试回答以下问题:

  1. 在生成针对特定最终用户请求的响应时,信息如何跨服务流动?在IT运营分析领域,这种特定类型的分析操作通常被称为“事务跟踪”。
  2. 给定一个时间窗口,应用程序中各种微服务之间的调用者/被调用者关系是什么?
  3. 给定一个时间窗口,应用程序中各种微服务的响应时间是多少?

我们开发了两个Spark应用程序来回答这些问题:近乎实时的事务跟踪应用程序和批量分析应用程序,以生成应用程序的通信图和延迟统计数据。前者是在Spark的流式抽象之上构建的,而后者是由Spark作业服务器管理的一组批处理作业

跟踪跨微服务的事务(或请求流)需要在应用程序中的微服务之间建立请求 - 响应对之间的因果关系。为了完全不知道应用程序,我们决定将该应用程序视为黑盒子。我们假设应用程序没有使用任何全球唯一的请求标识符来跟踪跨各种微服务的用户请求,我们设计了我们的系统。

为了追踪因果关系,我们对Aguilera等人在他们的2003年SOSP论文中对一个分布式黑匣子系统进行性能分析所采取的方法稍作了修改。对于同步Web服务,本文提出了一种嵌套算法,它将分布式应用程序表示为节点(服务)的图形,边表示节点之间的交互。嵌套算法检查服务之间的调用时间戳以推断因果关系。简而言之,如果服务A呼叫服务B,并且服务B在向A返回响应之前与服务C对话,则称对C的呼叫B _由_A到B的呼叫。通过分析一大组消息,我们可以通过统计置信度量度来导出跨服务的呼叫链,并消除不太可能的替代方案。本文中发布的原始算法旨在在大型跟踪集上以离线方式运行。我们修改算法以在分组流的移动窗口上进行操作,随着时间的推移渐进式地改进拓扑推断。

图3显示了事务跟踪应用程序中部分作业的工作流程。图4显示了由Spark应用程序推导出的租户应用程序中的事务跟踪。分组流以块的形式到达,以PCAP格式封装。从数据包流中提取各个流并将其分组为滑动窗口,即DStream。在给定的时间窗口内,通过比较标准五元组(src ip,src port,dest ip,dest port,协议),提取HTTP请求和相应的响应,形成下一个DStream,然后将其发送到其余的处理链实现嵌套算法(未在图中显示)。我们将事务跟踪应用程序的输出存储到时间序列数据存储(InfluxDB)中。

图3.实时事务跟踪应用程序中的处理阶段子集
图4.事务跟踪应用程序发现的跨微服务的事务跟踪的单个实例

第二个Spark应用程序是一个标准批量分析应用程序,用于在给定时间窗口内生成服务调用图以及调用延迟统计信息。该应用程序作为标准批处理作业提交给Spark作业服务器。如图5所示,批量分析应用程序将单个事务跟踪从InfluxDB中提取出来,并将它们转换为每个事务跟踪的成对列表。然后将这些列表聚合以形成两个RDD,一个包含顶点列表,另一个包含边缘列表。顶点列表根据顶点名称进一步去重。最后,应用程序的调用图以有向图的形式计算,以及有关图中每个边上的延迟的统计信息。此图是应用程序的时间演变图的一个实例,代表特定时间段的状态。图6和图7显示了批量分析作业输出的租户应用程序的调用图和延迟统计信息。

图5.批量分析应用程序中的处理阶段
图6.批量分析应用程序发现的调用图
图7.由批量分析应用程序计算的平均服务间调用延迟

Spark平台使我们能够使用统一的大数据平台构建不同类型的分析应用程序,如批处理,流式处理和图形处理。

本文的版权归 人工智能资讯小编 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏斑斓

我们的产品架构

本文是我在中生代技术群分享的话题《创业一年经历的技术风雨》中的第一部分《产品架构与技术选型》的第一部分。 整体架构 我们的产品代号为Mort(这个代号来自电影...

3073
来自专栏blackheart的专栏

[解读REST] 5.Web的需求 & 推导REST

衔接上文[解读REST] 4.基于网络应用的架构风格,上文总结了一些适用于基于网络应用的架构风格,以及其评估结果。在前文的基础上,本文介绍一下Web架构的需求,...

17810
来自专栏编程一生

战狼:业务高速增长下,如何保证系统的稳定性和高可用?

1894
来自专栏小石不识月

微服务编排

在 Jexia 中,我们相信微服务架构是组织我们的后端云的最佳方式 —— 它可以很好地进行关注分离(Separation of concerns),并为特定任务...

2348
来自专栏跟着阿笨一起玩NET

WCF技术我们应该如何以正确的方式去学习掌握

客户端调用WCF服务可以通过添加服务引用的方式添加,这种方式使用起来比较简单,适合小项目使用。服务端与服务端的耦合较深,而且添加服务引用的方式生成一大堆臃肿的文...

582
来自专栏Java架构师学习

多研究些架构,少谈些框架——一名阿里架构师的笔记

微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为...

3388
来自专栏数据之美

网站数据统计分析之二:前端日志采集是与非

在上一篇《网站数据统计分析之一:日志收集原理及其实现》中,咱们详细的介绍了整个日志采集的原理与流程。但是不是这样在真实的业务环境中就万事大吉了呢?事实往往并非如...

3097
来自专栏java架构技术

如何快速搞定微服务架构?

如今,微服务架构已经成为了现代应用开发的首选。虽然它能够解决大部分的程序问题,但是它并非一颗百试不爽的“银弹”。

794
来自专栏京东技术

京东价格保护高并发 | 七步走保证用户体验

2014年加入京东,负责京东财务退款及价格保护研发建设,擅长京东逆向流程场景、金额拆分计算、高并发下网站优化。

1032
来自专栏CSDN技术头条

使用Spark进行微服务的实时性能分析

作为一种灵活性极强的构架风格,时下微服务在各种开发项目中日益普及。在这种架构中,应用程序被按照功能分解成一组松耦合的服务,它们通过REST APIs相互协作。通...

1949

扫码关注云+社区