一直对微软技术栈不是很熟也不很感冒–所以这篇文章很可能不算客观–但是工作必须要用,所以也不得不做了更多的了解。在用Logic App的过程中我发现了一个现象,那就是搜索关于Logic App具体问题的时候,总是只出现“怎么用”,从来没有看到“应不应该用”或者“什么场景下用”的讨论。即使我在谷歌搜索里删除了所有来自微软官网的结果(by -site:microsoft.com
),也没有发现什么有意义的综述,所有的布道者都在教你如何用,而没有(或者不愿意)认识到让使用者了解某工具在架构中的定位才是选择学不学习怎么用的先决条件。
可能大家也已经从我上面的语气里听出来了,所以不妨先把结论放在前面,以防没空看论据(其实是论据本身也不充分)。结论就是: 如果你是在乎软件工程师体验的架构师或者你就是软件工程师,同时你做的项目是用一定复杂度需要多人协作,预计运行超过3个月的非原型项目,而不是那种给客户/领导汇报完就可以拿钱走人的项目,不要用Logic Apps,如果非要用,不要过度使用, 否则你的工程师可能会离职,项目可维护性会变得很差。
下面开始具体聊聊。azure 自己给logic apps的定义是: 是一个基于云的平台,用于创建和运行集成应用、数据、服务和系统的自动化工作流。 借助此平台,可以快速为企业和企业到企业 (B2B) 方案开发高度可缩放的集成解决方案。 它的特点是:
- 很多内建的connector,可以很方便的与其他azure或者非azure资源进行集成
- 有图形化的配置界面,理论上不需要写代码就可以完成集成
先说Connector,这可能是很多使用Logic App的唯一理由了,因为访问没有管理权的资源安全性的考量常常是企业系统集成最头疼的问题,而Logic Apps提供了很多内建的connector,譬如访问CRM,或者service bus/event grid等等,几乎是配置一下就可以直接用数据了,省掉了很多安全认证等麻烦的部分。而图形化页面也是一大亮点,平时我们做软件是先画设计图再写代码,把代码跑起来了再做PPT汇报,这个Logic Apps可不一样里,基本上POC和最终运行的项目以及拿去给领导展示的图几乎都可以用同一个图形设计界面搞定。乍看上去很不错,然而用起来全是坑。
Connector在省了很多初期的对接讨论的同时,基本上也把软件方案和能力限定死了,比如日志的集成,API并发调用和重试逻辑,或者希望方案能部分重用于集成其他项目等等都被束缚。
Logic Apps不像普通代码项目扩展性很强,譬如部署在azure上的不同语言的不同程序都可以把日志写到Papertrail里统一查看,设置警报等,Logic Apps的metrics和日志都只能在LogicApp里面查看。因为Trigger/Connector的定义掌握在对接方手里,一旦初期决定用Logic Apps, 后续遇到的任何问题都只能靠把Logic APP逻辑写得更复杂来弥补Connector本身的缺陷。
但是Logic Apps一旦复杂问题就更大。
首先它无法被Code Review, 即使你的Logic Apps 不是直接在UI上定义,而是作为ARM template放在项目代码里,这个template也是完全没法review的。
也因为同样的原因,它没有办法本地开发,如果因为某些原因你的网速比较慢或者鼠标右键不灵,开发体验可以说差到极致(但是你的老板却会因为“它的UI看上去那么简单直观”而无法理解你的开发效率为什么会低)。
而线上的开发环境本身和生产环境有差异造成的其他问题就更难排查,譬如因为Connector无法被Mock, 很难在测试环境有效地进行压力测试。
除了开发效率低,它本身的运行效率也很低,普通的API call如果超过1秒钟,工程师可以排查原因作出改进,Logic Apps不行,只能接受。
所以,和很多不告诉程序员如何转变方法(观念)去解决(适应)上述类似问题的serverless平台一样,Logic Apps是一个看上去很美,写起来很烦的,“面向架构师和领导”的方案。任何靠谱的架构师都应该知道如果说它确实有一点用户,那也应该仅限制在用Connector获取数据,获取之后立刻转到其他app/service进行处理,而不是Logic Apps内写数据处理逻辑。任何在超过5个步骤的Logic App集成方案都应该加入其他方案而使Logic Apps的worflow步骤少于5。 在包含Logic Apps的技术方案确定之前,问一下拍板的人:
- 如何做Code Review
- 如何和现有的监控以及日志等运维报警工具结合
- 如果性能跟不上怎么办
- 如何保证复杂度可控
如果答案是非用Logic App不可,因为虽然上面这些很成问题,但是某资源非用Logic App Connector访问不可,那也可以追问一句,如果某待集成的资源只能用Connector访问,是不是说明资源方本身对于集成这件事还没有ready.
Good Luck.