对Riak Core的探索 (9) cheatsheet

haogongju、人人IT网、59n南龙、360doc不要抄我的烂博客了,私人备忘用。

常用API之与ring、节点有关的API
  • riak_core:vnode_modules()  查询安装的vnode模块
  • riak_core_ring_manager:get_raw_ring() 获取整个ring环,包括partition及其节点
  • riak_core_apl:get_apl(HashKey,  N, Service) 得到HashKey对应的Preference List
  • riak_core_ring:preflist(HashKey, Ring) 得到HashKey在环Ring上的Preference List


常用application管理API

erlang本身提供的application模块有许多API函数可用:
  • aplication:loaded_applications/0  察看当前有哪些应用已经装载
  • aplication:which_applications/0  察看当前有哪些应用已经启动
erlang以application组织系统,application由模块组成,多个共同组成一个系统。

已装载的application并不意味着它已经启动,这一般是在rel( 也即script)文件中指定

application又依赖其它applications,后者又依赖其它application。。。
例如
A依赖B、C:这意味着A要正常启动,B、C要先启动,
B又依赖X、Y:A要正常启动,Y、Z要先启动,
C又依赖Y、Z:C要正常启动,Y、Z要先启动,

以此类推。。。

一般在每个应用对应的.app文件中,有个applications的配置,其值是个列表(list),这个list就是该应用依赖的其它应用。在系统发布时(release),发布工具会自动将这个列表里的所以依赖应用都启动。

如果不是作为发布(release),在开发过程中经常要手动启动(application:start/1),但是这种启动是不会自动将列表中的依赖应用也启动的,会报如下错误:
1> application:which_applications().
[{stdlib,"ERTS  CXC 138 10","1.18.1"},
{kernel,"ERTS  CXC 138 10","2.15.1"}]
2> application:start(xxx).
{error,{not_started,lager}}

因此启动xxx应用之前要确保xxx的依赖应用lager先被启动(application:start/1),而lager应用又依赖compiler和syntax_tools应用,因此都得按照依赖关系一一启动:
3> application:start(lager).
{error,{not_started,compiler}}

在应用的 app文件中会有一个applications属性,列出所有的依赖应用。

4> application:start(compiler).
ok
5> application:start(lager).  
{error,{not_started,syntax_tools}}
6> application:start(syntax_tools).
ok
7> application:start(lager).      
18:40:11.591 [info] Application lager started on node nonode@nohost
ok
8> application:start(xxx). 
18:40:13.739 [info] Application xxx started on node nonode@nohost
ok

在实际开发过程中,这种依赖的一一启动是很枯燥的,Riak Core的riak_core_util模块提供了这种依赖应用的管理:
riak_core_util:start_app_deps/1
这个函数检查应用依赖的其它应用,并确保所有依赖应用被启动。判断依赖应用:app文件中的applications属性。

猜你喜欢

转载自cryolite.iteye.com/blog/1629507