`
wqtn22
  • 浏览: 99794 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
文章列表
上文介绍了protobuffs的词法与语法分析过程,发现其收集了目标proto文件及其import文件的语法树,此处继续观察语义分析过程。 语法树的格式如下: [Message1 = {message,MessageName,[FieldRecord1,FieldRecord2,...,FieldRecordn]},Message2,...,Messagen], FieldRecord = {FieldID,required/optional/repeated/repeated_packed,FieldType,FieldName,DefaultValue}。 protobuffs_co ...
上文介绍了rds_la.proto生成的头文件rds_la_pb.hrl和源文件rds_la_pb.erl的内容,这里将继续分析生成它们的原理。 首先看看protoc-erl的内容:   #!/usr/bin/env escript %% -*- erlang -*- %%! -sasl errlog_type error -boot start_sasl -noshell   main ([File]) ->   protobuffs_compile:generate_source (File); main (_) ->   io:format ("u ...
basho的riak是应用erlang编写的类dynamo kv存储,其实现贯彻了松耦合、模块化的特征,各类核心组件均可替换: 分布式组件riak_core可以用于构建其它的分布式应用,https://github.com/rzezeski/try-try-try是一个利用riak_core构建分布式应用的 ...
复制前文的应对方法概览:   1从大道理上来讲,需要开发者预估一个进程的处理能力,不要向进程投递过多的消息以致于处理不完,如果处理不完,则需要重新设计,将消息分布到多个进程中处理; 2将异步接收消息的进程与 ...
对于“进程允许异步投递,但进程内部有调用port(receive_match)的模式出现”这个问题的解决,有这么几个办法: 1从大道理上来讲,需要开发者预估一个进程的处理能力,不要向进程投递过多的消息以致于处理不完,如果处理不完,则需要重新设计,将消息分布到多个进程中处理; 2将异步接收消息的进程与调用port(receive_match)的模式的进程分开; 3拆分向port投递命令的过程,由进程来接收port回传的结果,而不是由模块接收; 4不使用port编写的模块,利用nif重新实现一套; 5其它。   由于本人技术功底尚浅,因此将挑选最常见的两种场景进行分析和解决,这两种场景 ...
上文解释了问题成因,即进程允许异步投递, 但进程内部有调用port(receive_match)的模式出现 ,现在来看一个典型的场景。 霸爷(yufeng)曾经不建议我们使用error_logger模块记录日志,因为该模块就使用了这个模式。 首先看看error_logger的启动方式:   start() ->     case gen_event:start({local, error_logger}) of {ok, Pid} ->    simple_logger(?buffer_size),    {ok, Pid}; Error -> ...
上文介绍了简单的问题场景,现在来分析下产生的原因。 consumer进程里面调用file:write和gen_tcp:send来处理消息:   handle_msg(Type, Msg, #state{file = File, socket = Socket}) when is_binary(Msg) ->     case Type of         file -> file:write(File, Msg);         net -> gen_tcp:send(Socket, Msg)     end; handle_msg(Type, Msg, S ...
在进行项目开发时,有这么一个需求:一个生产者不断产生消息,并将消息异步投递给消费者,异步投递不受任何限制,消费者进程内部将消息写入文件或者通过套接字发送该消息。 看到这个需求,我想也没想,熟练地写下了如下代码:   API:   start_link(FileName, DsgHost, DstPort) ->     gen_server:start_link({local, ?SERVER}, ?MODULE, [FileName, DsgHost, DstPort], []).     deliver_to_file(Msg) -> deliver_to(fi ...
上一篇博文介绍了mnesia的事务提交准备过程,为每个事务参与结点构造了其提交结构commit,下面将进入到提交过程中,此后将继续分析。   mnesia_tm.erl   multi_commit(sym_trans, _Maj = [], Tid, CR, Store) ->     {DiscNs, RamNs} = commit_nodes(CR, [], []),     Pending = mnesia_checkpoint:tm_enter_pending(Tid, DiscNs, RamNs),     ?ets_insert(Store, Pending), ...
上一篇博文介绍了mnesia的锁请求过程,在请求到锁后,mnesia:write将更新写入临时ets表,此后mnesia:write将完成其使命,重新回到mnesia_tm:apply_fun函数中,此后将继续分析。 apply_fun(Fun, Args, Type) ->     Result = apply(Fun, Args),     case t_commit(Type) of do_commit ->             {atomic, Result};         do_commit_nested ->             {n ...
上一篇博文介绍了mnesia的写操作函数write完成的工作,其中涉及了锁请求过程,此后将继续分析。 mnesia_locker.erl wlock(Tid, Store, Oid) ->     wlock(Tid, Store, Oid, _CheckMajority = true). wlock(Tid, Store, Oid, CheckMajority) ->     {Tab, Key} = Oid,     case need_lock(Store, Tab, Key, write) of yes ->    {Ns, Majority} ...
上一篇博文介绍了mnesia的事务准备阶段,在其transaction上下文中执行了传入的函数,该函数为 fun() -> mnesia:write({user, me, 12345}) end 此后将继续分析。 mnesia_tm.erl apply_fun(Fun, Args, Type) ->     Result = apply(Fun, Args),     case t_commit(Type) of
erlang的分布式数据库mnesia是erlang分布式体系中非常重要的组件,其本身具有分布式的特性,可以在多个结点上建立数据副本,支持数据持久化,用好了mnesia,可以极大的减轻分布式架构的设计难度。 本博文带来的第一篇有关mne ...
Global site tag (gtag.js) - Google Analytics