在12/20的Erlang开发者大会上,西山居的陈杰(bitcowboy)的演讲《网游服务端寻路》给我的印象非常深刻。他通过一个网游服务器寻路的案例,给大家讲述了在算法,架构,cache,并发编程及借鉴了Erlang的一些先进思路的各种经验及体会。
- 算法,运营对寻路的要求比普通算法性能要高100倍。2D/3D中分别如何设计算法达到性能要求。
- 稳定性
- 将独立的模块封装成单独的进程。
- 进程间通讯(IPC)使用TCP,为什么使用TCP而不是其他更高效的本地IPC方式?一方面因为大部分项目都有现成稳定的TCP模块,另外一方面更容易将一台服务器拆分到多个服务器,程序完全不用修改。
- 进程死掉怎么办?进程调用长时间不返回怎么办?
- 面对3的问题,旁边有另外一游戏架构设计师更是提到他们采取更激进的做法,将所有的进程做成单任务式的,完成任务就结束。分配任务线程为每个任务开新进程。有点象用Erlang中的process或Java中线程池的做法。
- 一种多进程访问共享内存不需要加锁的设计模式,如图所示。
(Figure: 来源陈杰PPT, 作者为陈杰)
- 调度进程给寻路进程分配任务,每次一个任务。
- 寻路进程更新cache为了避免并发访问,先只写入到 local cache
- 如果所有寻路进程空闲,调度进程会通知其中1个寻路进程将local cache同步到全局cache
- 如果一个寻路进程指定的时间没有返回,可简单kill之
- 此模式适合更多使用场合
- 一种热升级模块的设计模式,简述:新进程使用新端口启用->通知调度启用新端口->调度程序将请求转向新端口->老模块完成手头工作后,被调度告知自动结束。
总的说来,陈杰的演讲反应非常热烈,旁听参与的听众讨论也非常热烈,因为本人不是演讲者,很多细节没法在这里深入表达,PPT中也只是表达了现场的部分观点。
另外这个演讲是以一个小组讨论的形式进行的,这样演讲者和听众的思路非常自由,比单独站台上讲相比可以进行更深入的交流。所以陈杰总是提醒大家,我们还是把这个演讲稿先讲完吧。
对,我们也先把演讲稿看完把,Google Docs 在线预览版:网游服务端寻路