MMO Server From Scratch(0) - Introduction
引言
一直想做 MMORPG 游戏,一直在学习,开一个系列把服务器开发的过程记录下来。
一直以来搜索了许多资料,但是都支离破碎,缺少一个完整详细的概念,要么就是只对架构泛泛而谈,要么就是对某个算法的纸上谈兵。我作为纯粹的业外人士,这些抽象的资料基本无法对我形成特别重要的指导作用,所以我还是得亲自尝试重构所有内容。
基本构想
查阅过众多资料之后,我对 MMORPG 服务器的整体架构有了一个基本的概念。恰好之前深入了解了一下 ErlangErlang 和 ElixirElixir,它们天然支持高并发的特性以及监督树和尽早崩溃的思想深深打动了我,所以我决定用 ElixirElixir 实现服务器的各个部件。
我的想法中服务器的大致架构如下:
1
|----------|
2
| client | x N
3
|----------|
4
5
-----------------------------------------|-----|----------------------------------------------
6
7
|-------------| |--------------| |-------------| |--------------|
8
| auth_server | x N | auth_manager | x 1 | gate_server | x N | gate_manager | x 1
9
|-------------| |--------------| |-------------| |--------------|
10
11
-----------------------------------------|-----|----------------------------------------------
12
13
14
|--------------| |---------------|
15
| agent_server | x N | agent_manager | x 1
16
|--------------| |---------------|
17
18
-----------------------------------------|-----|----------------------------------------------
19
20
21
|-------------------| |--------------|
22
| scene_server(TBD) | x N | world_server | x 1
23
|-------------------| |--------------|
24
25
-----------------------------------------|-----|----------------------------------------------
26
27
|--------------| |------------| |--------------|
28
| data_service | x N | data_store | x N | data_contact | x 1
29
|--------------| |------------| |--------------|
30
31
-----------------------------------------|-----|----------------------------------------------
32
33
|---------------|
34
| beacon_server | x 1
35
|---------------|
1
|----------|
2
| client | x N
3
|----------|
4
5
-----------------------------------------|-----|----------------------------------------------
6
7
|-------------| |--------------| |-------------| |--------------|
8
| auth_server | x N | auth_manager | x 1 | gate_server | x N | gate_manager | x 1
9
|-------------| |--------------| |-------------| |--------------|
10
11
-----------------------------------------|-----|----------------------------------------------
12
13
14
|--------------| |---------------|
15
| agent_server | x N | agent_manager | x 1
16
|--------------| |---------------|
17
18
-----------------------------------------|-----|----------------------------------------------
19
20
21
|-------------------| |--------------|
22
| scene_server(TBD) | x N | world_server | x 1
23
|-------------------| |--------------|
24
25
-----------------------------------------|-----|----------------------------------------------
26
27
|--------------| |------------| |--------------|
28
| data_service | x N | data_store | x N | data_contact | x 1
29
|--------------| |------------| |--------------|
30
31
-----------------------------------------|-----|----------------------------------------------
32
33
|---------------|
34
| beacon_server | x 1
35
|---------------|
1
|----------|
2
| client | x N
3
|----------|
4
5
-----------------------------------------|-----|----------------------------------------------
6
7
|-------------| |--------------| |-------------| |--------------|
8
| auth_server | x N | auth_manager | x 1 | gate_server | x N | gate_manager | x 1
9
|-------------| |--------------| |-------------| |--------------|
10
11
-----------------------------------------|-----|----------------------------------------------
12
13
14
|--------------| |---------------|
15
| agent_server | x N | agent_manager | x 1
16
|--------------| |---------------|
17
18
-----------------------------------------|-----|----------------------------------------------
19
20
21
|-------------------| |--------------|
22
| scene_server(TBD) | x N | world_server | x 1
23
|-------------------| |--------------|
24
25
-----------------------------------------|-----|----------------------------------------------
26
27
|--------------| |------------| |--------------|
28
| data_service | x N | data_store | x N | data_contact | x 1
29
|--------------| |------------| |--------------|
30
31
-----------------------------------------|-----|----------------------------------------------
32
33
|---------------|
34
| beacon_server | x 1
35
|---------------|
1
|----------|
2
| client | x N
3
|----------|
4
5
-----------------------------------------|-----|----------------------------------------------
6
7
|-------------| |--------------| |-------------| |--------------|
8
| auth_server | x N | auth_manager | x 1 | gate_server | x N | gate_manager | x 1
9
|-------------| |--------------| |-------------| |--------------|
10
11
-----------------------------------------|-----|----------------------------------------------
12
13
14
|--------------| |---------------|
15
| agent_server | x N | agent_manager | x 1
16
|--------------| |---------------|
17
18
-----------------------------------------|-----|----------------------------------------------
19
20
21
|-------------------| |--------------|
22
| scene_server(TBD) | x N | world_server | x 1
23
|-------------------| |--------------|
24
25
-----------------------------------------|-----|----------------------------------------------
26
27
|--------------| |------------| |--------------|
28
| data_service | x N | data_store | x N | data_contact | x 1
29
|--------------| |------------| |--------------|
30
31
-----------------------------------------|-----|----------------------------------------------
32
33
|---------------|
34
| beacon_server | x 1
35
|---------------|
- auth_server - 用户登录游戏用
- auth_manager - 用于管理
auth_serverauth_server,做负载均衡 - gate_server - 网关服务器,用于接受客户端的tcp连接,加解密消息,并转发流量
- gate_manager - 用于管理
gate_servergate_server,做负载均衡 - agent_server - 用于执行非场景的用户逻辑(待定)
- agent_manager - 用于管理
agent_serveragent_server,做负载均衡 - scene_server - 用于执行场景逻辑,如 AOI、地图区块管理等
- world_server - 用于统筹管理
scene_serverscene_server的分配,以及处理世界级逻辑 - data_server - 数据库内存存储节点,用来对其他服务器提供服务
- data_store - 数据库持久化存储节点,用来保存数据库数据
- data_contact - 数据联系节点,用来联系各个数据库节点,同时为其他服务器分配数据库节点,做负载均衡
- beacon_server - 灯塔服务器,用于联系各个服务器,交换资源,在节点间建立连接
数据库 打算采用 MnesiaMnesia,天然具备集群能力,可以动态横向扩展。
客户端连接打算采用 one process per clientone process per client,充分利用 BEAM 的轻量级线程能力,提高逻辑编写效率。当然这些都是我猜的,到时候实际性能如何还未可知。
项目地址
https://github.com/dyzdyz010/ex_mmo_cluster
因为找不到同好,只有我一个人在孤军奋战,不知能坚持多久,但是希望能有人一起。且行且珍惜吧。