留言板
原创文章,转载请注明: 转载自Erlang非业余研究
本文链接地址: 留言板
各位兄弟姐妹们,流言飞语都来吧, 俺不怕!
Post Footer automatically generated by wp-posturl plugin for wordpress.
原创文章,转载请注明: 转载自Erlang非业余研究
本文链接地址: 留言板
各位兄弟姐妹们,流言飞语都来吧, 俺不怕!
Post Footer automatically generated by wp-posturl plugin for wordpress.
hi,想请教一下mnesia的查询,又没办法做到模糊查询的?例如 name=“abcdefghij”,如果用sql查的话可以是:like “%cdef%”这样可以查到,但mnesia怎么可以做到?我看文档,找网络,都找不到。谢谢了!
[Reply]
mnesia是个数据源,只支持基本的查询操作, 复杂的查询条件是由 qlc模块来支持的。你说的功能可以用match_specification来做。
[Reply]
[Reply]
[Reply]
问一下老大,erlang开发大型网络游戏的前景如何?
ND有这个应用的打算吗?
[Reply]
yu feng Reply:
November 26th, 2009 at 3:51 pm
我觉得很适合做大型的网游 部分历史代码由port或者cnode已经nif承担,整个开发很轻松的。
ND 老板很看好。。。
[Reply]
小弟不才,一直想在互联网这条路上混出点成绩来,以前都只是给别人做做小企业网站,也运营过地方论坛,但都没有什么成效,随着As3和Flex的发展,小弟对日后的发展也做了一定调整,想在休闲网页游戏方面试一试,主要是面向地方结合先下运营(小弟是广东佛山的),所以之前自学了as3了Flex,As3相对比较熟悉一点,Flex则大概了解了一遍.现在开始弄服务器端的编程,可是没有什么这方面的基础和实际经验,C/C++相信学习成本和难度高了些,用java也尝试过了解过,后来知道了Erlang,觉得用Erlang做的话应该很适合的,因为在我的架构里,主要是编写基于TCP协议方面的通信,但苦于没有更好的实战资料,自己的英文又基本是靠翻译才勉强看得明白的程序,苦恼啊!苦恼啊!
本人目前要解决的问题如下:
1.as3(多客户端)与于Erlang的通信问题.
2.游戏大厅的服务器架构
3.具体游戏的服务器架构(小弟主要想做的是网络棋牌对战类的网页Flash版的游戏).
可能还有一些实际问题我没有遇到和想到,现在的我就在这卡主了,不知道该如何进行下去.
小弟真诚求学,现在已经辞掉了工作,专心于这方面的学习了.
当然,不能让余丰大哥太过雷锋的,小弟愿意有偿请教!当然,小弟积蓄也是有限啊!还望大哥能体谅.
小弟计划花半年的时间掌握这方面的知识,花半年时间来开发产品,再投入运营!
希望余丰大哥百忙中能为小弟指点一二.
再次祝愿余丰大哥在新的一年里余丰余丰,御风而上,玉树临风.
[Reply]
我在调分布式编程的KVS程序时出了问题:
>rpc(call(gandalf@20090909-1351,kvs,store,[weather,fine]).
出了错:
**exception error:bad argument in an arithmetic expression
in operator -/2
called gandalf@20090909-1351
请教问题出在哪儿?
[Reply]
Yu Feng Reply:
March 30th, 2010 at 1:46 pm
gandalf@20090909-1351 这个不是atom
正确的写法是 ‘gandalf@20090909-1351’
[Reply]
谢谢,已经正确了
[Reply]
大牛,俺是一名java程序员,工作两年多,一直关注着erlang,业余时间学习erlang半年有余,现在感觉没多大长进了,能否提供一些方法和建议。
[Reply]
Yu Feng Reply:
April 5th, 2010 at 4:48 pm
猛看代码 猛写代码. 推荐看看如mochiweb hotwheels这样的短小又写的好的模块. 光知道语法啥用没有!
[Reply]
Hi,本人在使用mnesia的过程中,发现log里常有:
** WARNING ** Mnesia is overloaded: {mnesia_tm, message_queue_len, “mm”}
这样的警报信息。而我对mnesia的使用是很轻量级的,只有4个表,最大不超过2000条数据,没有理由超载。上网google了一下,网上对此问题众说纷纭,莫衷一是。
请教下此信息因何产生?能通过什么思路调优?在此拜谢。
[Reply]
@Atlas
846 Threshold = 100,
847 Prev = S#state.tm_queue_len,
848 {message_queue_len, Len} =
849 process_info(Pid, message_queue_len),
850 if
851 Len > Threshold, Prev > Threshold ->
852 What = {mnesia_tm, message_queue_len, [Prev, Len]},
853 mnesia_lib:report_system_event({mnesia_overload, What}),
854 {noreply, S#state{tm_queue_len = 0}};
check_overload是10秒钟一次, 你打印警告信息的原因是在过去的20秒里面,你的mneisa_tm的消息队列的长度都超过了100. 也就是说你的事务交易积累太多.
原因可能有2个:
1. 你的提交的事务资源竞争, 事务未能很快完成.
2. 你的机器处理能力有限, 不能很快处理事务.
[Reply]
@Yu Feng
感谢。
那mnesia_tm的作用是什么呢?为什么Len不能超过100?这个100的数量能不能增加的?
因为我的系统业务模型比较复杂,所以我采用了原子型事务的方式,既每个业务都拆分成若干原子事务,每个原子事务都是独立的事务,可以作为不同业务的组成部分,也可以独立使用。所以事务交易积累是比较多。
但如果我要改变这种原子型事务的结构,改成每个业务都是一个超级大事务,那么对整个体系改动太大。目前我的系统用户量和负载都很小,我观察过server,平均cpu负载都在5%以下,内存都在10%以下,我认为应该有充足的系统资源来满足mnesia的要求。我能不能通过改变某些配置来提高这个Threshold的值?
[Reply]
你好!在学习Erlang的OTP编程,在第18章P276,1>alarm_handler:set_alarm(tooHot).有问题,** exception error: bad argument
in function gen_event:send/2
请教不知问题出在哪儿?
[Reply]
Yu Feng Reply:
April 24th, 2010 at 4:25 pm
看起来好像是 gen_event要发送的进程不存在.
[Reply]
谢谢余先生,我的环境是WINDOWS,所以先要运行erl -boot start_sasl,问题就解决了。但现在的问题是WINDOWS下运行eerl -boot start_sasl后emacs平台就没有了。我想请教:既保持emacs环境又能带参数的运行erl?
[Reply]
@zfz
-boot start_sasl 和 -boot start_clean(默认的) 的区别是多启动了sasl应用.
所以你可以在运行你的程序前运行
application:start(sasl).
效果是一样的.
[Reply]
@Atlas
这个我个人感觉是你没用对mnesia, 你的瓶颈在锁和事务交互上了.
[Reply]
client_connect(Id, Pw) ->
case gen_tcp:connect(“localhost”,6720,[binary,{packet,4}]) of
{ok, Socket} ->
%先发送认证消息
case login_info(Socket,Id,Pw) of
{ok} ->
io:format(“pass login_info~n”),
send_msg(Socket);
{einval} ->
{false_in_login}
end;
{error,Why} ->
{Why}
end.
%向服务器发登陆认证
login_info(Socket,Id,Pw) ->
Msg = {login,Id,Pw},
case gen_tcp:send(Socket, term_to_binary(Msg)) of
ok ->
% io:format(“login_info ok:~p~n”,[Self]),
io:format(“send ok:~n”),
case gen_tcp:recv(Socket,0) of
{ok,B} ->
io:format(“recv ok:~n”),
{ok};
%在这里套接字出错Why变为einval
{error,Why} ->
{Why}
end;
{error,closed} ->
closed
end.
%%%%%%%%%%%%%%%%%%%%%
%服务器在这里最后响应,同时也是问题出现的地方
loop(Socket) ->
io:format(“loop~n”),
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
%处理信息,发送信息到client_manager让其处理向客户端发送消息事件
%处理两种请求,一种登陆认证,另一种是消息传输
io:format(“loop ok~n”),
case binary_to_term(Data) of
{login,Id,Pw} ->
%认证登陆
io:format(“in loop~n”),
%在这里出现了问题
gen_tcp:send(Socket,term_to_binary({ok})),
io:format(“after send~n”),
{login_check_now};
Data_send ->
io:format(“in loop no:~n”),
client_manager ! {data,Data_send},
loop(Socket)
end;
{error, closed} ->
%不清错失败原因和出处时的处理方式,(待处理)
client_manager ! {disconnect, Socket},
{error, closed}
end.
现在问题在于gen_tcp:send(Socket,term_to_binary({ok}))上调用的话在login_info那里受到的einval的套接字出错的问题
现在不知道问题出现在哪里?不知道能怎么样修改,谢谢余丰大哥了
[Reply]
Yu Feng Reply:
April 30th, 2010 at 11:24 am
{login_check_now}; 后loop 中止, 因为看不到你的其他代码, 但是基本上是由于loop中止, 进程退出。 进程退出的时候, 会关闭所拥有的port. gen_tcp是个port.所以你的socket就会被服务端关闭。
[Reply]
谢谢余先生,现在还是有一些问题,一、application的相关技术文档哪儿有?二、错误日志配置文件又如何加载上去?如:erl -boot start_sasl -config elog3中的sasl应用已经可用application启动了,但elog3错误日志配置如何启动?
[Reply]
@zfz
这些文档otp的随机带的文档里面写的非常清楚的,你可以先好好读下!
[Reply]
请教:在WINDOWS环境下错误日志配置文件elog3.config如何加载启用?
[Reply]
@zfz
不明白你的问题是什么? 但是我建议不要在windows下开发。你可以用virtualbox安装个ubuntu来使用,windows不大适合otp开发。
[Reply]
感谢!我的问题是:《Erlang程序设计》一书中第十八章很多地方用到SASL的配置,主要是错误日志的配置,如书中P273,日志在shell和循环日志中同时输出的配置文件elog3.config,但如何在WINDOWS环境下加载启用?我现在不是用于开发而是用于教学。你讲的方法我会试试。
[Reply]
@zfz
Erlang是完全平台移植的,这意味所有的命令行参数和使用习惯都是一样的,除了平台相关的东西,比如说文件路径。 你的疑惑是估计是这样的: unix平台下用的文件路径如/var/log/xxx.log 在windows下应该改成如c:\\var\\\log\\xx.log
[Reply]
一定叨唠了。但还得叨唠。
在WINDOWS下,“运行”命令行:
erl -boot start_sasl -config elog3
出错:{“could not start kernel pid”,application_controller,”error in config file\”./elog3.config\”(none):configuration file not found”}
可是在 e:\erl5.7.3\bin 下有 elog3.config 文件。因为错误信息一闪而过,今天才看清。
请教问题出在哪儿?
[Reply]
@zfz
./elog3.config 不是写的很明白吗, 是在当前目录下读呀。。。
[Reply]
感谢!“当前目录读取”:只把erl启动前加上e:\erl5.7.3\bin便可。既WINDOWS下“运行”命令行为:
e:\erl5.7.3\bin erl -boot start_sasl -config elog3
在此命令行中,参数-boot start_sasl 可在>下运行:
>application:start(sasl).
来取代。现在的问题是:命令行参数
-config elog3
可用什么来代替?
因为命令行开启的Erlang平台没了emacs编辑开发平台。
[Reply]
@zfz
抱歉,确实不明白你的emacs和erlang有什么关系。
干吗说, emacs平台没了?
[Reply]
启动Erlang我认为有两种方式。
一是在WINDOWS平台上:开始->运行->打开,键入
e:\erl5.7.3\bin erl -boot start_sasl -config elog3
就进入了Erlang环境。此时-boot start_sasl和-config elog3都起到了作用。仅有ESell,编辑Erlang程序很不方便。
二是启动emacs后:file->open file,选择一个.erl文件,在emacs上就有一个Erlang菜单项。此时可编辑Erlang程序、编译Erlang程序,也有Erlang的Sell。第一种方式命令行中的参数-boot start_sasl 可在>下运行:
>application:start(sasl).
来取代。我的问题是:现在希望第一种方式命令行参数
-config elog3
也起作用,那么可用什么来代替呢?
也就是:第一种方式开启Erlang平台,命令行参数-boot start_sasl和-config elog3都能起到作用,可是没有了emacs环境,编辑程序很不方便。第二种方式开启Erlang平台,编辑、编译、Shell集成了,很方便,命令行参数-boot start_sasl可用>application:start(sasl).来实现,可命令行参数-config elog3又能用什么来实现?
[Reply]
Mr Yu Feng 你好~我最近在研究聊天室方面的,我看到有个聊天室做到了一个房间同时有1W多人的,
ejabberd貌似说支持单台服务器3000-5000,但是它好像不支持聊天室或者群组这种形式。。
我想问问用erlang做聊天室可不可以做到单个房间1W人啊?先谢谢了。。。
现在是不是有比书店那些书上写的其他高效的方法啊?
[Reply]
Yu Feng Reply:
May 31st, 2010 at 1:10 pm
你从哪里看来的数字ejabberd才这么点? 这个数字如果是活跃的还差不多, 如果算在线的话, × 10差不多。 erlang的IO是能强大的。 你说的书上,不是你看了programing erlang就开始打算做这个系统吧?
[Reply]
想照着VC 6.0书上的例子做得~呵呵
它上面是先把消息发到服务器,然后服务器转发到list里面
Yu Feng老大还有其他高效点的方法吗?
[Reply]
Yu Feng Reply:
May 31st, 2010 at 11:38 pm
看点书就做这种项目个人感觉很不靠谱!
[Reply]
Yu Feng老大,那ejabberd对群组的支持好不好啊?
我在GOOFLE上搜索了下貌似只有一个客户端的软件支持~??
[Reply]
余老师,您好!
我最近在研究tsung。遇到了一个问题,请教下您。
firefox设置了localhost:8090代理,开启tsung recorder后,在录制的session里没有内容。
[Reply]
@武彻
这个问题已经解决了。是1.2.2的版本有问题。我用1.3.1就不存在此问题
[Reply]
@zfz
我也遇到同样的问题,貌似参数不对?
man上是这样写的
set_alarm(alarm())
Types alarm() = {AlarmId, AlarmDescription}
AlarmId = term()
AlarmDescription = term()
Sets an alarm with id AlarmId . This id is used at a later stage
when the alarm is cleared.
[Reply]
弱弱地问一句ND是什么公司啊?
[Reply]
Yu Feng Reply:
September 10th, 2010 at 10:35 am
ND=网龙 上市的游戏公司。
[Reply]
博主,有一问题请教。
我要用mnesia存放一些,持久化的用户数据。可是,用户比较多,大概1M。然后,每个用户又会有很多物品,每个用户的每一物品有一个记录。这样我打算用这样的schema来存储我上面提到的业务,-record(user, {user_id, user_info, …}). -record(items, {item_id, user_id, item_info}).
可是众所周知,mnesia有4G的限制。所以,我打算用table name mapping的方法来存放,具体是用list_to_atom(lists:concat(['user_', erlang:phash(user_id, 100)])),来作为table的名字。然后我的问题是:
1 -
[Reply]
博主,有一问题请教。
我要用mnesia存放一些,持久化的用户数据。可是,用户比较多,大概1M。然后,每个用户又会有很多物品,每个用户的每一物品有一个记录。这样我打算用这样的schema来存储我上面提到的业务,-record(user, {user_id, user_info, …}). -record(items, {item_id, user_id, item_info}).
可是众所周知,mnesia有4G的限制。所以,我打算用table name mapping的方法来存放,具体是用list_to_atom(lists:concat(['user_', erlang:phash(user_id, 100)])),来作为table的名字。然后我的问题是:
1 – mnesia可以支持大概2000个table的schema吗?在性能上会出现什么瓶颈或问题或side effect吗?
2 – 我自己手动这样mapping的效果好,还是用mnesia fragment table的效果好呢?貌似,我这样的mapping查找起来的时候,比fragment要快。可是就是不知道容错和分布式性能上怎么样?
[Reply]
Yu Feng Reply:
September 7th, 2010 at 3:22 pm
1. 2000个表太多了点。
2. 最好用mnesia自己的fragment
3. dets的问题未来我觉得会引入新的更强的替代品,官方在考虑这个事情。
[Reply]
@Yu Feng
看了mnesia_frag的源代码,原来他的所做的和我所想的方法几乎是差不多的,而且也有foreign_key,那么我直接用mnesia 自带的 fragmant 就好了~~谢谢,大牛指点~~
[Reply]
Yu Feng Reply:
September 10th, 2010 at 10:07 am
不客气的,分片是mnesia很重要的一个特性。
[Reply]
@Yu Feng
哇,好公司啊,在广州有没有分部啊?
[Reply]
为何从JAVAEYE搬出来,还有你的“推”,我如何才能访问?
[Reply]
Yu Feng Reply:
September 19th, 2010 at 1:46 pm
不好意思,给你造成麻烦。 twitter要翻墙,我还经常在Buzz上嘀咕,从javaeye上出来主要原因是我买了虚拟主机了,能够比较大力用起来。。。:)
[Reply]
你好 余峰,学习erlang有一段时间了,现在正在做一个项目,我想请教一个很实际的问题,我们知道erlang是面向并发的,进程间通过消息来通讯,但是收到的消息太多的话,对队列的处理会成为系统的瓶颈,尤其当在对消息要做很多处理的时候(比方说要访问数据库等),我想问一下,这个问题是您一般怎么解决的?
我的做法是:将服务进程拷贝成n个,然后将消息均衡的发到各个服务进程上,但这样会麻烦些,还会增加服务进程间通讯 所以我还是想听听您的方法 谢谢 多谢!
[Reply]
Yu Feng Reply:
October 18th, 2010 at 12:35 am
这个做法是一种不错的选择, n最好等于调动期的个数. 还有其他方法比如驱动,或者nif绕过系统的公平调动,这样你的一个进程就可以服务大量的进程.
[Reply]
您好,我一般在非LINUX平台工作,一般在AIX、HP-UX、SOLARIS上,可是我发现在这些平台上完整地安装Erlang是很困难的,不知道为何Erlang不提供这些平台的安装包。。。能给我一些建议吗?
一般工业上很少选择Linux平台的。
[Reply]
一般情况下编译不过的包都是附加的包,你可以直接在编译不过的库的目录下touch SKIP, 忽略编译这个库。
[Reply]
才拜读了《C1000K高性能服务器构架技术》,版主太猛了。学习,学习。。。。。。。
不知道有没有PPT可以直接下载,方面留存啊。
[Reply]
晕死,找到了
[Reply]
@Yu Feng
我的服务器进程还是处理大量erlang语言方面的东西,比如说要访问ets表,这些要用驱动、nif来做需要丰富的 c经验,(况且可能吗?用nif来访问ets(混乱)),erlang提供了一个进程优先级,这个对解决这个等级的问题有用吗?
[Reply]
进程优先级只是解决进程优先调度的问题,但是还是遵守公平调度的原则,换句话说没用。
[Reply]
你好,我是初学者,想问一下,如何用gen_server和supervious创建监控树,实现分布式名字服务器
[Reply]
Yu Feng Reply:
November 22nd, 2010 at 9:45 am
gen_server支持{global, name}用这个就是分布式名字服务器
[Reply]
Wang Reply:
November 23rd, 2010 at 5:42 pm
哦,谢谢了。能帮我写下简单的代码吗?不会啊。
[Reply]
You’ve wrote a very excellent entry.
If it’s fine with you, I would like to request permission to use your article as it fits to my topic. I will be happy to negotiate to pay you or hire you for this.
With Regards from
Republic Polytechnic
[Reply]
经常关注你的博文,提个建议哈:更新地太慢。
能不能快点,满足一下读者的愿望。。。。
[Reply]
Yu Feng Reply:
March 7th, 2011 at 10:23 am
最近更新确实有点慢,公司事情比较多。。。
[Reply]