一文读懂Apache Geode缓存中间件( 二 )


2.1 Apache Geode的架构 2.1.1 通信拓扑 

  • 2.1.1.1 点对点
    一文读懂Apache Geode缓存中间件

    文章插图
    点对点(Peer To Peer)的部署模式没有服务器的概念,所有参与缓存的节点一视同仁,这种部署模式主要用于把缓存嵌入到集群中每个应用节点上 。
  • 2.1.1.2 客户端/服务器
    一文读懂Apache Geode缓存中间件

    文章插图
    客户端/服务器部署下,Apache Geode作为独立的集群服务存在,这样部署的好处是,客户端只选择性地保留一小部分本地缓存,将大部分缓存数据委托给服务集群,节点和节点之间不需要频繁地进行数据分发,也更便于进行扩展 。
2.1.2 服务发现Apache Geode提供了定位器(Locator)进程,为参与缓存的所有成员(Client、Server、其它的Locator)提供其他成员的发现和负载均衡 。Locator既可以和其他Geode进程部署在一起,也可以独立部署,独立部署可以更好地保证定位器的可靠性和可用性(因为一旦一起的Geode进程挂了,这个Locator也很难幸免于难) 。可以部署多个Locator共同起作用,client连接时可以选择连接到哪个Locator上 。
Client可以配置连接到哪个Server服务器,但更合理的配置方式是连接到某个Locator上,由这个Locator为Client分配一个负载较低的Server,Client启动后只会和Locator沟通一次,在获知被分配到的Server的IP和端口之后,每次读写都会直接连接到Server上 。
2.1.3 数据存储形式和区域市面上大部分的内存数据存储,都将数据按键值对的格式进行存放,Geode也是如此 。但与Redis等简单的KV不同,Geode将KV数据们按数据区域(Region)进行组织 。对于不同的区域可以单独配置(如是否分区或需要副本) 。
数据区域可以类比于关系型数据库中的表的概念,是一系列结构相同的数据结构的集合 。实际上,在实现上数据区域就是一个ConcurrentMap<K, V>,其键就是一条数据的唯一性标识(类型任意,只要重写了equals和hashcode以便于Region确认键的唯一),其值是一个表达完整数据概念的对象,这样其实也让一条数据中按类的成员又划分出了列的概念 。基于这种类似关系型数据库的存储模式,Geode提供了一种类似于SQL的查询语言,称为OQL,并支持多区域查询(类似于连表查询) 。下面是一个OQL查询的小例子:
class DictPlatform implements DataSerializable {    short platformId;    String name;    String status;}class TestServiceImpl {    public void query() {        String queryString = "SELECT dp.platformId, dp.name FROM /dict_platform dp WHERE dp.status >= 0;"        QueryService queryService = cache.getQueryService();        Query query = queryService.newQuery(queryString);        SelectResults results = (SelectResults)query.execute();        DictPlatform p = (DictPlatform)results.iterator().next();    }}