本系列文章分为三个部分,咱们将回顾过去的三年,总结Marathon稳定性方面的经验,与你们分享。在第一部分中,咱们已经介绍了适用于许多不一样类型的工做和团队的文化。本文将介绍帮助咱们实现稳定Marathon的软件工程最佳实践。git
活动预告github
若是您是Kubernetes用户,欢迎参加下周四下午2:00的D2iQ K8s Workshop【后云原生时代的多Kubernetes集群运维管理探讨】。您将收获对Kubernetes多集群、多租户和多个基础设施提供商的集中洞察和治理思路。扫描文末二维码马上报名。web

第二部分:代码文化与设计微信
静态类型和Non-Blocking调用网络
Marathon是用Scala编写的,且大量使用了Akka Actor和Stream。Scala的类型系统和不可变的数据结构使咱们运行单元测试以前就避免了不少bug,这一点再也不赘述。数据结构
Akka容许咱们异步封装状态和处理请求。虽然这下降了Marathon的资源消耗并加快了速度,但也带来了成本。异步代码很难调试,提升了技术门槛。书面上已经很复杂的业务逻辑,在代码中变得更加难以推理。首先,咱们解决了blocking calls的问题。这种作法会带来副作用。咱们会看到线程不足和随机超时。删除blocking calls带来了不少不可靠的测试,由于有些代码实际上依赖于其它代码进行block——我将在下一篇系列文章深刻讨论这个话题。app
咱们决定删除几乎全部的blocking代码,并用async/await blocks替换它。Async和await是神奇的语法糖,使咱们既可以按顺序遵循逻辑,又能够异步执行。运维
接下来,咱们把Marathon的内部结构作成了声明式的。过去,Marathon仅依靠Mesos任务来启动和响应Mesos事件。这很难调试,由于人们没法跟踪为何某个数字会增长或减小。所以,咱们使用Marathon想要实现的声明性状态替换了 “计数”。Mesos事件会触发观察状态的更新。经过比较观察到的状态与声明状态,Marathon会自动作出决定。如今,当咱们调试Marathon时,咱们能够查看观察到的和声明的状态,并确认更新是否错误或基于这两个状态的决定是否错误。异步
崩溃模式async
尽管这个概念很吓人,咱们仍是决定采用“崩溃模式”的思惟方式。每当Marathon达到非法状态或观察到链接失败等问题时,它就会崩溃。此行为会带来一些后果。一方面,不该该有数据丢失。幸运的是,在对其进行处理以前,Marathon会将每一个请求保存在ZooKeeper中。所以,崩溃后的恢复仅意味着加载全部数据,调解并继续工做。另外一方面,使整个服务崩溃也意味着将任何故障恢复都推后到Marathon重启。只有一个地方能处理恢复(注3)。
“崩溃的Marathon”也能让用户当即发现问题的出现,而不是几小时甚至几天以后才发现。自从咱们采起这种行为以来,咱们已经收到很多客户报告Marathon处于“崩溃循环”的事件。虽然这很“烦人”,但它不只在早期就提出了问题,并且还令人很容易看到恢复是否有效。一旦Marathon再也不崩溃,问题就解决了。
咱们宁愿致力于状态恢复,而不是优雅删除。咱们宁愿崩溃和从新启动,而不是执行许多复杂的错误恢复处理程序。
崩溃反馈机制
使Marathon崩溃不过是咱们的设计原则之一。另外一个则是“崩溃反馈机制”。单一的崩溃模式会致使低能化,只要让他崩溃就好了。这在一开始每每会带来副作用,由于用户对此并不指望,并且他们经常没法从中得到太多的好处。这时“崩溃反馈机制”就开始发挥做用了——明确为何会发生崩溃,并向用户提供尽量多的信息。咱们从简单的退出代码开始,这些会指向不一样的Mesos、Zookeeper或网络问题。这一机制将不断积累试错经验,使调试变得简单得多。
几天后即将发布:文章的第三部分,内容是关于咱们的测试Pipeline的。欢迎持续关注!
注3:一个很是好的用例——PR 6905
https://github.com/mesosphere/marathon/pull/6905.
欢迎点击【阅读原文】,获取D2iQ DC/OS解决方案详情,或联系D2iQ销售团队了解更多: sales@d2iq.com
W E B I N A R
内容大纲
如何实现Kubernetes快速部署、扩容、升级、备份等底层运维操做;
如何进行统一的权限管理;
如何从实际的项目层面进行统一的运维管理,包括多集群资源分配;
如何管理应用商店;
如何进行统一的中央监控。

扫二维码|马上报名
往期精彩文章
关于D2iQ

点击“阅读原文”,获取Mesosphere DC/OS解决方案详情
本文分享自微信公众号 - D2iQ(d2iq_apac)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。