RVD 是在为用户提供尽可能多的灵活性和在遵循迭代方法的同时花费尽可能少的开发工作之间进行斗争的结果。它以小步骤发展,以便始终具有功能进步的应用程序。为了满足这些要求,我们做出了一个非常关键的设计决策:将核心部分(控制器)保留为一个虚拟引擎,该引擎仅生成 RCML 并将所有逻辑委托给其他地方,可通过 HTTP 轻松访问。
话虽如此,@scottbarstow,我欢迎你的 cmets。拥有自包含应用程序大大简化了应用程序的设置和维护,尤其是现在 RAS 正在兴起。 ES 应该是一种与真正外部目标对话的工具,而不是一种将各种复杂操作委托给 RVD 之外的方式。
但是,“逻辑”的成本很高。引入用于分支、比较、字符串操作等的几个元素需要大量的设计思考、实现时间和调试问题。
我建议的替代方法如下:
-
改进 ES 与外部端点对话的方式。添加完全支持
提交 POST/JSON 有效负载。可以选择
application/json 和 url 编码的表单内容类型。处理
公共服务提供商通常需要的其他一切
像松弛。所有处理都将在 ES 中完成。进一步的反馈
在这里将不胜感激。
-
将所有逻辑保存在一个地方,而不是将其分散到各处
几个新元素。引入某种类型的“脚本”元素
脚本引擎将用于执行代码块
实现所有必需的逻辑。让这个元素与外界对话
通过带有“INs”和“OUTs”的简单的基于字符串的合约。
已经有一个使用 Groovy 的实验性实现
服务器端 Javascript 也可以这样做。
但是,等一下。 RVD 应该是普通用户的简单工具,而不是开发人员!
嗯,确实。但考虑替代方案。是否会更容易理解和使用一些新的智能元素以及随之而来的所有附加语法含义?我想除非它非常基本。更不用说调试和支持了。
Javascript 具有众所周知的语法,并且更容易调试。它甚至可以在打开客户端测试窗口的浏览器中运行。
- 引入一个非常基本的分支/GOTO 元素。它将能够中断模块执行并重定向到另一个模块。的逻辑
然而,分支将在之前的 Script 元素中实现。
技术缺陷和“为什么逻辑应该保存在一个单一的黑盒位置”
RVD 有状态。除了需要保留的由 Restcomm 提供的变量之外,它还创建了一些变量(收集、ES 元素创建此类)。由于应用程序流程是作为一系列 restcomm 发起的操作请求进行的,这些请求本质上是无状态的,因此有两种选择。
(a) 在操作 URL 中回收这些变量或
(b) 将它们存储在 RVD 中的类似会话的结构中,并保留一个被传输的会话 ID。
RVD 使用 (a)。
这意味着无论何时将控制权传递回 restcomm(例如执行 Gather/Collect 元素时),所有这些状态都需要在响应中包含的操作 URL 中进行编码。这样,当 restcomm 发出下一个请求时,RVD 将具有该状态。它与没有 HTTP 会话的老式 Web 开发模式大致相同。
此状态需要小,以免有大量数据在 RVD 和 Restcomm 之间来回传输。
RVD 应用程序由包含按顺序处理的元素的模块组成,任何元素都可能破坏 RVD 中的应用程序执行并将控制权返回给 restcomm。使元素独立是有意义的,以便可以选择中断应用程序执行并将控制权返回给 Restcomm。
我的观点是,我们需要保持元素独立,元素和 RVD 执行上下文之间的接口简单,状态易于序列化。而像 Script 元素这样的方块盒似乎符合这个目标。