如何打造一个高性能、高并发的消息推送系统

来源:互联网 发布:平价好用化妆品知乎 编辑:程序博客网 时间:2024/04/28 19:41

前言

女友常常勉励我:“要有共享、开放、开源的现代互联网思维,自己的经验要多总结,发到博客论坛上什么的。”之前也有脑洞打开,想分享一些个人在工作之中、工作之外的所思所得,可始终不能持久。这次想把本次参与开发的项目记录、分享出来,希望能持之以恒。


part 1 即时通讯与消息推送

  我想对于这个年代的人来说,对即时通讯已经完全不陌生了吧,qq、微信、陌陌等等,它的特点在于消息的即时性,很多时候,我们的业务场景都需要一个im工具来实现系统之间用户的即时交流,或者将到达服务端的消息推送给用户终端(ios、android、web等客户端)。传统的im一般都基于tcp协议,在服务端通过socket建立一个长链接,这个连接你可以拦截每次建立连接时的session,通过session来标示不同用户,这样就可以用websocket来做中转站,将信息发给指定用户。这样的设计可以简单实现服务端和客户端的全双工通信,用户数量在几千甚至上万的时候,一台4/8g内存的服务器来做消息的转发代理,应该是可以胜任的。但是随着用户量的增多,达到几百万、上千万、上亿级别时,这种通讯模式只是一种玩具,而且这种建立长连接的方式,太过耗用服务器资源,且每次发送一条消息出去,都无法避免去遍历循环当前在线的用户session记录,找到匹配就发出,这样太过耗时。

消息推送指服务器主动往指定用户发送消息,客户端一般都有个监听器来监听消息的状态,这种技术现在广泛运用于手机应用。如果你不想自己去设计开发一套推送的机制、甚至是通信协议,有现成的可以用甚至性能很好的推送服务,那么我推荐使用极光推送来实现需求。

其实粗略来讲,即时通讯只是消息推送只是一种实现,比如你可以用激光推送等第三方产品,很轻易的就可以实现点对点、甚至点对多的消息收发。但是在用户需求很个性化,比如我要对用户的聊天内容进行监控,涉及到敏感的关键字不让消息推送出去、或者我要对开通会员的用户给予“尊贵的身份”:相比于免费用户,可以在云端保存时效更久的聊天记录或者可以添加的好友数、群数更多或者无上限(更多创意请参见某著名社交软件的各种砖会员的设计模式 ),这时候对定制化的要求就非常高,毕竟数据是宝贵的。这时候我们就需要自行开发不能依赖第三方服务。

本文(或者说本系列)博客将会还原真实用户需求场景,从最基本的功能实现到一步步的系统优化、性能提升。你将在以下的看到websocket,socketJs,rabbitmq,spring全家桶,zeromq,netty,reids,mycat等主流框架、互联网中间件技术的实现。

原创粉丝点击