json xmpp
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的更多相关文章
- plist文件、NSUserDefault 对文件进行存储的类、json格式解析
========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...
- 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. ...
- 基于XMPP的IOS聊天客户端程序
简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端(例如eJabber.OpenFire) ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
- iOS,XMPP本地环境搭建和框架使用
1.XMPP的MySQL和openfire环境配置 2.XmppFramework框架导入和介绍 XMPP的MySQL和openfire环境配置 1.下载mysql安装 mysql下载 打开MySQL ...
- iOS开发拓展篇-XMPP简单介绍
iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...
- (转)xmpp 环境配置-支持扩展
第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s/1jGxLa3G 也可以直接去github搜索下载. 2> ...
- iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备
XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...
- iOS 使用xmpp做聊天客户端
可以号称史上最详细的xmpp做iOS客户端聊天介绍. 简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMP ...
随机推荐
- java通过jni方式获取硬盘序列号(windows,linux)
linux系统java通过jni方式获取硬盘序列号 http://blog.csdn.net/starter110/article/details/8186788 使用jni在windows下读取硬盘 ...
- Stanford CoreNLP--Part of Speech
Stanford CoreNLP Part Of Speech简称POS,主要是对待分析的句子中的单词进行标记的功能,如标记名词.动词等,该组件是CoreNLP工程的一部分,详细内容可参考:CoreN ...
- Stanford CoreNLP--功能列表
Standford CoreNLP包含很多功能,github上有源码,github地址:Stanford CoreNLP,有需要的话可以下载看看. 主要内容在网站上都有描述,原文是这样写的: Choo ...
- WAF
http://netsecurity.51cto.com/art/201010/231124.htm http://wenku.baidu.com/link?url=elrFtxPRcwJ5FjlXE ...
- [wikioi]能量项链
http://wikioi.com/problem/1154/ 这是石子归并的加强版,基本就是分治法的DP.但是有了个环,因为任何一个位置都可开始,所以就建立2*N的数组,然后对可能的区间遍历一次,就 ...
- Android CoordinatorLayout + AppBarLayout(向上滚动隐藏指定的View)
在新的Android Support Library里面,新增了CoordinatorLayout, AppBarLayout等. 实现的效果: 向下滚动RecylerView,Tab会被隐藏,向上滚 ...
- 【HDOJ】1978 How many ways
DFS. #include <stdio.h> #include <string.h> #define MAXNUM 105 int map[MAXNUM][MAXNUM], ...
- cocos2d-x 添加自定义字体---中文,英文
1: 找到字体 xxx.ttf 2: 在xcode工程的 Info.plist文件中添加key Fonts provided by application, 或者 UIAppFonts(raw ...
- (转载)php循环检测目录是否存在并创建(循环创建目录)
(转载)http://www.jb51.net/article/25917.htm php循环检测目录是否存在并创建,需要的朋友可以参考下. 循环创建目录方法 这个会生成image.gif目录 代码如 ...
- HDU-2527 Safe Or Unsafe
http://acm.hdu.edu.cn/showproblem.php?pid=2527 建哈夫曼树,哈夫曼编码,求wpl值. Safe Or Unsafe Time Limit: 2000/10 ...