常用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 察看当前有哪些应用已经启动
已装载的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属性。