搭建即时通讯Web端高性能分布式IM聊天服务器

Posted wecloud1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建即时通讯Web端高性能分布式IM聊天服务器相关的知识,希望对你有一定的参考价值。

Pomelo是来自网易公司的基于 Node.js 的高性能、分布式游戏服务器框架。它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发。Pomelo 不但适用于游戏服务器开发, 也可用于开发高实时 Web 应用(如IM聊天应用、消息推送服务等),它的分布式架构可以使 Pomelo 比普通的实时 Web 框架(如Socket.io、sockjs等)扩展性更好。

 

Pomelo 特性

    快速、易上手的游戏开发模型和api;
    高可伸缩的多进程架构, 支持MMO的场景分区和其它各类分区策略;
    方便的服务器扩展机制,可快速扩展服务器类型和数量;
    方便的请求、响应、广播、服务器通讯机制, 无需任何配置;
    注重性能,在性能、可伸缩性上做了大量的测试、优化;
    提供了较多扩展组件,包括游戏开发常用的库和工具包;
    提供了完整的MMO demo代码(客户端html5),可以作为很好的开发参考;
    基于socket.io开发,支持socket.io支持的多种语言客户端。

为什么使用pomelo?

高并发、高实时的游戏服务器的开发是很复杂的工作。跟 web 应用一样, 一个好的开源容器或开发框架可以大大减少游戏开发的复杂性,让开发变得更加容易。遗憾的是目前在游戏服务器开发领域一直没有太好的开源解决方案。 pomelo 将填补这个空白, 打造一款完全开源的高性能(并发)游戏服务器框架。

pomelo 的优势有以下几点:

    架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, node.js 的网络 io 优势提供了高可伸缩性。
    使用非常容易, 开发模型与web应用的开发类似,基于 convention over configuration 的理念, 几乎零配置, api 的设计也很精简, 很容易上手。
    框架的松耦合和可扩展性好, 遵循 node.js 微模块的原则, framework 本身只有很少的代码,所有 component、库、工具都可以用 npm module 的形式扩展进来。任何第三方都可以根据自己的需要开发自定义 module。
    提供完整的开源 MMO 游戏 demo 参考,一个超过1万行代码的游戏 demo,使开发者可以随时借鉴 demo 的设计与开发思路。

Pomelo是一款游戏服务器框架, 可以实现IM聊天?

Pomelo是游戏服务器框架,本质上也是高实时、可扩展、多进程的应用框架。除了在library部分有一部分游戏专用的库,其余部分框架完全可用于开发高实时web应用。而且与现在有的node.js高实时应用框架如derby、socketstream、meteor等比起来有更好的可伸缩性。

对于大多数开发者而言,node.js的入门应用都是一个基于socket.io开发的普通聊天室, 由于它是基于单进程的node.js开发的, 在可扩展性上打了一定折扣。例如要扩展到类似irc那样的多频道聊天室, 频道数量的增多必然会导致单进程的node.js支撑不住。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

 

而基于pomelo框架开发的聊天应用天生就是多进程的,可以非常容易地扩展服务器类型和数量。

一个基于socket.io的原生聊天室应用架构, 以 uberchat 为例。

服务端由单个node.js进程组成的chat server来接收websocket请求。

它有以下缺点:

    可扩展性差:只支持单进程的node.js, 无法根据room/channel分区, 也无法将广播的压力与处理逻辑的压力分开。
    代码量多:基于socket.io做了简单封装,服务端就写了约430行代码。
用pomelo来写这个框架可完全克服以上缺点。

在这个架构里, 前端服务器也就是connector专门负责承载连接, 后端的聊天服务器则是处理具体逻辑的地方。

这样扩展的运行架构具有如下优势:

    负载分离:这种架构将承载连接的逻辑与后端的业务处理逻辑完全分离,这样做是非常必要的, 尤其是广播密集型应用(例如游戏和聊天)。密集的广播与网络通讯会占掉大量的资源,经过分离后业务逻辑的处理能力就不再受广播的影响。
    切换简便:因为有了前、后端两层的架构,用户可以任意切换频道或房间都不需要重连前端的websocket。
    扩展性好:用户数的扩展可以通过增加connector进程的数量来支撑。频道的扩展可以通过哈希分区等算法负载均衡到多台聊天服务器上。理论上这个架构可以实现频道和用户的无限扩展。

代码说明:

    game-server: 游戏服务器,所有的游戏服务器逻辑都放在这个目录下,以文件app.js作为入口,运行游戏的所有逻辑和功能。
    web-server:游戏用到的web服务器(包括登录逻辑)、客户端的js、css和静态资源等。
    config: 游戏服务器的所有配置信息。配置信息以JSON格式定义,包含有日志、master服务器和其他服务器的配置信息。该目录还可以放置其它配置信息,包括对数据库配置信息、地图信息和数值表等信息进行定义。
    logs: 存放游戏服务器所有日志信息。
    shared: 存放game-server与web-server共用代码。


初始化&&测试:

    安装npm包:sh npm-install.sh
    启动游戏服务器:cd game-server && pomelo start
    启动web服务器:cd web-server && node app.js


web服务器中包含pomelo客户端,当web服务器启动后,客户端自动加载到浏览器中。客户端通过websocket向游戏服务器发送请求,连接成功后服务端通过pomelo向客户端推送消息。

聊天室的逻辑包括以下几个部分

    用户进入聊天室:这部分逻辑负责把用户信息注册到session,并让用户加入聊天室的channel。
    用户发起聊天: 这部分包括了用户从客户端发起请求,服务端接收请求等功能。
    广播用户的聊天: 所有在同一个聊天室的客户端收到请求并显示聊天内容。
    用户退出: 这部分需要做一些清理工作,包括session和channel的清理。

以上是关于搭建即时通讯Web端高性能分布式IM聊天服务器的主要内容,如果未能解决你的问题,请参考以下文章

基于Netty,搭建高性能IM即时通讯集群

如何搭建一个自己的IM即时通讯聊天软件?

如何用WebSocket打造Web端IM即时通讯聊天

为自己搭建一个分布式 IM(即时通讯) 系统

IM 即时通讯实战:环信Web IM极速集成,实现发送消息

实现iOS端即时通讯开发的高性能消息推送