Flutter+FaaS一体化任务编排的思考与设计
作者:闲鱼技术-古风
Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业务闭环。在新的研发模式落地与实践的过程中,一直在思考如何提高FaaS端研发体验与研发质量,以下是落地过程中遇到的问题。
- 如何提高FaaS研发体验?
FaaS层通常是直接在主干中逐块增加业务代码,这种写法领域数据间的依赖并不清晰,后续维护时需要针对领域数据进行更换、顺序调整或者由串行改并行时需要增加很多工作。 - 如何提高FaaS侧研发质量?
客户端同学编写FaaS代码时,需要针对服务端各种异常增加保护性代码与降级策略,比较容易出现遗漏从而导致整体质量下降。
任务编排是什么?
回顾一个完整的业务闭环,包括中台、领域层、业务层与渲染层。云端一体场景下FaaS侧更多的工作集中在业务层与渲染层,进行数据聚合、裁剪、字段映射和结构调整。

以下单业务为例,FaaS层通过6次HSF(RPC框架)调用获取领取数据组装而成。商品信息、收货地址与闲鱼币可以并行执行,红包、运费与验货担保可以并行执行,由于依赖商品信息与收货地址,两组任务需要串行执行。

上图中可以把每一个节点(例如:获取商品信息)抽象为任务,通过代码实现此流程就是任务编排。
任务编排如何提升开发体验?
FaaS层通常是直接在主干中逐块增加业务代码,遇到复杂场景时主干代码可能百行甚至千行,以下是通过任务编排框架编写的下单页功能代码。

- 通过Map类型的数据作为入参,其中多个任务都可能使用到这些参数。
- 使用then与thenAll两个API进行任务编排,then函数表示传入的函数串行执行,thenAll传入的函数需要并行执行。
- 调用apply进行任务链路的执行。
- 通过链式调用,整体结构非常清晰,框架的侵入性低。
可以看到以上代码入参、任务编排与获取结果,结构非常清晰。从代码上就能看出任务数量、任务流程、任务的串行与并行。通过简洁、少侵入性与链式调用极大提升开发体验。

requestItemDO函数是获取领域数据常见流程,首先是获取参数userId与itemId,通过HSF获取商品信息,拿到结果之后判断此次请求是否有效,如果有效返回具体Model数据。
任务编排的应用场景
任务类型
任务编排并不局限于HSF任务,由于框架仅要求传入的是一个函数,通过函数进行抽象,可以支持任意类型的任务编排,例如:HSF、MetaQ、Tair、DB等。

任务编排形式
下单页的例子是串行&并行共存的场景,任务编排框架支持任意数量串行、并行、复杂场景任务编排。开发同学只需要开发任务函数,然后根据任务需要串行还是并行,调用具体API接口,不用关心同步与异步的各种操作细节。

异步任务
FaaS侧的代码通常都是IO密集型的任务,例如PRC调用、数据库读写等。Dart基于事件队列(Event Queue)支持异步,其优点是可以同时等待多个IO事件,并不会阻塞主线程,从而降低总体RT(Response-time 响应时间)。Dart 异步机制耗时如下图:

任务复用与沉淀畅想

针对FaaaS侧把单个数据的获取与处理抽象为Task,随着Task沉淀的越来越多,通过多个任务的组装会出现业务解决方案层,很多场景下都需要安全校验,例如:判断用户是否禁言、商品是否违规等,这些通用的规则也可以在其他也场景中复用,例如安全校验规则可以在群聊功能中复用。
三端一体研发架构场景下,从数据的获取、组装到前端的UI可以一个开发者完成,整个链路可以如右图进行一体化的组件沉淀,一个组件包含领域数据、转换为ViewModel、客户端视图组件组成,从而形成云端一体的组件复用,提升整体开发效率。
任务编排如何提高研发质量
客户端写FaaS层代码,需要学习服务端QPS(Query Per Second每秒查询次数)、RT(Reaction Time 响应时间)、TPS(Transactions Per Second每秒事务处理量)、限流保护、降级保护与热点保护等,其中最担心的还是如何保证部署到Serverless平台上FaaS层代码的稳定性,如何才能提高质量不出现问题与故障。可以通过异常分类、如何捕获异常与异常处理三个角度来分析质量问题。
异常分类
首先总结下服务端常见异常类型:
- 代码异常:空指针异常、数组越界等Exception
- 系统异常:机器异常、内存溢出、线程池占满、DB异常等
- 接口异常:接口响应超时、下游依赖异常

异常捕获
无论FaaS层出现哪种异常,不能因为异常而导致用户长时间无法正常使用功能,需要考虑异常捕获,并设计整体的降级、监控与告警方案。通常服务端开发都是通过在可能出现问题的场景添加try catch,这样代码写起来不够简洁,开发同学更期望看到像上文中queryItemDO函数一样,只编写业务功能代码,至于捕获、通用监控与告警,由任务编排框架进行统一的兜底处理。

任务编排框架把捕获的异常信息通过两种方式传递给开发同学,一种是针对单个任务的onError,一种是针对整个链路的catchError,通过这两种方式可以优雅的获取异常堆栈并进行灵活的异常处理。

通过针对调用链路设置整体超时时间,避免因任务的等待超时而导致整个接口出现超时的情况。
异常&监控

Sunfire是服务端监控平台,拥有一整套海量数据实时分析监控系统,提供系统、应用、业务等各种视角的监控能力,如果触发配置的规则会发送预警。任务编排框架把捕获的异常与当前FaaS名称等信息统一输出到日志中,在Sunfire平台配置通用的规则进行异常监控。
总结与展望
任务编排框架Jade可以解决本篇提出的两个问题:
- 提升研发体验:开发者通过链式调用形式进行任务编排,支持任意类型任务,所有任务都可以灵活的组合,可以任意调整任务的执行顺序。
- 提升研发质量:任务编排框架增加异常类型梳理、异常捕获与异常监控机制。
对任务编排的框架的期望并不仅针对任意类型的任务灵活编排,后续在开发阶段通过源码输出技术文档与流程图,针对单任务与任务链路进行测试,通过任务编排框架作为抓手有效打通需求、开发、测试与运维阶段,从而达到提高开发效率提高安全性的目标。
Flutter+FaaS一体化任务编排的思考与设计的更多相关文章
- 从网易与淘宝的font-size思考前端设计稿与工作流 (转)
从网易与淘宝的font-size思考前端设计稿与工作流 阅读目录 1. 问题的引出 2. 简单问题简单解决 3. 网易的做法 4. 淘宝的做法 5. 比较网易与淘宝的做法 6. 如何与设计协作 7 ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- Flutter异常监控 - 伍 | 关于异常监控框架设计的思考
前言 最近阅读 Catcher.BugSnag.Rollbar 三个 Flutter 异常监控开源框架,文章链接如下: Flutter 异常监控 - 壹 | 从 Zone 说起 Flutter 异常监 ...
- 从网易与淘宝的font-size思考前端设计稿与工作流
本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问题,内容较多,但对你的技术和工作一定有价值,欢迎阅读和点 ...
- 数据从mysql迁移到hbase的一些思考及设计
一.进行迁移的原因 由于业务的发展,使用mysql进行建立索引进行搜索已经造成数据流的瓶颈卡在了数据库io,例如每次dump全表的时候,会造成压力过大,造成耗时很长,并且当前的数据量基本上已经达到了亿 ...
- .Net架构篇:思考如何设计一款实用的分布式监控系统?
前言 无论从最早期的unix操作系统,还是曾经大行其道的单体式应用,还是现在日益流行的微服务架构,始终都离不开监控的身影.如windows的任务管理器,linux的top命令,都可以看作是监控的面板. ...
- 从数据库、页面加载速度角度思考 id设计 sku asin
(已对数据进行字符串替换,去身份识别.隐私跟踪) 12-13-14-15-16-18岁20女孩夏装初中高中学生韩版上衣服短袖T恤衫-tmall.com天猫 https://detail.tmall.c ...
- 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架
目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...
- 闲鱼Flutter&FaaS云端一体化架构
讲师介绍 国有,闲鱼架构团队负责人.在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享. 传统Native+Web ...
- #w30 2019年大前端技术周刊
本周是2019年第30周 会议 2019年ArchSummit全球架构师峰会 2019年7月在深圳举行了ArchSummit全球架构师峰会,里面有不少关于大前端的主题可以关注. 从0到1,移动政务应用 ...
随机推荐
- apt-get install安装软件时出现依赖错误解决方案
在使用apt-get install安装软件时,经常会遇到如上图所示错误,该错误的意思为缺少依赖软件,解决方案为: aptitude install golang-go
- 让高清和流畅并存,3DCAT云看车技术领跑汽车行业
3DCAT实时云渲染平台在承接了奥迪大客户的项目后,将把一部分业务重心放到汽车行业,加大了研发力度和算力投入,细节决定成败,3DCAT的云看车高度还原了汽车每一种材质和纹理,逼真的视觉享受,让车主爱不 ...
- JS(函数、作用域、预解析)
一 函数的概念 在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用.虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS ...
- 使用Channel传递数据
上次我们使用了事件异步传递数据,这次我们使用Channel在一个线程通信传递数据 直接上代码 public static class ChannelSample { private static re ...
- 工作记录:TypeScript从入门到项目实战(项目篇)
Vue项目中使用 前面两篇介绍过TypeScript基础和较深入的东西,本章介绍如何在Vue项目中使用. 项目创建 创建项目直接使用Vue-cli创建 下面是步骤: 1.运行vuecli, 2.选择合 ...
- LOTO仪器---如何用LOTO的EMI模块锁定你PCB上的干扰做分析?
在开发电子产品的过程中,电磁干扰(EMI)可能会导致许多问题,可能会在模拟电路上出现很大的噪声,可能导致通讯乱码,可能导致芯片无规律重启,可能会导致数字电路有莫名其妙的误动作. 硬件工程师通常会把主要 ...
- 一个基于.NET Core构建的简单、跨平台、模块化的商城系统
前言 今天大姚给大家分享一个基于.NET Core构建的简单.跨平台.模块化.完全开源免费(MIT License)的商城系统:Module Shop. 商城后台管理端功能 商品:分类.品牌.单位.选 ...
- 一键生成项目 SpringBoot+MyBatis代码生成器 支持Oracle MySQL PostgreSQL
下载地址 https://github.com/lxw112190/lxw_Helper 如果觉得github下载慢的,可以加我QQ(819069052)我发给你,或者加QQ交流群:758616458 ...
- Oracle regexp_replace 手机号脱敏
select '18012345678',regexp_replace('18012345678','(.){4}','****',4,1) from dual;
- java使用Ffmpeg合成音频和视频
1.Maven依赖 <!-- 需要注意,javacv主要是一组API为主,还需要加入对应的实现 --> <dependency> <groupId>org.byte ...