在erlang项目使用protobuf

原文 2014-03-23 21:57:49 发表于 CSDN,这里对以前写的文章做下收录。

protobuf是google的一个序列化框架,类似XML,JSON,其特点是基于二进制,比XML、JSON表示同样一段内容要短小得多,还可以定义一些可选字段,广泛用于服务端与客户端通信。文章将着重介绍在erlang中如何使用protobuf。

首先google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuf库(erlang_protobuffs
继续阅读在erlang项目使用protobuf

Erlang消息选择性接收特性

原文 2015-03-06 01:44:46 发表于 CSDN,这里对以前写的文章做下收录。

从 rabbitMQ 代码中找到 gen_server2 , 对gen_server进行了一些优化。看到前辈写的博文也提到这个,引发了我的思考。见 gen_server2 - OTP gen_server优化版 。

gen_server2 引发的思考

正如 litaocheng 所说的:
gen_server 和 gen_server2 最大的不同是:
gen_server2 收到任何一条消息放到外部的队列中,当VM内部消息队列为空后,才进行消息处理,继续循环
gen_server 收到任何一条消息后,立即进行处理,处理完成后继续循环
继续阅读Erlang消息选择性接收特性

Erlang进程堆垃圾回收机制

原文 2014-05-23 00:17:52 发表于 CSDN,这里对以前写的文章做下收录。

每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存。

erlang进程堆的gc是分代gc,分代gc的想法基于统计学:大部分数据的生存周期都比较短,最新的数据更容易不再被使用。这里erlang使用young heap 和old heap来区分数据,young heap放新数据,old heap放旧数据,也就是gc后存活的数据。
继续阅读Erlang进程堆垃圾回收机制

erlang shell 命令中文说明

原文 2013-11-21 21:39:07 发表于 CSDN,这里对以前写的文章做下收录。

erlang shell 是在命令行模式下使用命令和 erlang 交互的工具。erlang shell功能十分强大,可以直接编译、加载、执行、调试模块等等,完全可以将shell做为erlang项目的终端使用。文章将对erlang shell 命令做介绍,还简单以示例说明。

打开erlang shell的帮助信息,在这里变成中文了。同时可以看下官方文档

shell 函数帮助

Eshell V5.10.2  (abort with ^G)
1> help().
** shell 内置命令 **
b()        -- 显示所有绑定的变量
e(N)       -- 重复某次查询 <N>
f()        -- 释放所有绑定的变量
f(X)       -- 释放某个绑定的变量
h()        -- 显示之前的操作
history(N) -- 设置保存之前操作命令的条数
results(N) -- 设置保存之前操作结果的条数
catch_exception(Bool) -- 设置的执行过程中的异常处理
v(N)       -- 使用某次查询的值 <N>
rd(R,D)    -- 定义一个 record
rf()       -- 移除所有 record
rf(R)      -- 移除某个 record
rl()       -- 显示所有 record
rl(R)      -- 显示某个 record 信息
rp(Term)   -- 显示某个元组的所有内容
rr(File)   -- 从一个文件或模块读取 record 定义

继续阅读erlang shell 命令中文说明

Erlang时间处理、时间戳转换

原文 2013-11-13 20:13:32 发表于 CSDN,这里对以前写的文章做下收录。

获取当前时间

erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。有个问题要注意,还有另外一个函数可以实现同样的功能:os:timestamp()

那么, erlang:now() 和 os:timestamp() 的区别是什么?

erlang的解释如下:

erlang:now()

If you do not need the return value to be unique and monotonically increasing, use os:timestamp/0 instead to avoid some overhead.

os:timestamp()

The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attempts at time correction. The result of two different calls to this function is not guaranteed to be different.
继续阅读Erlang时间处理、时间戳转换

skynet服务的本质与缺陷

原文 2015-11-03 22:45:17 发表于 CSDN,这里对以前写的文章做下收录。

skynet是为多人在线游戏打造的轻量级服务端框架,使用c+lua实现。使用这套框架的一个好处就是,基本只需要lua,很少用到c做开发,一定程度上提高了开发效率。但skynet文档也相对较少,所以这里利用一点时间学习和总结skynet相关内容,文章这里就讲解下skynet服务的本质与缺陷,希望能有所帮助。

skynet服务的本质

或许我们对skynet服务有着太多的疑问:

skynet服务究竟是什么,为什么有人说服务是一个lua虚拟机,服务与服务之间的通讯是怎样的,为什么服务的内存高居不下, 为什么拿skynet服务和erlang进程做比较?等等。。。而这一切的答案都在代码里面,让我们一步一步解开她的面纱。

继续阅读skynet服务的本质与缺陷