`
cryolite
  • 浏览: 578822 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对Riak Core的探索 (6) HTTP接口

阅读更多
haogongju,人人IT网,360doc不要抄我的烂博客了,私人备忘用。


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

我们需要了解系统的一些状态,比如,对riak这个NoSQL来说,我们需要了解bucket的当前存储状态。有时候也需要直接访问某个存储对象。这都可以通过HTTP和其他接口访问,HTTP是Riak Core提供最直接最方便的对外访问接口。

Riak Core通过webmachine实现对外提供HTTP/HTTPS访问接口。具体实现是riak_core_web模块,该模块非常简单对外提供了一个binding/1函数:返回了webmachine_mochiweb及其启动参数,也就是supervisor的child进程启动参数:
 {Name,
 {webmachine_mochiweb, start, [Config]}, 
permanent, 5000, worker, [mochiweb_socket_server]}


这个tuple作为supervisor的child spec,最终结果是webmachine_mochiweb进程挂在riak_core_sup监管的进程树上(?)。

在此借用webmachine的概念用“web资源”表示Riak Core以及基于它开发的应用提供的HTTP接口。


web资源的列表

Web资源模块可以用webmachine_router:add_route/1函数动态加入,最终所有的路由(dispatch)会作为webmachine的环境变量dispatch_list的值。
引用
application:set_env(webmachine, dispatch_list, DispatchList)


这是一种很有趣的用法,可以看作是一种application范围的命名空间,变量存放在这个命名空间内,但是这里的变量是持久化的么?如果是写在app文件的env中当然是持久化的,但是缺点却是不能修改的。。。因此,这些变量应该是在每次启动时初始化值,而不是持久化来的。

从OO转来erlang的同学有时候会觉得不太适应,因为在OO中可以通过静态对象属性(私有或公有)很方便的保存某个变量,用的顺手了,来到erlang发现没有对应的对象的概念,勉强对应的是动态的erlang进程。而变量或者在进程间传递(某种Context,或者环境),或者在进程字典里,或者在ets里,又或者,与OO最相似的用法是利用参数化模块(parameterized module)。这里看到了另外一种变量的保存和传输方式:每个application管理着一个命名空间,变量存放在这个命名空间内。(不过本质上,这些变量最终还是保存在ets中的,不过是该application对应的application_controller,一个gen_server模式的进程,这是一种更高层次的进程,不像一般普通进程死掉了没关系大不了再来一个,这个进程死掉意味着整个应用都当掉了,所有与这个应用有关的进程也都会当掉。)

Riak Core提供了一个统一的、缺省的也是唯一的Web资源模块:riak_core_wm_urlmap。这个web资源只有一个用途:列出其它的web资源。(其实就是保存在webmachine的环境变量dispatch_list里的那些模块)。例如对于riak数据库,直接在浏览器中打开http://localhost:8098/时会看到这个列表,都是riak_kv提供HTTP接口,如图所示。




举个例子,对于riak这个NoSQL KV来说,riak_kv基于webmachine提供相关的HTTP访问接口(在riak_kv应用配置文件的applications属性,在riak_kv启动时会先确保这个属性列表值里的所有应用都已启动),riak_kv在启动时(riak_kv_app:start/2)通过webmachine_router:add_route/1将这些HTTP接口(riak_kv提供的web资源)注入到webmachine,如前所述,实际上是webmachine应用的环境变量dispatch_list,riak_core_wm_urlmap资源会将这些web资源显示出来。

顺便说一句,riak_kv的这些HTTP接口(每个接口其实是一个webmachine web资源)是在riak_kv_web中定义的,riak_kv_app:start/2函数通过这个模块获得这些web资源列表,riak_kv_web:dispatch_table/0函数为riak_kv提供了一个dispatch列表,这里列表中的web资源模块有统一的命名规则,都是riak_kv_wm_起头。

综上所述:通过webmachine_router:add_route/1添加web资源时,会自动将web资源添加到webmachine应用维护的一个内部变量中。riak_core提供了一个缺省web资源(riak_core_wm_urlmap),它会将这个变量中保存的路由表(或者说diapatch list)以列表的形式显示出来。
分享到:
评论

相关推荐

    riak-erlang-http-client:使用HTTP接口的Riak Erlang客户端

    riak-erlang-http-client建置状态 riak-erlang-http-client是Riak的Erlang客户端,使用HTTP接口快速开始您必须具有或更高版本,以及GNU风格的构建系统才能编译和运行riak-erlang-http-client 。 git clone git://...

    Laravel开发-laravel-riak

    在本文中,我们将深入探讨如何在 Laravel 框架中集成和使用 Riak 数据库,主要关注连接配置、缓存管理以及会话存储。Riak 是一个分布式键值存储系统,提供高可用性、可扩展性和容错性,特别适合大数据量的应用场景。...

    riak_core:Riak使用的分布式系统基础架构

    里亚克核心 Riak Core是分布式系统框架,是分发数据和扩展规模的基础。 更一般而言,可以将其视为构建分布式,可伸缩,容错应用程序的工具包。 对于Riak Core的一些介绍性阅读(这不是纯粹的代码), 有一个古老但...

    Laravel开发-laravel-riak-auth

    6. **测试和调试**:为了确保`laravel-riak-auth`的正确运行,开发者通常会编写单元测试和集成测试。了解如何测试Riak与Laravel的交互对调试和维护此系统至关重要。 7. **性能优化**:由于Riak的分布式特性,`...

    Riak 学习文档

    选择 Riak 主要是因为它能应对大规模历史消息数据,这种数据结构非常适合键值对存储,且Riak 的集群配置简单,易于扩展。 **Riak 的核心特性** 1. **分布式存储**:Riak 是一个分布式数据库,数据分散在多个节点上...

    riak-ruby-client, 用于 ruby的Riak客户端.zip

    riak-ruby-client, 用于 ruby的Riak客户端 ) 客户端( Riak客户机)riak-client 是一个富 ruby 客户端/工具箱,分布在,数据库中,包含典型操作的基本包装。在 http://basho.github.io/riak-ruby-client/ 可以使用详尽...

    riak_pg, 带riak_core的分布式进程组.zip

    riak_pg, 带riak_core的分布式进程组 概述带riak_core的分布式进程组。用法将进程加入组( 不需要预先声明)join(term(), pid()) -> ok | {error, timeout}.如何删除?leave

    riak-session-manager.zip

     <Manager className="com.jbrisbin.vpc.riak.session.RiakManager" defaultUri="http://localhost:8098/riak/{bucket}/{key}" mapReduceUri="http://localhost:8098/mapred" maxInactiveInterval="1800"/>...

    luwak:Riak的大对象存储接口(注意

    Riak密钥/值存储极其快速且可靠,但是由于对象大小受限制,因此无法在某些应用程序中使用它。 例如,很难或不可能存储高清晰度的静止图像或视频。 Luwak是Riak上的服务层,可为大量对象提供简单的,面向文件的抽象。...

    riak-Erlang.rar

    4. 键值存储:Riak以键值对的形式存储数据,支持JSON、BSON等数据格式,方便与其他应用程序集成。 5. 查询语言:虽然主要为键值存储,但Riak还支持查询语言 Riak Search 和 Riak KV MapReduce,允许用户执行更复杂的...

    riak_perf_analysis:探索Riak性能的工具和实验

    6. **实验性特性测试**:在"riak_perf_analysis"中,可能会有针对Riak新特性的实验和测试,如新的索引类型、分区策略等。这些测试有助于评估新特性对性能的影响,为是否在生产环境中启用提供决策支持。 通过"riak_...

    flaviodb:实现固定消息流存储的 Riak Core 示例项目

    core.gitcd rebar_riak_coremake install创建项目模板mkdir flaviodbcd flaviodb# download rebar and set executable permissionswget ...riak_core template with app id set to flavio./rebar create template=riak_...

    riak_core_tutorial

    riak_core_tutorial目录 3.4. 5.7.8.10.1112.环境要跳过设置环境,已经为本教程准备了一个环境: riak_core_env 。 在接下来的章节中,我假设您已运行环境并在链接中提到的RIAK_CORE_ENV/synced/目录中完成所有工作...

    YCSB-riak-binding:YCSB 的 Riak 数据库接口

    YCSB 的 Riak 数据库接口 安装指南 下载YCSB项目如下:git clone 在 YCSB 目录中包含 Riak DB 绑定: git clone riak 将 riak 添加到 YCSB/pom.xml 中的模块列表 将以下行添加到 YCSB/bin/ycsb 中的 DATABASE ...

    前端开源库-riak-js

    总结,"前端开源库-riak-js"是连接RIAK数据库的有力工具,它提供了高效的Node.js接口,使前端开发者能够轻松地在JavaScript应用中管理RIAK数据,确保数据的高可用性和一致性。通过理解并熟练使用riak-js,开发者可以...

    riak-java-client:Java的Riak客户端

    Riak Java客户端 Riak Java客户端支持与 (开放源代码,分布式数据库)进行通信,该数据库专注于高可用性,水平可伸缩性和可预测的延迟。 Riak和此代码均由维护。 Java客户端的最新版本同时支持Riak KV 2.0+和Riak...

    riak-cli:Riak 命令行客户端

    有更好的解决方案,请参考 ->使用带有curl的Riak http api查询riak真的很烦人! 于是工具诞生了。 干杯! 这是一个 Riak 终端查询工具,提供基本的 POST/PUT/DELETE/GET 等方法。安装 $ brew install node$ git ...

    Laravel开发-laravel-riak .zip

    6. **错误处理和故障切换**:集成 Riak 后,应处理可能出现的连接问题和网络异常,确保应用的健壮性。 **最佳实践** - **数据建模**:根据 Riak 的特性,设计适合键值存储的数据模型,避免过于复杂的查询需求。 - *...

    riak-formula:安装和管理 Riak

    6. **Stanchion**:Stanchion 是 Riak CS 的一部分,负责全局唯一标识符的分配,确保跨多个 Riak CS 实例的数据一致性。 7. **SaltStack** 配方:"riak-formula" 使用 SaltStack 的状态树(state tree)结构,通过...

    server_monitoring_riak:使用Riak作为后端的服务器监视

    使用Riak作为后端的服务器监视 该项目是我的学士学位工作的一部分: “ NoSQL数据库和应用程序的比较分析” 米兰比可卡大学 关联者:安德烈·毛里诺(Andrea Maurino) 联合主持人:Blerina ...如果您对Riak配置有任何

Global site tag (gtag.js) - Google Analytics