标签归档:CD

FaaS选择标准:对多声道的小欲望

简单,快速的开发是人们对功能即服务(FaaS)的期望。根据我们的调查,71%使用无服务器架构的人表示,在考虑FaaS产品时,易于开发非常重要。

55%的受访者表示,在查看FaaS时,获得其主要云提供商的支持非常重要。相比之下,认为云不可知论的33%是非常重要的,并且您意识到在选择产品时,多声道几乎是事后的想法。在我们看来,这证明无服务器不会在多声道的祭坛上崇拜。

我们之前关于托管和可安装平台的文章显示了实际首选的解决方案。虽然AWS Lambda具有广泛的领先优势,但许多Azure和Google客户都渴望使用其主要云提供商的FaaS产品。我们认为,不必更换云提供商就可以让很多人无法轻松使用,因为人们可以开始使用FaaS。与用户的CI / CD管道集成同样重要。

无服务器不会在多声道的祭坛上崇拜。

不太重要的是与IDE集成,表明开发人员在创建无服务器应用程序时不需要全面的开发环境。此外,对预写功能的需求很少,因为只有16%的人表示在选择FaaS解决方案时非常重要。鉴于这些发现,我们认为云提供商不会根据专注于其FaaS产品的新产品开发工作获得许多新客户。

正如我们的“ 无服务器技术指南 ”电子书中所报告的那样,灵活扩展,节省资源成本和开发速度是人们在软件开发生命周期中看到无服务器的最积极的好处。在所有关于可移植性(跨云环境)的问题中,最不可能被引用。实际上,当用户被问及无服务器架构何时不足时,最常引用可移植性。

随着无服务器用户通过开发速度和扩展灵活性获得收益,正在牺牲可移植性和控制。

Jenkins与持续交付的诸多问题

如果您使用软件,您可能已经意识到软件交付的实践在今天远非完美。查看我们上个月关于自世纪之交以来软件开发演变的文章,原因有些。在那篇文章中,我们解释了导致我们进入当今软件世界的道路,以及为什么这个世界可能达不到我们的期望。

这篇文章是我们关于进入詹金斯后世界的系列文章的第二篇。在这里,我们更详细地看一下流行的工具和流程,包括但不限于Jenkins,它们阻碍了我们从软件的必杀技。

我们喜欢詹金斯!

需要明确的是,我们并未将Jenkins视为当今软件交付领域的唯一问题。我们实际上认为詹金斯是一个很棒的工具。但是,Jenkins和其他持续集成(CI)服务器并不总是正确使用。软件交付团队倾向于在如何部署Jenkins和类似工具时犯错误。结果,他们采用低效的做法,削弱了他们获得或保持敏捷性的能力,并失去了采用最新技术创新所需的灵活性。

詹金斯的问题

最终,这些问题的根源不是来自特定工具,而是来自文化错误。

问题1:詹金斯插件太多了

插件不一定是坏事。实际上,当它们被正确使用时(这意味着将功能扩展到软件平台所需的核心功能之外),它们就是很好的资源。它们为用户提供了为他们使用的工具添加额外功能的选择,而不需要他们在不希望使用这些功能的情况下将资源专用于这些功能。

但对于Jenkins而言,插件不提供对可选功能的访问,这些功能超出了使用该平台所需的核心功能。相反,Jenkins要求团队使用插件来实现在许多情况下非常基本的任务。

例如,如果你想为Docker环境构建 – 这是一个非常常见的用例 – 你需要一个插件如果你想从GitHub(另一个非常常见的任务)拉,那么你需要一个插件如果您需要PAM支持,则需要一个插件。

可以肯定的是,Jenkins的1,500个插件中的许多都提供了并非每个人都需要的功能。它通过插件提供完美的意义,例如,PagerDuty或Azure存储兼容性,因为许多用户可能不需要这些功能。

但是你需要在Jenkins中插件来做任何事情都是有问题的 – 而且这不仅仅是因为它意味着软件交付团队必须花时间安装和配置它们才能开始工作。这里更大的问题是Jenkins的大多数插件都是由第三方编写的,质量各异,可能会在没有通知的情况下失去支持。

构建基于第三方插件的软件交付链并不是确保可用性或稳定性的好方法。

问题2:Jenkins不是为Docker时代而设计的

虽然CI服务器通常是现代DevOps会话的一部分(并且确实是DevOps工程师的许多重要工具之一),但它们实际上是一种相对古老的技术,可以追溯到2000年代中期 – 早在任何人想象容器之前和微服务作为软件部署的首选基础设施。

因此,传统的CI服务器无法帮助团队充分利用Docker容器等下一代基础架构。他们通过多个插件很笨拙地与Docker集成。实际上,Jenkins 在其名称中使用Docker的插件不少于14个许多用于特定供应商的Docker相关平台,但其中六个用于核心Docker平台。

从许多方面来说,Jenkins与大多数其他CI服务器一样,是在裸机服务器和虚拟机时代构建的。事实上它支持Docker支持。在越来越多的Docker本地环境中,这不是CI服务器运行的好方法。

问题3:Jenkins不能很好地支持微服务

就像Jenkins和大多数其他CI服务器诞生于Docker之前的时代一样,它们也在微服务变得流行之前出现。

当然,有些人在2000年代使用面向服务的架构(SOA),同时Jenkins首次使用。自20世纪80年代以来,微内核等概念就已存在。但是直到Docker出现并使微服务易于实现,实际上已经部署了很少的微服务平台。

所以你可能不会期望Jenkins能够很好地支持微服务 – 事实上,它并没有。Jenkins缺乏对同时集成和测试多个服务的支持。这是微服务环境的基本功能。

除非您计划投资多个管道的开销(每个微服务一个),Jenkins在帮助您开发下一代微服务应用程序方面做得很差。

问题4:CI!= CD

Jenkins和CI服务器的最大问题很可能是软件交付团队有时会将持续集成与持续交付(CD)混为一谈。

事实上,CI和CD是不同的东西。CI是CD流程的一部分,但要实现完整的CD – 这应该是任何旨在优化其工作流程的软件交付团队的目标 – 您需要的不仅仅是CI服务器。

CD还需要将自动释放自动化到您正在使用的环境中,无论是什么。它需要可以自动执行不属于CI服务器范围的软件交付任务的工具,例如步骤CD需要通信工具和渠道,以使软件交付团队能够无缝协作。

当组织设置CI服务器并立即考虑他们的软件交付现代化工作完成时,他们犯了一个大错误。

改变詹金斯世界的文化

为什么熟练的软件工程团队会犯这样的错误?这并不是因为他们没有智能或无法跟上最新的创新。

相反,问题在于错误的尝试模仿最大,最有效的软件交付操作,如谷歌和Netflix。这些组织着名地利用开源工具链和大型基础架构,构建令人难以置信的敏捷软件交付管道。

是什么使这些公司能够构建这些管道不仅仅是他们部署的工具,还有他们的文化。仅使用与Google相同的工具,您无法像Google一样高效。

较小的组织并不总是意识到这一点。只有当他们拥有正确的文化理念和流程时,他们才能克服像Jenkins这样的工具的局限性,并优化他们的软件交付管道。

没有工具链是完美的,但是当您实施正确的文化时,您可以实现完美的软件交付(或至少接近它)。

如果您的软件交付方法仍然只围绕Jenkins构建,那么您无疑会错失更好的机会。实现这些机会需要文化变革。在本系列的下一篇文章中,我们将研究具有前瞻性思维的公司如何将新工具与新的软件交付文化相结合,以超越我们长期努力解决的以Jenkins为中心的世界的低效率。

https://thenewstack.io/many-problems-jenkins-continuous-delivery/

理解CI和CD之间的区别

有关持续集成(CI)和持续交付(CD)的信息很多。多篇博文试图用技术术语解释这些方法的作用以及它们如何帮助您的组织。不幸的是,在某些情况下,这两种方法通常都与特定工具甚至供应商相关联。公司自助餐厅的一个非常常见的对话可能是:

  1. 您是否在团队中使用持续集成?
  2. 是的,当然,我们使用X工具

让我告诉你一个小秘密持续集成和交付都是开发方法。它们与特定工具或供应商无关。即使有工具和解决方案可以帮助你们(比如Codefresh),实际上,公司可以使用bash脚本和Perl单行来实践CI / CD(不是很实用,但肯定是可行的)。

因此,我们不会使用工具和技术术语来解释CI / CD的常见陷阱,而是使用最重要的内容来解释CI / CD:人们!

关于人的故事 – 软件集成的黑暗时代

认识爱丽丝,鲍勃,查理,大卫和伊丽莎白。它们都适用于SoftwareCo Inc.构建SuperBigProject应用程序。Alice,Bob和Charlie是开发人员。大卫是一名测试工程师。伊丽莎白是该团队的项目经理。

开发应用程序的传统方法如下:

Alice,Bob和Charlie都在他们的工作站上处理三种不同的功能。每个开发人员以单独的方式编写和测试代码。他们使用长期运行的功能分支,在合并到生产环境之前存在数周甚至数月。

在某个时间点,伊丽莎白(PM)收集了整个团队,并宣布:“人们,我们需要创建一个版本。请实现它!“

此时,Alice,Bob和Charlie正在争先恐后地将所有三个功能集成到同一个分支中。这是一个非常紧张的时间,因为这些功能以前从未一起测试过。由于错误的假设或环境问题,许多错误和问题突然出现(请记住,到目前为止,所有功能都只是在每个工作站上进行测试,彼此隔离)。

一旦这个高压力期结束,合并后的结果将传递给David,后者将执行额外的手动和自动测试。这段时间也很耗时,因为他可以批准或阻止发布,具体取决于发现了多少关键错误。所有的目光都落在大卫的身上,因为他的测试可以揭示可能会延迟释放的严重问题。

最后,测试结束了,伊丽莎白高兴地宣布该版本已准备好打包并运送给客户。

那么人们如何在这个虚构(但非常现实)的故事中感受到这种感觉?

  1. Alice,Bob和Charlie(开发)不满意,因为他们总是在即将发布的版本之前了解集成问题。整合期间感觉就像是同时出现多个问题的消防。
  2. 大卫(测试)不高兴,因为他的工作确实是不平衡的。在等待开发人员完成功能工作的平静时期。然后是测试阶段,当他被工作淹没,必须处理意外的测试场景,每个人都在看他的肩膀。
  3. 伊丽莎白(管理层)也不高兴。整合阶段是项目的关键路径。这是一个紧张的时期,因为任何意外的问题都会推迟产品的交付。伊丽莎白一直梦想着软件发布没有任何意外,但实际上这种情况从未发生过。估计项目时间表中的整合阶段始终是一个猜谜游戏。

团队中的每个人都不高兴。(顺便说一句,如果您的公司仍在开发这样的软件,请尝试了解此开发工作流程会损害您团队的士气。)

这里的主要问题是每个产品发布时发生单一 “集成”阶段。这是工作流程的痛点,它可以防止团队发布无压力版本。

将“连续”添加到集成

现在我们已经看到了“集成”的含义,很容易理解“持续集成”的含义。正如谚语所说,“ 如果事情是痛苦的,那就更经常地做。”持续整合本质上是以高频率重复整合步骤以减轻其痛苦。经常这样做的最明显的方法是在每个功能合并之后进行集成(而不是在宣布正式发布之前等待)。

当团队实施持续集成时……

  1. 所有功能都直接合并到主分支(主线)。
  2. 开发人员并非孤立地工作。所有功能都是从主线开发的。
  3. 如果主线是健康的,则认为功能已完成,而如果主线在其自身的单独工作站上工作则不会。
  4. 测试在功能级别和主线级别自动进行。

这就是持续集成的要点!当然,还有更多的细节(实际上有关于这个主题整本书)但主要的一点是,不是只有一个紧张的集成期,一切都在同时合并和测试,“整合”一直在发生以连续的方式。

持续集成是开发软件的更好方法(与“普通”集成相比),因为它:

  1. 减少合并功能时出现的意外数量。
  2. 解决“我机器上的工作”问题。
  3. 将测试时段切换为多个时段,其中每个要素逐渐合并到主线中(而不是一次性合并)。

结果是,使用CI工作的团队不是通过过山车生活(平静的开发时期,然后是压力释放),而是通过逐步的方式更好地了解项目的完成程度。

使用CI进行工作是现代软件开发的支柱之一。该技术已被很好地记录并且在此时已知。如果您今天没有在您的软件项目中练习CI,那么您的组织没有任何借口。

软件交付的黑暗时代

现在我们已经看到了“集成”的历史以及持续集成的工作原理,我们可以通过持续交付将其提升到新的水平。

如果我们回到原始故事,我们可以看到与发布方式类似的模式:

执行发布本质上是一个“大爆炸”事件。在认为软件被测试之后,有人负责打包和部署过程。将软件部署到生产也是一个非常紧张的时期,传统上涉及许多手动步骤(和检查表)。部署很少发生(有些公司每六个月部署到今天一次)。在极端情况下,部署发生在ONCE(瀑布式设计方法)。

仅在最终截止日期到来时提供软件会带来与不频繁集成相同的挑战:

  1. 通常发现生产环境与最后一分钟需要额外配置的测试环境不同。
  2. 在测试环境中正常工作的功能在生产中被破坏。
  3. 在发布时尚未准备好的功能根本不会提供给客户,或者他们甚至会进一步推迟发布日期。
  4. 发布会在开发人员(想要发布新功能)和操作(他们想要稳定性并且不希望一次部署太多新功能)之间产生紧张关系。

你应该能够在这里看到模式。如果我们通过更频繁地减轻“整合”阶段的痛苦,我们也可以为“交付”阶段做同样的事情。

将“连续”添加到交货

持续交付是指尽可能频繁地打包和准备软件(就像它被发送到生产中一样)的做法。最极端的交付方式是在每个功能合并之后。

因此,CD使CI更进了一步。将每个功能合并到主线分支后,不仅会对应用程序进行正确性测试,还会将其打包并部署到测试环境中(理想情况下与生产相匹配)。所有这些都以完全自动化的方式发生。请注意上图中缺少粘贴图(表示手动步骤)。

另请注意,每个新功能都是推动生产的潜在候选者。并非所有候选人实际上都被发送到生产。根据组织的不同,部署到生产的决策需要人为干预。人类只决定释放是否正在生产(但不准备释放本身)。该版本已在测试环境中打包,测试和部署。

持续交付比持续集成更难采用。这样做的原因是,由于每个候选版本都可能达到生产,因此整个生命周期需要自动化:

  1. 构建应该是可重复的和确定的。
  2. 所有发布步骤都应该是自动化的(这比听起来更难)。
  3. 所有配置和相关文件都应存在于源代码管理中(不仅仅是源代码)。
  4. 应在其自己的测试环境中测试每个功能/发行版(理想情况下以动态方式创建和销毁)。
  5. 所有测试套件都应该是自动化的并且相对较快(也比听起来更难)。

虽然云无疑可以满足所有这些要求,但软件团队(开发人员和运营人员)需要一定程度的纪律才能真正实现持续交付。

一旦CD到位,释放变得微不足道,因为只需按一下按钮即可执行。每个人(不仅仅是项目经理)都能看到当前的候选版本。当前版本候选版本可能没有所有请求的功能,或者它可能尚未满足所有要求,但就发布过程而言,这并不重要。重要的是,该版本经过全面测试和打包,随时可以发送到生产(如果需要)。任何项目利益相关者都应该能够开绿灯,并立即将产品发布到生产中。

如果您使用的是CD,则软件生命周期可以总结如下:

每个候选发布者总是提前准备好。人类决定是否也会将候选版本推向生产阶段。如果需要在将来召回,那么未达到生产的候选版本仍会存储为工件。

与持续集成一样,如果您想了解所有细节,还有一本关于持续交付的书籍

奖金:持续部署

CD中的“D”也可以表示部署。这种开发方法建立在持续交付的基础之上,基本上完全消除了所 任何被发现准备好(并通过所有质量和测试门)的候选版本都会立即投入生产。

不可否认,只有极少数公司能够像这样工作。在没有人的情况下直接投入生产不应该掉以轻心,在撰写本文时,许多公司甚至都没有实施持续交付,更不用说部署了。现在应该清楚的是,每种开发方法都需要先前的基础。

在升级之前,您的组织应确保每个基础都非常扎实。在Codefresh,我们看到许多公司试图通过试图在他们的CI / CD管道中窃取他们现有的做法(针对数据中心进行优化)而试图进入云时代,却没有真正理解其中一些做法现在已经过时了。尝试采用持续部署而不首先完全接受持续交付是一场失败的战斗。

查看这些方法涵盖的内容以及CD如何要求CI的另一种方法是下图:

确保以正确的顺序处理每个开发范例。定位持续交付是一个更加现实的目标,也是工具选择丰富的目标

https://thenewstack.io/understanding-the-difference-between-ci-and-cd/

可以节约CDN带宽流量的流媒体P2P(Flash/Android/IOS)

很多朋友关心SRS是否有计划支持RTMFP,是否计划支持P2P,这篇文章详细介绍了SRS和P2P的关系。

Summary

我们所指的P2P,并非传统客户端P2P的方式,譬如ed2k那种协议。我们特指三种P2P:

  1. FlashP2P:Adobe开发的P2P,Flash播放器之间可以互相P2P,分享视频。

  2. AndroidP2P:特指Android的App的P2P方式,Android上HTML5不可能做P2P。

  3. IOSP2P:特指IOS的App的P2P方式,IOS上HTML5不可能做P2P。

这三种P2P都有几个共同点:

  1. 只讨论流媒体范畴的P2P,普通文件和数据的P2P不考虑。

  2. 流媒体传输使用通用协议,譬如flv、mp4或hls,配合CDN完成P2P原始资源的传输,而并非所有的数据都是P2P网络用私有协议传输。

  3. 尽量避免安装额外插件。譬如FlashP2P就在flash播放器上跑(别纠结flash本身就是个插件),只需要集成AS的SDK,不需要额外安装ActiveX浏览器插件。而Android和IOS的P2P,需要集成P2P系统的SDK,只需要安装商家的App,而不需要再安装专门用来做P2P的App。

综上所述,我们可以将Flash/Android/IOS
P2P,简称为P2P。下面讲P2P一种可能的结构,以及SRS和P2P的关系。

Structure

一个P2P系统,可以包含下面几个结构:

  1. 客户端SDK:P2P系统必须提供客户端SDK,集成在播放器或者App中。譬如FlashP2P提供的是AS的库,Android提供的是java的库,IOS提供oc的库。

  2. API调度集群:P2P系统必须支持API调度,弥补DNS的不足,以及提供P2P系统需要的额外数据。API调度就是SDK交互的第一个后端,完成认证、其他服务器资源的分配、流信息、实时调度。

  3. RTMFP集群:或者称为基础协议集群,由API调度返回给SDK可用的服务器,客户端使用RTMFP服务器完成NAT打洞,以及必要的数据传输。

  4. Tracker集群:或者称为伙伴发现协议集群,由API调度返回给SDK可用的服务器,客户端向Tracker请求可用的伙伴节点。

  5. Pingback集群:或者称为实时数据集群,由API调度返回给SDK可用的服务器,并提供给API调度集群调度的实时数据依据,SDK向Pingback集群汇报实时数据。

  6. 流媒体源站集群:或者称为流媒体源,主要负责流媒体数据的生成,和CDN对接,由API调度返回给SDK可用的CDN边缘地址。

可以在SRS基础上完成的结构是:流媒体源站集群、RTMFP集群。其他大多是HTTP协议,主要是P2P系统内部的算法和逻辑处理,适合使用Python或者GO实现。

另外,Pingback集群需要提供10秒级别的系统数据,使用GO或者Spark都可以,数据量小时用GO实现也可以,数据量很大时可以用Spark。

下面详细分析SRS在WebP2P中的位置和状态。

SRS for P2P

回过头来说,SRS现在已经支持P2P中的流媒体源站集群和RTMFP集群了吗?SRS支持了流媒体源站集群,但是RTMFP集群不支持。

所谓SRS支持了流媒体源站集群,指的是SRS能输出一种HLS,能符合一种P2P系统的要求。这种P2P系统就是观止创想的P2P系统,具体参考BravoP2P。也就是说,若使用SRS作为您的流媒体服务器,是可以直接对接到观止的P2P系统的,可以给现有的HLS流加上P2P功能。

SRS为何不支持RTMFP集群呢,有几个原因:

  1. RTMFP目前不开源。

  2. RTMFP和SRS的差异太大,就算支持了RTMFP集群,还只是P2P系统的六分之一,没法用起来。

  3. SRS的目标是提供通用方案,SRS3的Dragon技术,SRS4对接Spark,目前还没有支持P2P系统的计划,P2P系统里面很多是私有方案。

因此,在现在的路线图,例如SRS3(预计2016年发布)和SRS4(预计2017年发布)的路线图中,都没有RTMFP的影子。

也就是说,在P2P系统中,SRS只计划支持流媒体源站功能。下面分开看看各种P2P系统。

FlashP2P

FlashP2P是由Adobe研发的P2P协议,包括握手、NAT打洞、数据传输,Adobe收购了一家做P2P的公司,将这个RTMFP协议集成到了Flash中。

FlashP2P在PC上的很成熟了,稳定性也可以达到商用的要求。从2013年开始,支持FlashP2P的公司也开始粗现,现在除了我们观止创想,还有云某动、快播解散后的一个团队等等。

AndroidP2P

Android手机、盒子和Pad上面支持P2P,这个目前还在发展中。

IOSP2P

IOS手机和Pad上面支持P2P,这个难度比AndroidP2P还大,目前没有消息。

Challenge

上面讲了各种P2P的情况,P2P的挑战有以下几点:

  1. 转换思维对接CDN:CDN最惧怕的就是P2P公司,不是要分他流量那么简单,而是对接起来灰常痛苦。据说有的FlashP2P系统,得在CDN每个边缘节点部署服务器,因为流媒体切片不通用,这不是要CDN的命么?因此首先最大的挑战就是转换为互联网思维,尽量使用通用方案,让CDN爽了P2P系统才能爽。

  2. 保证流畅度:传统P2P可以暂停缓冲个几个小时,而WebP2P直播正在进行时,缓冲个几次用户就刷新页面,这个P2P节点就相当于牺牲了。因此保证流畅度才能保证分享率,如何保证流畅度呢,这个就各显神通了。

  3. 实时调度:P2P的变化非常快,有的用户刷新页面啦,有的系统拖动啦,有的还暂停,有的就喜欢乱点。因此整个P2P的节点信息都是变化很快的,这对实时分析系统有非常大的挑战。

  4. 负载均衡和热备:P2P的集群也需要负载均衡,譬如RTMFP协议就支持Redirect方式,可以实现负载均衡和热备。传统P2P系统挂掉后节点就没法看视频,而一个P2P系统挂掉后依然能看,因为有CDN在那里呢,但是带宽就开始飙升了。而P2P系统的恢复需要较长时间,因此必须使用热备,在出现问题时切换到正常的系统。

这些挑战都是我们曾经遇到的,还包括没有遇到的。