Erlang服务器新人指南

写在开篇:

见贤思齐焉,见不贤而自省

三人行,必有我师焉

老员工做的并不一定是最好的,一定要时刻以最高的标准要求自己

多与组内人员进行交流,快速融入团队,提升自己的综合能力

独立思考、多归纳总结(一份耕耘一份收获)

端正做事的态度,虚心细心、做一个活好的程序员

整体结构

Erlang语言篇

代码规范

工具篇

Erlang 语言篇

一、一些必须深究的基础概念

Erlang 基本数据类型:atom, list, tuple, dict, maps, set, binary, record, Port, Pid

基本数据类型

官网数据类型介绍

Erlang 常用数据结构实现

原子一般用来做枚举、函数返回值

list 列表和字符串等,可以表示各种不同数据类型的有序集合, 注意list的某些操作的复杂度

tuple 个数固定的元组, Record的内部实现也是使用的tuple

record 类似c语言的struct, 某类数据的一个集合体;比如 #user{}等

常存在于ets中,作为全局的数据结构

dict 字典、maps(类似于hashmap)

binary Erlang二进制,可以直接使用模式匹配,效率很高

pid 进程描述符<A.B.C>

Printed process ids < A.B.C > are composed of 6:

A, the node number (0 is the local node, an arbitrary number for a remote node)

B, the first 15 bits of the process number (an index into the process table) 7

C, bits 16-18 of the process number (the same process number as B) 7

Ports (Erlang对socket和网络io的底层封装)

Ports provide the basic mechanism for communication with the external world, from Erlang's point of view. They provide a byte-oriented interface to an external program. When a port has been created, Erlang can communicate with it by sending and receiving lists of bytes, including binaries.

Ports and Ports Drivers

C_Ports

Term Sharing

数据结构使用时注意事项:

尽可能简单,作为代码参数或者进程消息的时候,需要考虑是否涉及到内存拷贝,尽量减少内存拷贝和网络拷贝

Erlang Process

进程如何创建、如何执行、如何结束的

进程字典(有副作用)、进程信息如何查看、何时需要垃圾回收

进程的调度、并发、进程间通信(Pid ! {msgTag, args})

进程的瓶颈、开发中注意事项(gen_server应该注意什么)

抓取Erlang进程运行时信息

Erlang 常用网站:

otp官网

erlang官网带搜索文档

Learn you some Erlang

坚强2002的博客

常见编译错误

错误和异常

erlang运行时错误


二、代码规范

良好的代码规范是一个合格产品成功的一半
Erlang编程规范
翻译注释版

注释

文档注释

%%% This is handler of user_login

%%% Created: 2016-12-03

%%% author: Jemes Bond

函数API注释

务必包含简要功能描述和返回值类型

%% Function: make a unique 64bit positive integer

%% Ret : N -> is_integer(N), N > 0

make_unique_64bit_id() ->

N = xxx.

模块设计和划分

充分理解策划的需求,并且能够抽象出功能架构和其它各个模块的交互

代码结构简单清晰,已与扩展(高内聚、低耦合)

单个函数不超过50行、缩进不超过三次

学会拆解功能单元、提炼基本的工具类函数

每个函数只做一件事情

设计模式六大原则

快速理解-设计模式六大原则

设计模式虽然是主要是面向对象的,但是任意语言都需要良好的设计模式

Erlang的一个文件module就相当于面向对象的一个类提供的对外接口

对应单个函数而言,仍然遵循API常见的设计原则:

对于给定的输入,应该返回期待的输出或者抛出异常

参数尽量在1-5 之间,不要过多的参数,结构过大的参数

返回值在注释中声明清楚, erlang没有return语句,当函数嵌套很深的时候,

可以让调用者一下子就知道返回类型; 并且减少后期维护的难度和bug

尽可能少的使用进程字典

进程字典的优点是访问效率最快

但是进程字典破坏了函数式编程的环境,导致给定的输入在不同的进程字典情况下,

出现的结果不是固定的这个副作用

B = f(A).

良好API设计的10个原则

日志

日志是我们自己的审计账本,sgame已经上线、出了问题必须有日志可查。

目前日志分为两大类:

上报sdk的通用oss日志

这部分日志主要记录了玩家登录、在线、物品、金钱流向等, 可以通过hue系统查看

game自己的日志

记录关键业务流程、关键数据的日志,一般存在logs目录下, 100个文件顺序替换

1) 日志文件分类 (game_svr.log charge.log crash.log battle.log task.log vehicle.log),

不同的业务尽量放在不同的文件中,防止某类日志过多,把重要系统的日志冲掉

2) 日志的级别:

线上的日志级别是info/error/warn

如果是内网调试,且使用make debug编译,可以打印debug日志

高频的日志输出一定不要出现在线上

日志一定要有意义,包含必要的玩家信息和当时的现场信息

日志尽量简洁

关键业务进出一定要有日志(尤其是涉及到玩家购买和修改多处数据的事务类)

养成测试的好习惯

一个一流的程序员首先是一个很好的QA,知道自己的代码在哪些情况下可能出现问题,并且尽早的预防

底层模块一定要严格的单元测试、分支测试、白盒测试、黑盒测试、边界测试、非法输入测试,把一切可能的错误尽早的暴露

以及可能的性能压力测试

Erlang的大部分测试都可以写在模块后面,然后在终端模式下直接运行即可。

github第三方库的学习

我们代码中也用到了很多第三方库,都在server/3rd目录下,这些库很多其实并不是特别复杂,但是使用非常广泛,很多可以借鉴的东西,包括一些开源软件的规范等

mochiweb 一个使用非常多的轻量级http服务器库。

代码中充值、聊天、gmtools等均有使用

Erlang MySQL driver

Erlang protobuffer Google Protobuffer的Erlang实现,Sgame前后端通讯协议和mysql Binary序列化都是使用的Protobuffer

其他 json/ geodata2/ log4erl / entop-master等 自行查阅

Erlang资源大全中文版

erlang有哪些好用的库


三、工具篇

内网软件站: \192.168.1.150\lilith_share[Common | server] 目录基本涵盖了常用软件,或者通过外网下载最新版,然后拷贝

目前 SGAME使用的otp版本为 19.1

代码编辑器

vim 纯键盘跨平台编辑器,只需要熟悉几个常用的命令即可操作

[Sublime+samba for windows]

notepad++ 看各种代码格式、以及转换格式等

代码合并比较: Beyond Compare

代码编译调试环境 linux

SecureCRT远程登录(替代方案 putty等)

常用shell命令:

sed awk shell

查找类 ag/grep/find

网络相关:

10 个你需要了解的 Linux 网络和监控命令

Linux常用网络命令介绍

快速成长的建议:

最大可能行的利用Linux的Manual:

man man

man grep

erl -man erlang/erl/lists/maps/ets/application/gen_server

google/百度/知乎/github/stackoverflow/

记笔记或者写blog (推荐印象笔记),好记性不如烂笔头

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容