网络应用程序的通信视角
Posted 半吊子全栈工匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络应用程序的通信视角相关的知识,希望对你有一定的参考价值。
现代的应用程序不再局限于单个系统空间,而是分布在许多系统空间中,这种应用程序正在从单系统、基于主机的系统向分布式多系统解决方案转变。如果将它定义为网络应用程序,那么当前基于计算的编程模型或许是不正确的,网络应用程序应该以通信或交互为前提。
这是一个网络时代,或许需要新的软件方法来满足这个数字时代对多系统空间的需求。
什么是网络应用程序?
应用程序有独立和联网这两种基本类型,例如电脑上的文字处理软件,大型机上的多用户编程,或者使用SOAP以及ORB的应用都是独立的。独立应用程序拥有一个入口点,也就是说,调用程序将控制权交给应用程序,并在应用程序完成后收回控制权。应用程序通过执行与主进程并行运行的 i/o 例程来访问环境中的数据。独立应用程序运行在虚拟机或物理机上。
程序员不仅要将应用视为一个层次化的程序,而且要将其视为由不同的人通过设备进行的网络交互。与独立的应用程序不同,当不同的代理通过它们的操作相互交互时,网络应用程序就会完成操作。这些操作接受来自网络上代理进行状态更改,还会影响网络上其他代理的状态更改。基于网络的应用程序运行在网络基础设施之上。
网络应用并非只是计算
数字时代需要人和设备齐心协力来创造整体的商业体验,位于不同系统空间的所有计算代理可能会相互通信。简单地说,他们应该互相询问并告诉对方来创建整个的解决方案。这种数字时代的事件编排同时发生,因此,是一个同时存在的问题。
编程由由顺序运算符(如 Java)或赋值运算符分隔的语句组成。这些操作符将表达式的值赋值到内存位置,并指示编译器移动到下一条指令。语言的这两个基本结构使得编程相对有序。在有顺序约束的并发环境中编程,给程序员带来了较大的挑战。
一般来说,有两个主要部分保证程序的工作。一个是程序的控制,另一个是当控制移动时传输的数据。控件是程序运行的光标,在顺序编程中,控件从上到下移动。改变程序控制的唯一方法是使用if语句、异常语句和迭代/循环语句以及令人恐惧的goto语句。编程包括准备数据以便处理器处理信息。软件的创新部分是通过对程序控制建立起来的。
在顺序程序中,假定程序控制向前移动。该语言本身不具备处理跨系统空间处理的任何设施。如果部分执行位于另一个系统空间中,那么控制问题如何处理?语言如何有足够的概念来处理多系统空间计算的不同问题,例如:
(a). 传输控制;
(b). 处理延迟;
(c). 处理异常?
一段代码如何告诉位于不同系统空间中的另一段代码已经成功地继续运行或抛出异常呢?
数字时代的解决方案必须协调人和设备作为对等协作系统。从顺序的程序中创建这样的协作系统是一个巨大的挑战。有没有更好的方法,使这些并发系统可以更直接地表达,使数字解决方案更容易呢?为此,需要消除程序的基本默认顺序控制。默认的顺序控制使得表达并发问题更加困难,而程序员必须操作顺序控制来创建并发。
最大的问题之一是跨系统空间共享状态。在当前的编程范式中,状态是通过函数和变量来检查的。这些只能在语言的限制范围内使用,不能在操作语言之外使用。在某些情况下,应用程序知道数据的位置,但不确定所有数据何时到达。这使得当前程序的确定性本质不适用。数字时代数据的这种不确定性导致了许多程序设计无法解决数字时代的问题。虽然基础编程并没有处理不确定性系统的方法,但是现在通过遵循一个叫做响应式编程的范式来实现。
一旦程序的状态和控制被共享,是否有可能确保只有经过授权的人才能访问这两个关键元素呢?当前的编程语言没有信息隐藏的概念。理想情况下,编程语言应该具有共享状态的功能,并有选择地提供对状态的受控访问。一个可以跨系统空间工作的网络应用程序需要一种新的方法来看待计算问题。与其把计算思想(过程、函数等)作为基础,不如把通信作为网络应用编程范式的基础。
计算中的通信视角
考虑两个算术表达式: y = x + a 和 a = b + c。由于现在使用的顺序程序,这些程序按顺序编写为{ a = b + c; y = x + a }。程序按顺序运行以得到答案。如果它们被意外地写成{ y = x + a; a = b + c } ,程序将继续运行,但是答案将是错误的(可能是一个 bug)。有办法消除这种异常吗?
在同样的计算中,当 a 是共享的时候,表达式并发运行并组合,也就是说,组合由两个代理组成,a = b + c 和 y = x + a,并发运行。算术表达式的右边是值的接收器,表达式的左边是信息源。在 a = b + c 的情况下,b 和 c 是输入值,a 是信息源。同时,y = x + a 正在等待 x 和 a。假设 x 已经到达,当第一次计算引起 a 时,第二次计算会自动使用它来引出答案 y。
整个计算是并行运行的,并根据值的到达情况自行驱动。计算不再是关于算法,而是关于两个计算代理之间的通信值。数据流是通过命名这两个变量来完成的。因此,要将 y 传递给另一个代理,所需要做的就是将 代理组合 与消耗 y 的算术代理结合起来。显然, 计算可以用通信来表达。
网络应用的通信视角
与独立应用不同,网络应用没有单个机器的视图。网络应用是由许多机器组成的集群,并发运行。这些代理在单一或多个系统空间,协调工作,以创造新的经验。每个代理可以在一个实例中充当客户机,在另一个实例中充当服务器。
应用控制
应用程序的控制是应用程序的控件设置了程序的运行节奏。一旦程序从操作系统(通过 c 中的 main ()函数)或从 Web 服务器获得控制,程序员就通过所使用语言提供的不同控制语句来管理程序控制。程序完成后,控制权交给操作系统或服务调用者。
一旦 c 语言的独立应用程序接受了控制,程序就会通过运行函数来执行输入/输出,从而与外部世界进行交互。在 i/o 语句期间,程序被阻塞。这正在成为一个多系统的边界,状态可以被另一个实体观察到。程序及其语言应该具有符号和概念,以便在运行时动态地共享数据,而不需要额外的工程。
一个独立的应用程序控件有两个元素: 控件的前进和返回移动,以及在这些移动过程中的数据传输。在当前的编程模型中,由于处理器的状态机(使用当前的程序计数器)的限制,控制和数据的前进和返回移动是同步的(即调用方中断,直到调用控制返回给调用方)。将应用程序控制从计算移动到通信,使应用程序能够一致地跨多个系统空间工作。
延迟
简单地,对于c 语言的那个程序,现在通过将它从一个计算的前提移动到一个通信的前提,就可以将它表示为一个网络应用程序。同步点如 main、 print 等协调这些代理创建一个连贯的整体。这些协调元素可以位于单个系统空间中,也可以跨越多个系统空间。如果这些同步点跨越系统空间,那么这就引入了一个新的约束: 网络的延迟。
这样就可以确定整个应用程序的速度。在一个典型的网络应用程序中,当应用程序不使用网络时,延迟会降低。通过引入缓存,减少了网络使用,从而提高了整个应用程序的速度。
范围界定
信息隐藏是计算机系统的一个重要特性。编程语言应该很好地支持这一点。举例来说,面向对象程序设计可以让程序员定义信息的可见性,要么是私有的或者保护的,要么是公共的。私有时,信息只对对象可见。如果变量被声明为公共的,那么信息对整个程序是可见的。这些声明是编译器控制信息可见性的指令。运行时信息可见性必须由程序员在设计和构造期间完成。对于独立应用程序来说,将这些类型的信息隐藏在内存中是很好的,但是对于网络应用程序来说,该语言也应该支持跨网络的作用域。这是如何实现的呢?
在网络应用程序中,状态转换作为同步点公开。此外,信息通过同步点传输。客户端可以通过与这些同步点进行交互来影响应用程序。此原理用于控制网络上的信息可见性。范围是通过隐藏动作、,然后有选择地给不同的代理同步名称控制。这些客户端和服务器可以存在于许多系统空间中,从而在网络上创建受控的信息安全。
网络应用程序带来了新的挑战,如多系统空间、延迟、间歇性网络可用性和安全性,可以将应用程序视为通信而非功能来克服这些挑战。
面向通信的hello world
网络应用在基于通信的情况下进行处理。与网络应用程序中的功能性计算模型(具有将数据从一个变量移动到另一个变量的功能)不同,数据的移动是通过通信完成的。在物理学中,电流的流动是由电势来定义的。类似地,网络应用程序是通过设置通信潜力来定义的,然后将它们连接在一起来实现创新,以确保信息从源到接收器的流动。
Hello,World 网络应用程序有两个代理,它们同时运行以交付功能。MainAgent 由两个动作组成的序列。当这个代理被激活时,它同时激活 main 和 nPrint:
MainAgent = Compose [
Sequence [ Ask(main);
Tell(print)];
Sequence [
Ask(nPrint);
Tell(rtnMain)
]
]
第二个代理是 PrintAgent:
PrintAgent = Sequence [
Ask(print);
Tell(rtnPrint)
]
Hello,World 应用程序由这两个并发操作的代理组成:HelloWorldApplication =Compose [ MainAgent; PrintAgent ]
这些操作被表示为URI ,因此它们可以通过网络进行交互。网络编程非常简单,只需将代理程序加入到配置中,目的是加速这些交互。
小结
设备的微型化和设备在高速无线网络上多产的互连性正在彻底改变商业的运作方式,这些变化将深刻地改变企业的经营方式。软件是这个数字世界的核心,但是软件工具集和编程范式是为基于主机的时代设计的。软件实践的问题(例如高缺陷、低生产力、信息脆弱性和低成功率)将会在通信视角中变得更加深刻。
【关联阅读】
以上是关于网络应用程序的通信视角的主要内容,如果未能解决你的问题,请参考以下文章
从dubbo处理视角看Netty处理网络传输原理 -- 粘包与拆包