标签: Serverless

  • 仿真系统概述

    文章首发于阿里云开发者社区(https://developer.aliyun.com/article/717213),修改后发布于本博客

    什么是系统

    讨论仿真系统之前我们需要明确什么是系统,这个概念可以帮助我们理解边界和范围。

    那么什么是系统?

    德谟克利特的著作《世界大系统》有一段关于系统的阐述:

    任何事物都是在联系中显现出来的,都是在系统中存在的,系统联系规定了每一个事物,而每一个事物又能反映系统的联系的总貌。

    中国著名学者钱学森的观点是:

    系统是由相互作用相互依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个有机整体又是它从属的更大系统的组成部分。

    词典对于系统的解释是:

    组成一个复杂整体的一组互相作用、互相联系或者依存的事物。

    用一个汽车总装线来举例,各种零部件通过传送设备(履带或者其他设备),再有工人(或者是机械手臂)按照顺序组装。在这个系统中,工人,机械手臂,零部件相互作用。履带的速度影响零部件的到达,进而影响装配,流水线自身的划分和设计又影响了整体效率。

    从上面这个例子可以感受到我们看系统的时候有两个重要的点:

    一是边界,即确认需要研究事物范围,比如货币的供应量从某种程度上也可能对流水线有影响,但是我们并不会考虑它。

    二是抽象,针对研究内容的不同,需要考虑的事物的详细程度也是不同的,比如机械手臂的出产公司虽然也是一种外部输入,但是会被统一抽象为机械手臂,对于其的特征建模也可以按照平均来计算。

    还有一种更通用的描述系统的方式,即三要素,分别为实体,属性和活动。实体确定了系统构成,属性描述了实体特征,而活动描述了系统内部的相互作用。

    什么是仿真

    仿真一般是指对现实中的系统进行模仿,观测并产生人造过程记录的过程。

    仿真最早用于水利研究,逐渐用于航空、航天和原子能技术等领域。后来随着计算机技术的大力发展,扩展到各行各业。

    针对互联网公司,特别是线上线下融合较深的业务,由于线上试错成本高,反馈周期慢,通过仿真可以很好服务以下几点:

    • 业务形式新,基本没有可以参考的模型或者参数,加上缺少学术上的积累,仿真可以加速研究一个业务场景中复杂系统间的相互影响。
    • 仿真由于是对真实系统的模仿,所以速度和外部参数是可以调整,且对真实系统无影响,可以快速安全进行实验或者验证,加深对于系统行为的理解。
    • 仿真模型和实验的产出可能成为新知识的来源,用于优化业务。

    仿真系统的构建方法

    构建仿真系统流程如下:

    系统建模

    离散or连续

    系统可以是离散,也可以是连续的。当然对于现实中的大多数系统,这两种变化都是共存的,一般我们取其中占多数的为准。

    大部分自然系统都是连续系统,比如湖面的水位,由于降雨,自然蒸发等处于一个时刻变化的状态,而离散系统一般只在离散时间点发生变化的系统,绝对部分人造系统都属于离散系统。

    除了特别的需要以外,大部分系统设计上都会做成离散系统,因为连续系统可以通过引入采样装置转为离散系统,比如上面提到的湖泊系统,就可以通过引入定时采样水质,水位等的装置让系统变成离散系统以方便处理。

    确定核心要素

    需要明确系统中的实体(包括属性),事件,活动。

    我们以外卖配送来看,实体即骑手,顾客,商家,属性可能包括骑手速度,顾客位置,商家位置等,属性可以是从真实系统中获得,也可以是统计上的数据。

    事件主要是对于整个配送有重要影响的,点外卖的时候有一些外卖APP会有进度提示,比如商家接单,商家出餐,骑手抢单,骑手送餐,送达顾客处等,当然这些只是展示出来的事件,系统内部可能更复杂,还有更多事件,确认核心要素的时候一般需要业务专家或者领域专家。

    大部分系统单单靠事件就可以驱动了,但是有时候还需要明确活动。

    一般两个相邻且有先后顺序的事件,如果从逻辑上导致了状态的转移,那可以化为一个活动。比如外卖配送中从待取餐状态转移配送中状态,其实暗含了到店和取餐两个事件。活动并不是必须的,如果研究目的不涉及可以不关注。

    确定仿真算法

    目前有四种成熟仿真算法:

    1. 事件调度
  • 对Serverless的一点理解和思考

    对Serverless的一点理解和思考

    本文首发于阿里云云栖社区,修改后发于本博客。原链接:https://yq.aliyun.com/articles/714659

    什么是Serverless

    技术圈新鲜的词汇和概念层出不同,有些是新的理念,有些是新瓶装旧酒,还有就是已经广泛应用了但是最近才理论抽象化的。

    那么Serverless是什么?

    Serverless还真算不上一个全新的词汇。从字面上看就是无服务器的意思,最早的时候就是单纯指不需要服务器端的软件,绝大部分本地软件都属于这个范畴。

    到了云时代,这个词就囊括了不需要关心服务器的相关技术和服务,比如使用了LeanCloud作为数据库,使用了Auth0作为用户认证服务等。此类服务对于使用者而言屏蔽了服务器等概念,一般也称为Baas(Backend as a Service)。Baas更偏向于服务外包,因为不管是服务器还是内在代码本身都是不透明的,使用者也无法感知。

    再进一步,Faas(Function as a service)出现了,即函数服务/函数计算。这里的函数就是一个代码块,这个代码块没有明确的定义,但是在实际使用了为了响应速度,这个代码块的冷启动时间必须在毫秒级。

    这样就可以在只有需要的时候才调用,做到按需运行,按量扣费。结合云服务商的其他服务,实现多种方式驱动和调度,做到真正的无服务化。当然这里的无服务化只是针对使用方而言的。

    实现这个的本质其实是将一部分或者说一大部分控制都托付给了云服务商。Faas让开发者专注于业务逻辑本身,实际上也只有业务代码本身是开发者受控制,其运行环境,预热时间,缓存机制等都不再受控。

    所以说Faas是Serverless的一种,而且CNCF也将提供Faas和Baas中一种或两种的服务商算作Serverless服务商。但是因为Faas的变革性更大,目前很多场合基本混用Serverless和Faas两者。

    所以本文接下来讨论的Serverless专指Faas,中文也有函数计算,云函数,无服务器计算等称呼。

    Serverless的服务商绑定问题

    对于公有云平台的任何技术,使用者的主要顾虑就是单一服务商绑定。

    因为一旦绑定,将造成数据和业务迁移困难,后续发展可能缺乏选择。还需要考虑云平台出现故障的情况,是否有异构容灾能力,是否会对业务造成不可逆的影响等。

    虽然乍一看,因为业务代码是受控的,且不依赖特定环境,Faas似乎不像Baas那样有绑定问题,但是仔细看Serverless的使用范围不光受代码语言影响,更重要的是驱动的事件。

    对于部署的函数,最终都需要使用云服务商提供的事件来驱动。

    来看下使用Serverless的简要步骤:

    1. 编写函数,并发布到云
    2. 声明事件触发器,由事件触发器触发函数
    3. 云服务商的基础设施监控事件触发器,在触发时分配必要的资源和运行环境给对应的函数,执行函数

    云服务商提供的事件类型越丰富,Serverless的适用面越广。比较通用的事件是HTTP调用和定时调度,其他大部分都是云服务商独有的,所以Serverless是存在较大绑定性的。

    Serverless的服务提供者

    从Amazon在2014推出Lambda至今已有5年,各大云服务商基本都是陆续跟进提供了Serverless服务。

    主流大玩家们包括:AWS Lambda,Azure Functions,Cloud Functions,国内阿里云,腾讯云,华为云等都提供类似服务。

    还有一派自然是开源类型的,需要自建Serverless平台,包括:IBM OpenWhisk,kubeless,knative等。

    云服务商中对于语言的支持基本类似,包括主流的Java,Python,Nodejs,AWS Lambda还支持C#,Ruby,Go等,应该是支持语言中最多的。

    事件类型方面是云服务商强绑定的,比如阿里云支持OSS事件触发器,HTTP 触发器,定时触发器,MNS …

  • Serverless服务提供商

    今天去更新了一下serverless的代码,突然发现又多了几个Serverless服务商。

    之前场内的玩家有AWS Lamabda和Azure Function。然后IBM有一个类似的,可以自己托管的OpenWhisk。

    今天新看到了几个小一点的

    https://webtask.io/
    
    https://spotinst.com/
    
    http://kubeless.io/

    前两个都是服务商,第三个比较有意思,是基于Kubernetes的,开源可以自己托管。…