2013年5月23日
摘要: 呃,在gen_event中有两个添加handler的方法gen_event:add_handler/3gen_event:add_sup_handler/3一开始总是有些迷惑两者的区别,今天查看了gen_event源码,总算弄清两者的区别。add_handler添加的只是把gen_event作为容器,仅仅在适当的时间调用模块的回调函数。(后面我描述为normal handler)而add_sup_hander除了在适当的时间调用模块的回调函数以外,同时link到调用该函数的进程。(后面我描述为supervised handler)首先看看在gen_event中描述handler的record- 阅读全文
posted @ 2013-05-23 17:15 文武双全大星星 阅读(383) 评论(0) 推荐(0) 编辑
2013年5月15日
摘要: 前两篇:http://www.cnblogs.com/star-star/archive/2013/05/15/3080162.htmlhttp://www.cnblogs.com/star-star/archive/2013/05/15/3080216.html大体的概述了一下vector clocks算法。实现起来并不困难,但实际上还有很多细节需要考虑。思考一下,如果有很多的服务器节点,那么每个数据的vector clocks可能会非常长,甚至长到无法接受的地步,如下图的版本信息:[(A, 1), (B,1), (C,1) ...... (AA,1), (BB, 1) ...]他就占用了无 阅读全文
posted @ 2013-05-15 20:46 文武双全大星星 阅读(408) 评论(0) 推荐(0) 编辑
摘要: 接上一篇日志(http://www.cnblogs.com/star-star/archive/2013/05/15/3080162.html)最后说到解决版本冲突的两种方法,接下来继续进行深入。当版本冲突时,我们可能需要根据额外的信息来作为依据,来进行版本选择。这时候,我们可以将原先版本(Node, Tag)扩展为(Node, Tag, Timestamp)加上一个时间戳字段,作为一个额外的依据进行判断。这样,当我们同步A, B, C节点的数据时候,假设A节点第一次初始化数据时间戳为1, B节点修改数据时间戳为2, C节点修改时间戳为3,B节点则能根据修改时间,进行版本选择,最后A,B, C 阅读全文
posted @ 2013-05-15 19:33 文武双全大星星 阅读(406) 评论(0) 推荐(0) 编辑
摘要: 假设有如下的应用场景:我们有多台服务器节点,客户端每次请求时候可能会改变服务器上数据,但这些请求可能由不同的服务器节点进行处理,这样在每台服务器上都有持有自己的数据修改。为了使最后所有服务器的数据保持一致性,我们需要对每台服务器上的数据保持追踪和版本管理,这在dynamo中使用vector clock来进行处理。版本信息,我们用这样的结构进行表示(Node, Version), 例如A节点,版本1数据:(A, 1),对于每个数据,我们都额外附加一个版本信息列表来进行跟踪。我们首先要明确统一数据不同版本信息间的descendant的概念,我们大概可以用这样的伪码来判断descendant关系。/ 阅读全文
posted @ 2013-05-15 17:02 文武双全大星星 阅读(926) 评论(1) 推荐(0) 编辑
2013年5月14日
摘要: 我们知道在riak_core中使用的是一致性哈希算法(关于该算法看我的日志:http://www.cnblogs.com/star-star/archive/2013/02/01/2888713.html)首先我们先看看riak_core_app:start/2启动时候的代码,可以看到设置默认的bucket属性。%% add these defaults now to supplement the set that may have been %% configured in app.config riak_core_bucket:append_bucket_defaults( ... 阅读全文
posted @ 2013-05-14 15:13 文武双全大星星 阅读(364) 评论(0) 推荐(0) 编辑
2013年5月9日
摘要: 有时候需要项目依赖其他的开源项目(比如lager),这时候我们回到example目录下,编辑rebar.config文件:%%-*- mode: erlang -*-{erl_opts, [{parse_transform, lager_transform}]}.{sub_dirs, ["rel"]}.{deps, [{lager, ".*", {git, "git://github.com/basho/lager.git", "master"}}]}.修改rel目录下reltools.config,为:{sys, 阅读全文
posted @ 2013-05-09 16:18 文武双全大星星 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 首先创建目录example,进入目录创建app:[admin@localhost ~]$ mkdir example[admin@localhost ~]$ cd example/[admin@localhost example]$ rebar create-app appid=example==> example (create-app)Writing src/example.app.srcWriting src/example_app.erlWriting src/example_sup.erl创建Makefile如下:all: deps compile compile: rebar 阅读全文
posted @ 2013-05-09 10:44 文武双全大星星 阅读(372) 评论(0) 推荐(0) 编辑
2013年5月6日
摘要: poolboy是一个erlang编写的线程池框架,代码很简洁,项目地址:git://github.com/devinus/poolboy.git具体用法,项目上有对应范例。现在查看一下源码首先看看初始化部分:init({PoolArgs, WorkerArgs}) -> process_flag(trap_exit, true), Waiting = queue:new(), Monitors = ets:new(monitors, [private]), init(PoolArgs, WorkerArgs, #state{waiting = Waiting, moni... 阅读全文
posted @ 2013-05-06 17:24 文武双全大星星 阅读(704) 评论(1) 推荐(0) 编辑
2013年4月28日
摘要: 首先,有内网两台机器:10.80.3.97 作为master,所有的代码都放在该机器上。10.80.3.98 作为slave,从master通过网络进行引导。根据kernel文档中提到的,我们可以在两个台机器上,分别如下启动两个节点(注意虚拟机最好是同一版本,安装在同一目录下):erl -kernel start_boot_server true boot_server_slaves '[{10,80,3,97}, {10,80,3,98}]' -name master@10.80.3.97 -setcookie aerl -name slave@10.80.3.98 -loa 阅读全文
posted @ 2013-04-28 17:18 文武双全大星星 阅读(438) 评论(0) 推荐(0) 编辑
2013年4月10日
摘要: 首先我们必须要确定计算机在存储时,CPU -> 寄存器 -> 高速缓存 -> 内存 ,按照这样的缓存层次,我们知道不同通用寄存器的大小决定了cpu一次处理的指令大小,而其取决于机器字长,而高速缓存通过cache line来缓存数据,根据不同的数据总线一次性传输不同大小的数据,也就是说计算机内部传输处理数据并非按照我们想像的单字节的存储读取方式,而是按不同字节的chunks来处理,或者说不同的存储粒度。我先打印出本机不同类型的size,我的机器是x86_64: printf("char size:%ld\n", sizeof(char));printf(&q 阅读全文
posted @ 2013-04-10 13:53 文武双全大星星 阅读(269) 评论(0) 推荐(0) 编辑