2.2 接口和数据存储分离的架构

接口服务层提供了对外的REST接口,而数据服务层则提供数据的存储功能。接口服务处理客户端的请求,然后向数据服务存取对象,数据服务处理来自接口服务的请求并在本地磁盘上存取对象。

接口服务层提供了对外的REST接口,而数据服务层则提供数据的存储功能。接口服务处理客户端的请求,然后向数据服务存取对象,数据服务处理来自接口服务的请求并在本地磁盘上存取对象。 这里的架构,接口服务于数据服务之间的接口有两种。

实现对象的存取使用REST接口。也就是说服务服务本身也提供REST接口。 通过RabbitMQ消息队列进行通信。在这里的架构中对RabbitMQ的使用分为两种模式,一种模式是向某个exchange进行一对多的消息群发,另一种模式则是想某个消息对象进行一对一的消息单发。 每个数据服务节点都需要向所有的接口服务节点通知自身的存在,为此,创建了一个名为apiServers的exchange,每一台数据服务节点都会持续向这个exchange发送心跳消息。

另外,接口服务需要在收到对象GET请求时定位到该对象被保存在哪个数据服务节点上,所以还需要创建一个名为dataServers的exchange。所以的数据服务节点绑定在这个exchange并接收来自接口服务的定位消息。

之所以必须使用REST和消息队列这两种不同类型的接口是为了满足不同的需求:对象存取的特点是数据量有可能很大,不适合将一个巨大的对象通过消息队列进行传输。而REST接口虽然能够处理大数据量传输,但是对于群发却显得力不从心。

需要说明的是,虽然我们需要两种不同类型的接口,但不一定要选用REST和RabbitMQ。我们可以直接用TCP协议来传输对象;消息队列也有很多种,如 ActiveMQ 或 ZeroMO,甚至我们可以用UDP协议实现自己的消息群发。选择有很多,在这里我们使用REST和 RabbitMQ是因为它们都已经具备了成熟的Go语言库,实现起来较为容易。而且 Ubuntu上自带 RabbitMQ安装包,安装和调试都非常方便。