MMO Server From Scratch(0) - Introduction



引言

一直想做 MMORPG 游戏,一直在学习,开一个系列把服务器开发的过程记录下来。

一直以来搜索了许多资料,但是都支离破碎,缺少一个完整详细的概念,要么就是只对架构泛泛而谈,要么就是对某个算法的纸上谈兵。我作为纯粹的业外人士,这些抽象的资料基本无法对我形成特别重要的指导作用,所以我还是得亲自尝试重构所有内容。

基本构想

查阅过众多资料之后,我对 MMORPG 服务器的整体架构有了一个基本的概念。恰好之前深入了解了一下 ErlangErlangElixirElixir,它们天然支持高并发的特性以及监督树和尽早崩溃的思想深深打动了我,所以我决定用 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
                                        |---------------|
  1. auth_server - 用户登录游戏用
  2. auth_manager - 用于管理 auth_serverauth_server,做负载均衡
  3. gate_server - 网关服务器,用于接受客户端的tcp连接,加解密消息,并转发流量
  4. gate_manager - 用于管理 gate_servergate_server,做负载均衡
  5. agent_server - 用于执行非场景的用户逻辑(待定)
  6. agent_manager - 用于管理 agent_serveragent_server,做负载均衡
  7. scene_server - 用于执行场景逻辑,如 AOI、地图区块管理等
  8. world_server - 用于统筹管理 scene_serverscene_server 的分配,以及处理世界级逻辑
  9. data_server - 数据库内存存储节点,用来对其他服务器提供服务
  10. data_store - 数据库持久化存储节点,用来保存数据库数据
  11. data_contact - 数据联系节点,用来联系各个数据库节点,同时为其他服务器分配数据库节点,做负载均衡
  12. beacon_server - 灯塔服务器,用于联系各个服务器,交换资源,在节点间建立连接

数据库 打算采用 MnesiaMnesia,天然具备集群能力,可以动态横向扩展。

客户端连接打算采用 one process per clientone process per client,充分利用 BEAM 的轻量级线程能力,提高逻辑编写效率。当然这些都是我猜的,到时候实际性能如何还未可知。

项目地址

https://github.com/dyzdyz010/ex_mmo_cluster

因为找不到同好,只有我一个人在孤军奋战,不知能坚持多久,但是希望能有人一起。且行且珍惜吧。