https://github.com/lamfire/jspp

http://blog.csdn.net/nomousewch/article/category/823687

http://my.oschina.net/pzh0819/blog/113946

http://www.cnblogs.com/xiazh/archive/2011/04/02/2003852.html

11年进入公司就开始研究openfire,做一款手机IM软件,经过3个月的不懈努力,产品终于上线了。上线初产品功能比较简单。上线初架构比较简单,服务器是单机,后来由于用户的不断增长,单机已经不能满足需求,所以就不断优化架构,其中经历了不少的艰辛,到目前系统相对基本稳定(注册用户2000W,同时在线用户200W+)。废话不多说,下面直接上架构图,由于这个这个架构图有点老,跟现在的架构有一点点区别,但大致相同。

由于该产品服务端基本都由我一个人负责,所以目前的架构很存在诸多问题,还需不断优化,欢迎大家拍砖~~~

系统架构:智能DNS + lvs  + nginx + memcache + redis + mysql  + lucene +  FastDFS

下面继续说下使用相关技术的原因及用处。

(一) 智能DNS,这个相信大家都知道,就不多说了

(二) lvs主要用来做负载均衡,终端用户通过lvs 连接到前端的服务器。lvs确实很变态,支持百万级连接,我们最多的时候通过lvs分发150W+用户到前端服务器。

但是使用lvs也遇到很多问题,特别是lvs的分发策略及健康检查,如果用的不好,如果前端出现问题,会挂掉一批机器。曾经好多次lvs时不时误判某台前端挂掉,将该前端所有请求瞬间分发到其他机器,导致其他前端顶不住压力而挂掉,为此一直很烦恼找不到原因,经常百思不得其解。也许是苍天不负有人,有次灵感一闪,会不会是JVM垃圾回收导致的呢?

由于JDK1.6 JVM默认采用UseParallelGC,JVM在全局回收的时候暂停服务,导致lvs的健康检查timeout。然后开始研究JVM的垃圾回收机制,优化JVM配置,同时修改lvs健康检查timeout时间,优化后问题从此解决。

下面是我的JVM配置:

-Xms8048M -Xmx8048M -Xmn1048m -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75

(三) nginx主要是用来做http代理请求转发。刚开始是由于业务的修改及代码的重新部署都需要重启服务器,然而用户都是通过socket与服务器通讯,重启必然造成登录到该服务器的所有用户掉线,这样体验很不好。时常想QQ每次更新服务器是怎么做到我们不掉线的呢?在网上也搜了很多关于IM的架构资料,后来想到openfire里面的业务处理大部分都是通过IQ包来请求处理的,所以把前端IQ包收到的请求都通过http转发给后端的服务器处理,这样更新代码只要不涉及到核心就只要更新业务处理服务器代码,利用nginx的平滑重启,用户根本不知道我们在更新代码,这样就不会对用户有影响。

(四)memcache集群与redis集群主要是用来缓存用户信息的,至于为什么要同时用redis和mc,是因为要支持多终端登录,需要用到redis的hset数据结构,但由于redis比较耗cpu,所以不想把mc换成redis。

(五)mysql主要用来做数据持久化,通过水平划分和垂直划分来存储数据,这个也是常用的办法。mysql表在千万级基于索引的查询性能还是可以的,但是mysql有个很致命的问题就是如果加字段,那就悲剧了。。。。。所以nosql在互联网才能将它的长处发挥的淋漓尽致。

(六)lucene主要用于用户的搜索,至于lucene的实时搜索我们是通过用户在修改资料的时候,通过http异步实时更新到lucene建索引。

(七)FastDFS分布式文件系统,主要用于存储用户头像。刚开始我们使用的单台服务器存储图片,但后来随着图片越来越多,同时通过rsy去备份很维护起来麻烦。通过多次文件系统相关开源产品的比较,我们选定了它,主要由于是FastDFS维护起来比较简单,并且很容易上手。

(八)服务器性能优化,经常发现服务器的单个cpu si(软中断)在35%,而其他cpu的si为0%,起初一直是以为程序的锁有问题,就一直找找,后面请运维同事帮忙,经过一段时间的研究发现是由于服务器较老,网卡不支持多CPU si,后来通过升级linux内核,同时购买新的网卡,优化后服务器终于可以支持在多cpu上的si,在此对运维同事表示感谢~~

(九)单台服务器支撑用户,上线初单台机器可以支撑6W+用户同时在线,优化后可支撑18W+,峰值可以支撑20W+,当前单台平均16W+,服务器配置Intel(R) Xeon(R) CPU 8核 + 16G内存

架构存在的缺点:

前端服务器集群通讯还是依赖openfire本身的socket同步通讯机制,这样造成前端服务器之间的耦合性很强,本来是使打算引入RabbitMQ中间件的,对RabbitMQ也研究了一段时间,但由于种种原因,至今还未集成进去。接下来的目标是将其集成。

注:前端集群目前我们采用消息中间件RabbitMQ,前端openfire只做数据接收,所以的业务通过mq分发到后端处理。

同时各位有兴趣的可以了解下我们的产品:http://www.wecloud.io/

json xmpp的更多相关文章

  1. plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...

  2. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  3. 基于XMPP的IOS聊天客户端程序

    简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端(例如eJabber.OpenFire) ...

  4. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

  5. iOS,XMPP本地环境搭建和框架使用

    1.XMPP的MySQL和openfire环境配置 2.XmppFramework框架导入和介绍 XMPP的MySQL和openfire环境配置 1.下载mysql安装 mysql下载 打开MySQL ...

  6. iOS开发拓展篇-XMPP简单介绍

    iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...

  7. (转)xmpp 环境配置-支持扩展

    第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s/1jGxLa3G 也可以直接去github搜索下载. 2> ...

  8. iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备

    XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...

  9. iOS 使用xmpp做聊天客户端

    可以号称史上最详细的xmpp做iOS客户端聊天介绍. 简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S  S/S多种架构的聊天协议 XMPPServer 基于XMP ...

随机推荐

  1. 4071: [Apio2015]巴邻旁之桥

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  2. share my tools With Xcode

    1.让Xcode的控制台支持LLDB类型的打印 在Xcode断点调试的时候, 在控制台输入 po self.view.frame 或者 po id 类型的时候就死翘翘了. 进入正题: 安装LLDB调试 ...

  3. C# 网页自动填表自动登录(转)

    自动填表的方式有很多,关键是获取控件的id或者name. 比如源代码有 <input id="pwdInput" tabindex="2" class=& ...

  4. 基于 libpcap库的sniffer程序

    基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...

  5. Codeforces Round #197 (Div. 2) : C

    哎....这次的比赛被安叔骂的好惨! 不行呢,要虐回来: 这道搜索,老是写错,蛋疼啊! 果然是基础没打好! #include<cstdio> using namespace std; ], ...

  6. Android 基础知识点(持续更新)

    一.AndroidManifest 每一个安卓工程都有AndroidManifest.xml的配置文件,在所有项目中该名称都不会变.该文件是Android工程的一个全局配置文件,所有在Android中 ...

  7. Android Training精要(六)如何防止Bitmap对象出现OOM

    1.使用AsyncTask異步加載bitmap圖片避免OOM: class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> ...

  8. 【HDOJ】1175 连连看

    BFS.wa了一下午,原来是YES,写成了Yes. #include <iostream> #include <cstdio> #include <cstring> ...

  9. gmail

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  10. HDOJ -- 1015

    1.DFS #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #i ...