- 浏览: 86775 次
最新评论
文章列表
protobuf是google开源的序列化工具,类似xml,json,基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,用于服务端与客户端通信。google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuffs库,文章在这个库的基础上做一些改进。
在开始阅读这篇文章前,先了解一下原来erlang版的protobuf使用例子。改进版的protobuf代码及例子在这里(下载地址)。欢迎下载,有什么问题可以评论反馈。
改进protobuf
改进调用方法
原来调用比较别扭,每个协议都是不同的方法名:
encode() ->
Per ...
- 2014-12-24 20:25
- 浏览 485
- 评论(0)
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。文章收集一些常用 mnesia 使用技巧。
mnesia判断表是否存在
%% 确保已经 mnesia:start().
lists:member(Tab, mnesia:system_info(tables)).
mnesia检查数据库是否创建
case mnesia:system_info(use_dir) of
true ->
alread_created;
_ ->
mnesia: ...
- 2014-12-23 23:12
- 浏览 568
- 评论(0)
protobuf 是google开源的一个序列化框架,类似xml,json,最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。还可以定义一些可选字段,用于服务端与客户端通信。前面几篇文章说了protobuf的用法,看到网上也没有分析protobuf协议的文章,就利用一些时间写了protobuf 的协议分析,希望大家喜欢。
protobuf协议核心思想
基于128bits的数值存储方式(Base 128 Varints)
数据表示方式:每块数据由接连的若干个字节表示(小的数据用1个字节就可以表示),每个字节最高位标识本块数据是否结束(1:未结束,0:结束),低7位表示数据内容。( ...
- 2014-12-22 00:07
- 浏览 530
- 评论(0)
前面的文章有讲过erlang热更新,只是大概介绍,现在再深入一点讲erlang的模块热更新。erlang的热更新是模块级别的,就是一个模块一个模块更新的。
热更新是什么,就是在不停止系统的情况下对运行的代码进行替换。
如何进行热更新?
c(Mod) ->
compile:file(Mod),
code:purge(Mod),
code:load_file(Mod).
以上就是shell c(Mod) 的主要代码,3个步骤:编译新的代码,清除旧代码,加载新代码
同样, l(Mod) 的主要代码如下,少了编译过程:
l(Mod) ->
code:purge(Mod),
co ...
- 2014-11-17 00:58
- 浏览 494
- 评论(0)
Erlang除了提供try catch,catch等语法,还支持link和monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。除了这样,erlang还提供trap_exit方法让进程主动捕获异常退出消息,避免发生异常时被系统关闭。
trap_exit说明
erlang设计上有速错(fast on fail)的原则,就是让问题快速暴露,迅速停止这个进程的运行,以避免这个进程错误执行造成更多的错误。但是在业务层需要容错,所以erlang就把选择权交给用户,通过process_flag(trap_exit,true)来避免进程被异常关闭。
-module(test).
-comp ...
- 2014-11-16 15:56
- 浏览 339
- 评论(0)
之前做过hadoop的测试,测试了hive/impala对hbase数据的查询,这里以hive为例,impala查询hbase数据也类似。
hbase访问方式
NativeJAVA
- 2014-11-12 20:00
- 浏览 769
- 评论(0)
Erlang节点之间的通讯,主要用于两个Erlang节点之间的通讯,但Erlang还支持与java构建的节点通讯,甚至与c构建的节点通讯,前面两种方式在我以前的文章都有讲到,所以这里讲Erlang与c构建的节点通讯。
Cnode与erl_interface
想用C构建 ...
- 2014-11-06 00:25
- 浏览 282
- 评论(0)
erlang更新到R17已有一段时间了,公司项目打算从旧版的erlang迁移到R17,却不料有不少的困扰,其中一个问题是中文问题。
这个问题很容易重现:新建一个文件t.erl,保存为utf-8无bom格式
-module(t).
-export([test/0]).
test() ->
["我", <<"我">>].在旧版的erlang中,下面的代码能正常工作,结果就是:
Eshell V5.9.1 (abort with ^G)
1> c(t).
{ok,t}
2> t:test().
[[230,136, ...
- 2014-11-02 23:20
- 浏览 263
- 评论(0)
erlang本身提供一个接口,可以用来检查模块是否有导出函数,这个接口是erlang:function_exported/3,但是很多时候这个接口无法正常使用。
下面重现一下这个问题:
1> erlang:function_exported(crypto,start,0).
false
2> crypto:start().
ok
3> erlang:function_exported(crypto,start,0).
true
注意:例子中并不是说一定要crypto:start()才能使用这个函数,只是说这个函数确实存在。
现在,来看下erlang对这个接口的说明:
Retu ...
- 2014-11-01 01:27
- 浏览 349
- 评论(0)
erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。上篇文章讲了tuple相关的内容,本篇就讲erlang list方面的知识,主要说一 ...
- 2014-10-24 19:16
- 浏览 1253
- 评论(0)
分布式是erlang的三大特性之一,都说erlang分布式,最简单最直接的应用就是节点通讯。
问题来了,怎么节点通讯,节点连接可能很多人知道,如何在两个节点连接后进行本地与远程通信?这就是本篇所讲的内容。
下面是示例代码,完成2个节点的通讯:
A节点的代码:
-module(server_demo).
-export([start/0, rpc_call/2]).
start() ->
Pid = spawn(fun() -> server_loop() end),
register(demo, Pid), %%注册进程名字
ok.
server_loo ...
- 2014-10-22 18:53
- 浏览 460
- 评论(0)
借助SecureCRT,可以轻松使用上传本地文件到linux服务器、或者从服务器下载文件到本地。
这里要借助两个实用的linux命令:
sz 可以将服务器的文件下载到本地(Send Zmodem)
rz 则是把本地文件上传到服务器(Receive Zmodem)
rz,sz是Linux同Windows进行ZModem文件传输的命令行工具,比ftp命令方便很多,而且不用打开ftp服务。
sz命令:
sz filename
sz dir/*
这个命令从服务器下载文件到本地,本地目录地址为SecureCRT设定的指定保存目录:
设置方法:Options > Session ...
- 2014-09-30 15:12
- 浏览 319
- 评论(0)
今天在Centos6.5下安装erlang,过程真是一波三折,总结一下:
下载erlang源代码包,选择版本,这里以erlangR16B03为例作说明:
wget http://www.erlang.org/download/otp_src_R16B03.tar.gz
tar -zxf otp_src_R16B03.tar.gz
cd otp_src_R16B03
mkdir -p /home/erl
./configure --prefix=/home/erl
make && make install
ln -s /home/erl/bin/erl /usr/bin/ ...
- 2014-09-24 19:03
- 浏览 527
- 评论(0)
Glibc 包含了linux一些主要的C库,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等。
centos默认的glibc版本比较低,不支持一些新的应用,所以对glibc进行更新,发现编译glibc报一个错误:
Makeconfig:42: *** missing separator. Stop
看了glibc文档发现,glibc不能在源代码目录编译,建议在源码目录上层新建一个目录glibc-build,用于编译
$ wget http://ftp.gnu.org/gnu/glibc/glibc-2.19.tar.gz
$ tar -zxf glibc-2. ...
- 2014-08-14 14:22
- 浏览 2168
- 评论(0)
我们知道,erlang在开源社区的活跃度远远不及java社区,在java社区中有很多优秀的开源框架,比如struts、hibernate、 spring、hadoop、hbase等,为了让erlang和java社区的众多开源框架相结合,让他们优势互补,可以让erlang来调用java写的中间件。
erlang提供了一个Jinterface代码包,java可以和erlang建立节点通信。通过这种方式,erlang可以将 java构建的节点也当作erlang的一个节点,java可以接收erlang传过来的消息,并且处理之后以异步的方式发送处理结果。
erlang与java构建的节点通讯
安 ...
- 2014-08-10 14:27
- 浏览 305
- 评论(0)