读书人

对riak_core的探索 (四)

发布时间: 2012-08-02 11:35:26 作者: rapoo

对riak_core的探索 (4)
四、基于riak-core的开发指南


1. hello, riak_core

从riak-core-first-multinode开始一个hello world应用(简称mfmn):访问这里。

这个riak_core应用有个最简单的vnode,它仅实现了一个ping功能,当vnode收到ping命令时会返回这个vnode管理的partition在ring中的整数值。

该文演示了使用一个rebar定制的riak_core_multinode模版构建一个3节点的hello world级别的riak_core应用。

这个应用虽然没什么实用价值,不过可以亲手触摸到dynamo的ring、node这些概念。


1.1. riak_core应用的rebar开发模板

可以通过rebar模板riak_core_multinode自动搭建一个riak_core应用系统的骨架。

1) 下载rebar_riak_core模板



mfmn application的进程树,mfmn_vnode_master是riak_core_vnode_master模块运行时的一个进程注册名,这个进程作为容纳业务模块代码的容器运行。如前所述,在进程启动时系统的业务逻辑会嵌入到这个进程中了。



一般我们用appmon察看应用及其进程,但是打包后的应用不会自动包含appmon这个application。有两个办法:
1) 在make前,修改rel/reltool.config,在sys的 {rel, "mfmn", ... } 列出的依赖库列表中加入appmon,这样make出来的应用就可以图形工具appmon察看进程了;
2) 直接将erlang安装目录lib下的appmon拷到对应的dev/dev1/lib目录下


1.5 ping

这个hello world级应用系统对外提供了一个API(在mfmn.erl中),它只有一个叫ping的函数。
%% @doc Pings a random vnode to make sure communication is functional
ping() ->    DocIdx = riak_core_util:chash_key({<<"ping">>, term_to_binary(now())}),    PrefList = riak_core_apl:get_primary_apl(DocIdx, 1, mfmn),    [{IndexNode, _Type}] = PrefList,    riak_core_vnode_master:sync_spawn_command(IndexNode, ping, mfmn_vnode_master).




2. 一个更复杂点的应用:RTS

2.1 简介

这是一个实时统计应用(RTS)。它对外提供了两类服务:接收并分析用户的日志数据;对日志进行实时统计(比如目前为止一共收到多少请求,有多少GET请求、POST请求,浏览器类型等等)。访问见这里:riak-core-the-vnode。

2.2 数据分布策略

目标是得到不同用户上传日志的各类统计信息:不同用户上传自己的日志信息,RTS应用对每个用户上传的日志的各类状态分别统计。所以数据分布方式是根据用户信息和统计状态随机分布,:
DocIdx = riak_core_util:chash_key({list_to_binary(Client), list_to_binary(StatName)})

2.3 服务及其API

接收日志数据的服务在rts_entry_vnode模块中实现,统计日志的服务在rts_stat_vnode模块中实现。

同时,这两类服务对外提供的调用API也在对应的模块中。

每当接收日志服务收到一条日志,会用正则表达式分析日志,根据分析结果调用统计服务对日志信息进行计数。

最后由一个rts模块作为Facade包装这两个服务,统一对外提供API。

BTW:由于每个日志信息的上传都要新建一个HTTP连接,这里就成了系统输入的性能瓶颈。因此即使使用多个物理节点时也不会感受到系统性能的提高。


2.4 对外HTTP接口

为了实验方便,这个例子系统对外实现了一个HTTP接口,这样用户通过脚本利用curl工具就可以上传日志数据了。

这个HTTP接口借助了webmachine应用实现,具体逻辑在rts_wm_entry模块中,会在rts_app启动时完成这个模块的webmachine加载。


2.5 实现

这里的重点是了解和学习riak_core的vnode接口如何使用实现业务逻辑:基于riak_core_vnode behaviour实现相关回调函数。

对于每个partition,会有一个rts_stat_vnode进程负责该分区内日志数据的各种状态统计,这个vnode进程内维护一个字典数据结构(dict),用来存储这个partition上的各种日志状态。字典的key是状态名,value是整数或者list。

不过我觉得这个rts例子的处理逻辑似乎有问题,不能处理多个用户的录入。

riak_core_vnode behaviour的回调函数:
1) 生命周期回调函数:
init(Partition) 初始化vnode进程的状态(类似gen_server/gen_fsm的状态),回调函数的参数是代表此vnode负责的分区的ring整数;
terminate(Reason, State)

handle_exit/3 当与vnode进程有link的其它进程崩溃时被调用

用户定制的riak_core_vnode回调函数模块被称为'vnode_moudles',可以调用application:get_env(riak_core, vnode_modules). 查询当前应用的vnode模块。这些在riak_core:register_vnode_module注册。


to be continue...

读书人网 >开源软件

热点推荐