文章列表
 
您正在查看 "Wildfire" 分类下的文章

2007-02-28 22:21
message 包的 to 如果乱写的话,具体的不多说了。
 
2007-01-27 22:27
Wildfire (Openfire) 最新NIO版中文处理有问题(2007/1)

XML流里面含有中文字符时候有问题。通常在非常大的MESSAGE包会出现。
从 ByteBuffer => CharBuffer 有问题,可能会将一个中文字符切分成2部分。
看了一下现在的源代码可能不好改。

补充:
07-6-23:
Jive 解决了XMLLightweightParser中OOM的问题

07-9-21
Jive 解决了双字节切分成2部分的问题
// Verify if the last received byte is an incomplete double byte character
char lastChar = buf[readByte-1];
if (lastChar >= 0xfff0) {
if (Log.isDebugEnabled()) {
Log.debug("Waiting to get complete char: " + String.valueOf(buf));
}
// Rewind the position one place so the last byte stays in the buffer
// The missing byte should arrive in the next iteration. Once we have both
// of bytes we will have the correct character
byteBuffer.position(byteBuffer.position()-1);
// Decrease the number of bytes read by one
readByte--;
// Just return if nothing was read
if (readByte == 0) {
return;
}
}


所以07-9-21之后的版本已经可以正常使用了。
 
2006-12-27 20:52
Openfire (Wildfire) 在 2006 年圣诞前夕做了2周左右的load tests并做了性能方面的优化。其中使用了 MINA (http://mina.apache.org/) 来处理jabber客户端的连接(基于 Java NIO)。

目前connection manager代码已经实现了mina支持,主要用于处理 jabber client 请求。其中的架构如图所示。


Wildfire 加了 mina jar 但是源代码还没有变动,可能也打算加入 mina 来处理 xmpp client。MINA还有一个throttling filter用来处理Wildfire达到100%负荷的情况.

但 Tim 试了一下基于 Mina 的 connection manager 还不是特别稳定,压力测试方面有很多莫名其妙的问题。可能还需要时间完善。

其他的 new features 如下,Gata 在 Wildfire 论坛专门有个帖子介绍。

* Out of the box DB connection pool has a min size of 5. This was the first bottleneck we found. The min and max size was set to 100.
* Cache size is also a key factor to get good performance. A small cache size or low effectiveness implies more db queries. The main cache that we needed to increase was the Roster cache. To hold the roster of 25K users that contain 20 contacts each we needed a 48MB cache.
* Offline timestamp is now stored in its own table (and uses a new Cache). Before it was being stored as a user property and it was a big bottleneck when users were coming online or offline.
* Move as many db operations (INSERT, UPDATE) to run as batch processes. This will improve overall performance and reduce number of locks.
* Optimized Cache#calculateSize to consider Strings and avoid serializing Strings to estimate their size.
* Optimization: do not load User when not needed. In particular, do not validate if a user exists after it was successfully authenticated.
* Optimization: avoid creating of DOM objects in CMs. Just pass the received Strings to Wildfire. This was a huge optimization.
* Optimization: reduce number of parser instances in CMs. One per working thread instead of one per connection. This was a huge optimization.
* Avoid reflection if possible. Reflection in Java is not that optimized. In particular, we replaced usage of reflection while executing a DB command with an IF statement.


常用开源Jabber(XMPP) IM服务器介绍
Jabber IM 服务器占有率比较
Openfire (Wildfire)已经完成开发 JEP-0124 Jabber XMPP扩展协议
Openfire (Wildfire) Connection Manager 安装配置简介
Openfire (Wildfire) Connnection Manager 协议分析
Openfire (Wildfire) 的最新特性, 基于 Mina 的 Connection Manager
 
2006-10-28 13:34
Openfire (Wildfire) HTTP Binding module 已经开发完成。它采用 jetty 作为 http 容器,利用了Jetty NIO & continuations。所以它的http binding性能应该是所有的jabber服务器中最好的。
作者Alex在3天内就开发完了这个功能,我测试发现了一个bug, Alex过了一晚上就解决了,见论坛
http://www.jivesoftware.org/community/thread.jspa?threadID=22701&tstart=0

Alex 的 blog 上有这个特性的一些介绍。
http://jivesoftware.com/blog/2006/10/26/wildfire-http-binding/

另外一些 http binding 支持的总结:
ejabberd 的 http binding 模块前几天也配置成功了,缺点:
- 不是发布版的功能,是个补丁,只支持 ejabberd 1.1.1
- 不支持 sasl

JabberHTTPBind
- 不支持 sasl
- 不适合大容量的用户

常用开源Jabber(XMPP) IM服务器介绍
Jabber IM 服务器占有率比较
Openfire (Wildfire)已经完成开发 JEP-0124 Jabber XMPP扩展协议
Openfire (Wildfire) Connection Manager 安装配置简介
Openfire (Wildfire) Connnection Manager 协议分析
Openfire (Wildfire) 的最新特性, 基于 Mina 的 Connection Manager
 
2006-10-14 9:36
以前在Wildfire论坛上看到WF打算把HTTP Binding作为一个plugin 来添加,当时我就觉得不太好,这个功能放在CM上更合适一些,并打算自己在CM上实现一个。

今天发现10/13的 connection manager svn 里面已经加了 http bind 代码了,package name 是
 org.jivesoftware.multiplexer.net.http

不过还在开发中,作者Alex今天加了9个class,呵呵,老外开发效率比较高。使用 jetty 6作为web容器,使用NIO SelectChannelConnector方式,那就是说在Linux下面可以支持30万连接 :)

svn log info
Added jetty to connection manager, it is now listening but will only return errors when you send it a request.

本来Tim打算在 Connection Manager 上增加一个Http Binding,不过既然高手在开发了那就再等等。:)
 
2006-09-29 19:27

使用外部jabber xmpp client 连接connection manager,
今天测试到 22,000 左右用户时候 connection manager 就会报错

2006.09.29 19:23:33 检测到流错误. Connection: org.jivesoftware.multiplexer.net.SocketConnection@8d96393 socket: Socket[addr=/192.168.1.2,port=60810,localport=5222]
java.lang.Exception: No answer was received from the server
    at org.jivesoftware.multiplexer.net.BlockingReadingMode.authenticateClient(BlockingReadingMode.java:189)
    at org.jivesoftware.multiplexer.net.BlockingReadingMode.readStream(BlockingReadingMode.java:137)
    at org.jivesoftware.multiplexer.net.BlockingReadingMode.run(BlockingReadingMode.java:66)
    at org.jivesoftware.multiplexer.net.SocketReader.run(SocketReader.java:114)
    at java.lang.Thread.run(Thread.java:595)

以上是warn log中的stack trace, 还不知道什么原因。
出错这时候如果直接使用 socket 去连 connection manager 没响应,一直要等到超时。
我的期望是5~6万左右,2万也太少了点吧。
 
2006-09-21 21:42
贴出问题两天后主要问题copySession的问题已经fix, 他们的开发团队还是很高效。
fix已经提交到svn, 以后的Wildfire版本就不会有那个主要的问题。但是Stringprep的性能还是需要改进。

感兴趣的朋友可以去Wildfire(Openfire)的论坛了解:
http://www.jivesoftware.org/community/message.jspa?messageID=129882

目前我在Wildfire(Openfire)上测试了30万在线用户基本上没有问题。看来Wildfire经过培养后还是有前途,不会比djabberd差。

After 200K users login:
Time elapsed: 424 sec
Connection Manager memory: 305.31MB of 910.25 MB (33.5%) used
Wildfire memory: 1775.05 MB of 1925.31 MB (92.2%) used (Xmx=2G)

After 300K users login:
Time elapsed: 624 sec
Connection Manager memory: 329.93MB of 910.25 MB (36.2%) used
Wildfire memory: 2605.55 MB of 2831.94 MB (92.0%) used (Xmx=3G)

After all users login, I opened the web admin console, and everything is ok there. I can open the client sessions page, or click into user session details, though the client session page a little ugly.
 
2006-09-20 0:30
问题见图片,在大量用户登录时候会出现下面图片中的瓶颈。
Wildfire stress test 压力测试 几万用户 同时登录

问题一:



问题二:



问题三:



具体的问题发在官方的论坛上,有兴趣的朋友自己去看。
http://www.jivesoftware.org/community/thread.jspa?threadID=21926&tstart=0
 
2006-09-07 0:51

Openfire (Wildfire) Connnection Manager目前还没有公开的JEP,所以把它的协议分析了一遍如下:

第一步:建立 socket 连接握手,一个 connection manager 可以跟服务器建立多个连接
1. 连接c2s
// to="cm1/socket1" 实际是是填写cm的名称(cm1)和当前 socket 的别名(socket1)
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:connectionmanager" to="cm1/socket1" version="1.0">

s2c:
// id="d2a9bc17" 中的 stream id 用来下一步验证
<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:connectionmanager" from="cm1/socket1" id="d2a9bc17" version="1.0" >

s2c: (tls, compress, etc)
<stream:features></stream:features>

2. 验证
c2s:
// 密码算法:sha1(streamid + password)
<handshake>f182e437fd8fbb0dec51667ff6e8ffd657cab9bb</handshake>

s2c:
<handshake></handshake>
// 表示验证通过,其他格式表示失败。


3. features

last step: server 告诉cm, server支持的features, 如果多个 socket 连接可能后面的 socket 不会收到这个包
s2c:
<iq type="set" id="143-23">
<configuration xmlns="http://jabber.org/protocol/connectionmanager">
   <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
   <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>PLAIN</mechanism>
    <mechanism>CRAM-MD5</mechanism>
    <mechanism>DIGEST-MD5</mechanism>
    <mechanism>ANONYMOUS</mechanism>
   </mechanisms>
   <compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression>
   <auth xmlns="http://jabber.org/features/iq-auth"/>
   <register xmlns="http://jabber.org/features/iq-register"/>
</configuration>
</iq>

c2s: cm 简单原包应答即可
<iq type="result" id="143-23" to="wildfire.server" from="cm1/socket1">
<configuration xmlns="http://jabber.org/protocol/connectionmanager">
    <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
      <mechanism>PLAIN</mechanism>
      <mechanism>CRAM-MD5</mechanism>
      <mechanism>DIGEST-MD5</mechanism>
      <mechanism>ANONYMOUS</mechanism>
    </mechanisms>
    <compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression>
    <auth xmlns="http://jabber.org/features/iq-auth"/>
    <register xmlns="http://jabber.org/features/iq-register"/>
</configuration>
</iq>


第二步:代理 Jabber client 登录

1. 有个 client 连接过来了, CM 通知 Server open session
c2s:
<iq type="set" to="wildfire.server" from="cm1/socket1" id="90-0">
<session xmlns="http://jabber.org/protocol/connectionmanager" id="cm1d99f71af"><create/></session>
</iq>

s2c:
<iq type="result" id="90-0" from="wildfire.server" to="cm1/socket1">
<session xmlns="http://jabber.org/protocol/connectionmanager" id="cm1d99f71af"><create/></session>
</iq>

这时候 wildfire cm 的界面看到 client sessions = 1, 但是 sessions 的界面看不到 client
注意 cm1d99f71af 就是 client 的 streamid, 用来区分 client
在以后的包都放在 route streamid 中


2. auth client 客户端验证
c2s:
<route to="wildfire.server" from="cm1/socket2" streamid="cm1d99f71af">
<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">dGVzdDFi4zZwB0ZXN0TimsFakePacket</auth>
</route>
// 算法: base64.encode(username+@+host+\0+username+\0+password)<

s2c: success
<route from="wildfire.server" to="cm1" streamid="cm1d99f71af">
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
</route>

3. bind resource 便于c/s正式沟通
c2s:
// 从现在开始, iq id 从一个随机数递增
<route to="wildfire.server" from="cm1/socket3" streamid="cm1d99f71af">
<iq xmlns="jabber:client" id="cF25i-1" type="set">
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <resource>TimAtHome</resource>
    </bind>
</iq>
</route>

s2c:
<route streamid="cm1d99f71af" from="wildfire.server" to="cm1">
<iq type="result" id="cF25i-1" to="wildfire.server/cm1d99f71af">
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>test1@wildfire.server/TimAtHome</jid></bind>
</iq>
</route>

4. create session
按照 xmpp 这个应该在 auth 之后发出, 放在auth后第1步 (rfc3921 section[3])
但是为了构建完整的jid, 具备 resource, 所以放在 resource bind 之后

c2s:
<route to="wildfire.server" from="cm1/socket4" streamid="cm1d99f71af">
<iq xmlns="jabber:client" id="cF25i-0" type="set">
    <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</iq>
</route>

s2c
<route streamid="cm1d99f71af" from="wildfire.server" to="cm1">
<iq type="result" id="cF25i-0" to="test1@wildfire.server/TimAtHome"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
</route>


5. send presense, 用户的好友看到用户在线
c2s:
<route to="wildfire.server" from="cm1/socket1" streamid="cm1d99f71af">
<presence xmlns="jabber:client" id="cF25i-8"><status>Online</status>
</presence>
</route>

以后所有c/s之间的包 cm 只是简单封装,不再描述。

注意 cm 的客户端异常断线后,收到服务器发给该client的包需要给服务器回复一个错误信息。

常用开源Jabber(XMPP) IM服务器介绍
Jabber IM 服务器占有率比较
Openfire (Wildfire)已经完成开发 JEP-0124 Jabber XMPP扩展协议
Openfire (Wildfire) Connection Manager 安装配置简介
Openfire (Wildfire) Connnection Manager 协议分析
Openfire (Wildfire) 的最新特性, 基于 Mina 的 Connection Manager

 
2006-08-31 22:58
Connection manager 是 JiveSoftware新开发的一个组件,最主要的一个用途就是可以提高 wildfire 的可扩展性,支持更多的客户端。3.x 可以从以下地址下载:

http://www.jivesoftware.org/wildfire/connection_manager.jsp

Wildfire 配置:
1. Download and install Wildfire 3.x from http://www.jivesoftware.org/
2. Login Wildfire admin console, http://<hostname>:<port>, 如 http://timyang:9090/
3. 打开 server settings / connection managers 页面
4. Enable connection manager, port 5262, 随便设置一个 password, 然后这个页面不要关掉,等下在这个页面可以看到 connection manager 是否连接成功

Connection Manager 配置

1. install connection manager 3.x, CM 通常在另外一台服务器上部署
2. 修改 conf/manager.xml
3. 填写 <domain>timyang</domain>, 这里填 wildfire 的名字,注意不要填写 ip, 如果你没有 dns 可以在 hosts 文件里面加。
   确保你的 cm 的服务器可以使用域名连上 wf.
4. 把<certificate>中 <verify>true</verify> 改成 <verify>false</verify>
TLS那一段配置默认是需要CA颁发的证书,比较麻烦。简单的方法是去掉verify
5. 启动 bin/cmanager.sh or cmmanager.bat
6. cm 启动后刷新 wildfire 配置第4步的页面,如果配置正确,在管理页面可以看到有1个连接。如下图所示

7. 用 spark (or other jabber client) 登录,服务器写 connection manager 的域名,如果能够登录,表明一切 ok.

Connection Manager基于GPL授权,有源代码,有兴趣的朋友可以下载了解下
 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

分析得好。 这种类型的cache怎么设计比较好呢?
 

结论是什么,性能如何呢?
 

回复nongyan90:找到原因了么?
 

请问为什么使用connection manager后Spark就连接登录不成功(报告用户名密码错误),
 

请问为什么使用connection manager后Spark就连接登录不成功(报告用户名密码错误),
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu