消息传递协议
对于分散的机器来说,一台机器与另一台机器对话的唯一方式是通过网络传递消息。我们在TSL基础中引入了协议的概念。三种协议构成额GE上各种分布是计算范式的基础。
消息处理流程:
GE采用请求和响应通信范式。扮演服务请求角色的程序成为服务器。响应的,向服务器发送请求的程序成为客户机。我们使用服务器或客户机来表示程序锁扮演的角色。一个程序可以同时充当服务器和客户端。
请求/响应消息格式的规范和服务器端消息处理逻辑一起成为GE协议。协议的请求和响应类似于本地函数调用的参数和返回值,但请求处理逻辑是在服务器端执行的。请求/响应可以是TSL中制定的用户定义数据结构,也可以是GE协议中的void
// A local function definition
Response func(Request myReq)
{
// Request handling logic
}
GE支持三种类型的协议: 协议、异步协议和HTTP协议。
同步协议:
同步协议类似于普通的同步函数调用,只是调用时跨机器边界进行的。它通常用于在服务器端执行同步函数,并等待服务器端以阻塞的方式响应,如下面的时间序列图所示。
下面是一些同步协议示例:
struct MyRequest
{
string Value;
}
struct MyResponse
{
int32 Result;
}
protocol mySynProtocol1
{
Type: Syn;
Request: MyRequest;
Response: MyRespone;
}
protocol mySynProtocol2
{
Type: Syn;
Request: void;
Response: void;
}
protocol mySynProtocol3
{
Type: Syn;
Request: MyRequest;
Response: void;
}
protocol mySynProtocol4
{
Type: Syn;
Request: void;
Response: MyResponse;
}
协议的请求和响应可能无效,如mySynProtocol2、 mySynProtocol3、 mySynProtocol4所示。
异步协议:
对于异步协议,服务器在收到消息后立即向客户机返回确认。然后从线程池中选择一个线程来处理接收到的消息,如下图的序列图所示。
这有一些例子:
struct MyRequest
{
string Value;
}
protocol myAsynProtocol1
{
Type: Asyn;
Request: MyRequest;
Response: void;
}
protocol myAsynProtocol2
{
Type: Asyn;
Request: void;
Response: void;
}
异步协议不能向客户机返回任何用户定义的数据,因为服务器在发送回确认之前不会等待处理程序的完成。因此,异步协议的响应必须为空,而请求可以是用户定义的消息或空。从客户机的角度来看,异步调用返回的事实只意味着远程对等点成功接收了消息。
HTTP协议:
HTTP协议是同步远程过程调用。他是同步协议的RESTful版本。他的时间序列图于同步协议几乎相同,只是请求和响应是Json结构。
这有一些HTTP API例子:
struct MyRequest
{
string Value;
}
struct MyResponse
{
int32 Result;
}
protocol myHttpProtocol1
{
Type: Http;
Request: MyRequest;
Response: MyRespone;
}
protocol myHttpProtocol2
{
Type: Http;
Request: void;
Response: void;
}
protocol myHttpProtocol3
{
Type: Http;
Request: MyRequest;
Response: void;
}
protocol myHttpProtocol4
{
Type: Http;
Request: void;
Response: MyResponse;
}
与同步协议一样,请求和响应可以是空的或用户定义的数据结构。GE将为每个Http协议启动一个RESTful Http API端点。
http://example.com/myHttpProtocol1/
http://example.com/myHttpProtocol2/
http://example.com/myHttpProtocol3/
http://example.com/myHttpProtocol4/
HTTP协议应该用于提供RESTful服务端点。他们不用于服务器间通信。每当我们需要在服务器之间进行消息传递是,我们都应该使用同步或异步GE协议:在这方面,他们比基于rest的同类协议要高效得多。