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 进程描述符

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 (推荐印象笔记),好记性不如烂笔头

你可能感兴趣的:(Erlang服务器新人指南)