- 浏览: 99794 次
- 性别:
- 来自: 杭州
最新评论
-
johncan:
但是如果绑定错误,反而会有反效果,请问如何看是否绑定错误?是否 ...
erlang程序优化点的总结(持续更新) -
mahengyang:
如何使用mnesia:select/4分页查询%%对事务封装了 ...
mnesia监控项目 -
zjjxxl:
mysql代码高手,我们这里mysql5.6长时间运行内存过高 ...
innodb对B树游标的定位过程以及对“小于(等于)B树最小记录”的特殊处理 -
wqtn22:
是原创啊,霸爷mryufeng认证的,增加引用计数和减少引用计 ...
erlang NIF部分接口实现(三)持久资源 -
magicxiao:
enif_release_resource当引用计数为0的时候 ...
erlang NIF部分接口实现(三)持久资源
文章列表
上文介绍了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 ...