写点什么

使用 Akka、Kafka 和 ElasticSearch 等构建分析引擎

  • 2016-08-14
  • 本文字数:2414 字

    阅读完需:约 8 分钟

本文翻译自 Building Analytics Engine Using Akka, Kafka & ElasticSearch ,已获得原作者 Satendra Kumar 和网站授权。

在这篇文章里,我将和大家分享一下我用 Scala、Akka、Play、Kafka 和 ElasticSearch 等构建大型分布式、容错、可扩展的分析引擎的经验。

我的分析引擎主要是用于文本分析的。输入有结构化的、非结构化的和半结构化的数据,我们会用分析引擎对数据进行大量处理。如下图所示为第一代架构,分析引擎可以用 REST 客户端或 Web 客户端(引擎内置)访问。

(点击放大图像)

简单描述一下用到的技术:

  • Play 框架做 REST 服务器和 WEB 应用。Play 是个基于轻量级、无状态和 WEB 友好的 MVC 框架。
  • Akka 集群作处理引擎。Akka 是个工具集,用于在 JVM 上简化编写高并发、分布式、和有弹性的消息驱动应用。
  • ClusterClient 用于与 Akka 集群通信。它运行在 REST 服务器上,将任务发给 Akka 集群。使用 ClusterClient 是一个非常错误的决定,因为它并不会维持与 Akka 集群的长连接,因而会经常报连接错误,而且重新建立连接时还要把那个 Client 所在的 JVM 也一起重启。
  • ElasticSearch 用作查询引擎和数据存储,包括原始数据和分析结果。
  • Kibana 用作可视化平台。Kibana 是有弹性的分析和可视化平台。
  • Akka Actor 用作 ElasticSearch 的数据导入导出服务。它的表现非常好,服务从来没出过故障。
  • S3 用作集中化文件存储。
  • Elastic Load Balance 用作节点之间的负载均衡。
  • MySQL 用于元数据存储。

我们从 Akka 2.2.x 版开始用起,也碰到了一些严重问题,主要表现为:

  • ClusterClient 与 Akka 集群之间连接断开:在负载大 CPU 使用率高时,ClusterClient 常常莫名其妙的与 Akka 集群断开连接。因为它是个第三方库,所以我们只好把 JVM 重启来让它继续工作,有的时候还要半夜爬起来处理问题。
  • 资源利用率:我们发现 REST 服务器上 CPU 使用率只有 2-5%,这样太浪费资源了,Amazon EC2 服务器可不便宜。
  • 延迟问题:REST 服务器运行在不同的服务器上。这样就造成了延迟问题,因为对于每一条 Client 发过来的请求,它都要把请求反序列化,再序列化然后才能发到 Akka 集群。从 Akka 集群发来的响应消息也是一样,要先反序列化再序列化,然后才能发给请求方。这样的序列化和反序列化过程常常导致超时问题。而且,我们只是把 Play 用作 REST 后台而不是完整的 WEB 框架,我承认这是我们的设计问题。

为了解决这些问题我们设计了第二代架构,主要变化有:

  • 去掉 Akka ClusterClient。
  • Spray 替换掉 Play 架构,因为把 Play 用作 REST 服务不是个正确的决定。Spray 是个轻量级 HTTP 服务器。
  • 为了减少端到端的延迟,我们把 REST 服务运行在 Akka 集群节点所在的 JVM 上,而不是单独的节点上。

新架构是这样的:

(点击放大图像)

太棒了,这样的系统工作得非常好。生活又变得非常美好,团队也得到了很多表扬。

三个月后,来了个要增加Datasift 做为数据源的新需求,提供流数据和历史数据。这个需求好满足,只要增加一个新服务,从 Datasift 中拉取数据并发送到分析集群上即可。

(点击放大图像)

增加新服务很简单,但却导致了新问题:

  • 上述架构本质上来说是个推送模型,每当有大量的流或历史数据被推送过来时,集群就会处理不过来。
  • 我们决定把集群由 4 个节点扩展为 8 个节点。这样峰值情况下还可以,但正常情况下大多数节点都处于非常空闲的状态。我们用的是 Amazon EC2 4x.Large 节点,非常贵,所以就引发出了基础设施的费用问题
  • 我们决定使用 Amazon 的自动扩容服务。在集群上负载增加时它的确是自动扩容了,可是负载降下来时它却没有缩容。Amazon 自动扩容服务对我们的业务情况处理得不够好。
  • 另一个问题是 Akka 集群的内部节点通信在 CPU 使用率超过 90% 时常常出问题,原因可能是因为我们经验不够不会配 Akka 集群,也有可能是 Akka 集群那时候不象现在这么成熟。
  • 如果有节点崩溃的话,那整个处理过程就会停止。

当我们在努力为这个问题找解决方案时,又收到需求要再增加一种数据源!

在经过很多次头脑风暴之后,我们明白了现有架构的问题,于是做出了一个简单、可扩展和容错的第三代架构

(点击放大图像)

在这个新架构里,我们去掉了Akka 集群,重写了分析引擎。它完全是基于Akka Actor 的,REST 服务也是运行在相同的JVM 上。REST 服务只是简单的从客户端接收请求,做认证和鉴权,然后创建一条待处理消息发送到Kafka 队列中去。分析引擎的每个节点都会从Kafka 队列中拉取数据,处理完毕再拉取下一批。这样它就永远不会忙不过来。

受益于Kafka 的内部机制,不管哪个节点死掉了,Kafka 都会自动的把要处理的消息发送到另一个正常节点上,所以不会有任何消息丢失。

在这个架构下我们就不必继续租用以前的Amazon EC2 4X large 服务器了,只要用Amazon EC2 2X large 就可以支持任何负载,节省了很多钱。(此处应有掌声。:) )

这完全是个基于拉取模式的架构。所有的请求和浪涌 都通过Kafka 集群处理。它永远不会忙不过来,因为所有操作都是基于拉取模式的。整个系统部署在 26 台 EC2 节点上,已经快两年了,生产系统一次故障都没出过。

我们也用 Kafka 保存了各种服务日志来分析性能、安全和用户行为。Kafka 生产者会把日志发送到 Kafka 服务器中。因为我们已经有了 ElasticSearch 的导入导出服务,我们可以仍然用它们来推送 ElasticSearch 的日志。我们也可以轻松地用 Kibana 将用户行为可视化。

结论

  • Akka Actors 非常适合于打造高并发、分布式、有弹性的应用程序。
  • Spray 非常适合作轻量级 HTTP 服务器。现在它已改名为 Akka-HTTP
  • Play 框架非常适合于构建高并发、可扩展的 WEB 应用,它底层是 Akka。
  • ElasticSearch 是个非常好的搜索引擎,它底层是 Lucene,可以提供全文检索功能。尽管我们也把它当成数据存储来用,但数据持久化并不是它的强项(比如与 Cassandra 相比)。
  • Kafka 非常适合于流处理和日志汇聚。它的架构设计就已经支持可扩展、分布式、容错等功能。

请耐心等待我改进第四版架构之后再更新这篇文章吧……快乐编程,不断创新!

2016-08-14 17:4811468
用户头像

发布了 152 篇内容, 共 70.7 次阅读, 收获喜欢 64 次。

关注

评论 1 条评论

发布
用户头像
很棒!请问您有微信公众号or blog之类的吗,希望和您多交流(akka萌新)
2018-11-08 15:24
回复
没有更多了
发现更多内容

kube-scheduler源码分析(3)-抢占调度分析

良凯尔

Kubernetes 容器 源码分析 云原生 容器云

波卡将怎么影响区块链生态

不登山的小鲁

区块链 波卡

【Go实现】实践GoF的23种设计模式:SOLID原则

元闰子

Go 设计模式 SOLID原则

模块5课后作业

苍狼

课后总结 模块五 架构训练营5期

Spring Cloud Ribbon 中的 7 种负载均衡策略

王磊

SpringCloud

《重学Java设计模式》作者开始录视频了!

小傅哥

设计模式 小傅哥 视频学习

实用机器学习笔记二十七:深度神经网络架构

打工人!

深度学习 学习笔记 机器学习算法 3月月更

在线上传图片二维码识别解析

入门小站

工具

Java八股文1—Java平台概览

javaadu

Java 面试题 Java八股文

DDD实战(4):战略设计之系统上下文和限界上下文

深清秋

DDD 软件架构 生鲜电商系统 3月月更

bigdata作业

Pyel

Vue3 企业级网站建设

源字节1号

小程序 开源 前端开发

2022第10周-职业素养被触动的瞬间

李印

总结思考

微博评论高性能高可用架构

smile

架构实战营

简单了解 Python 匿名函数:lambda

踏雪痕

Python Lambda函数 3月程序媛福利 3月月更

在 Flutter 中使用 NavigationRail 和 BottomNavigationBar

坚果

3月日更 flutter for web

微博评论高性能高可用计算架构设计

「架构实战营」

图解黑客DNS攻击

喀拉峻

网络安全

不得不知道系列之探活机制

梦朝思夕

高可用 网关 健康检查 服务探活 探活

Linux之rcp命令

入门小站

Linux

架构训练营-作业五

默光

计算架构 架构训练营5期

电影图书电视剧

xujiangniao

算法训练营总结

施正威

作业十

hunk

云原生训练营

吾日三省吾身

xujiangniao

Java面向对象知识点拆分(二)

逆锋起笔

java面试 javase 3月月更 Java面试题

【Vue】整合tinymce富文本编辑器

TaurusCode

Vue tinymce 富文本编辑器

一日为期,极行千里 ——「企业级零代码黑客马拉松」正式启动报名

明道云

云端网络的三大场景概述

穿过生命散发芬芳

3月月更

全链路压测(七):核心链路四问

老张

性能测试 全链路压测 稳定性保障

订单系统的设计(20/100)

hackstoic

技术架构

使用Akka、Kafka和ElasticSearch等构建分析引擎_语言 & 开发_Satendra Kumar_InfoQ精选文章