XMPP Jabber practice 即时通讯开发实践

  • mysql 在国外facebook,flickr等公司内的使用情况 2008-04-21 23:03:23
  • mysql conference现场提问的一个资料,网上见过很多版本了,这个表格版本看起来最直观

    Â How many servers Number of DBAs How many web servers Number of caching servers Version of MySQL Language, platform Operating System MySQL

    1 M, 3 S

    1/10

    2

    2

    5.1.23

    Perl,php and bash

    Linux fedora

    Sun

    2 clustered, 2 individual

    1.5

    160+

    8

    5.0.21

    Lots of stuff (java mostly)

    Open Solaris

    Flickr

    166

    At present 0

    244

    14

    5.0.51

    Php and some Java

    Linux

    Fotolog

    140 databases on 37 instances

    10 instances a DBA

    70

    40 ( 2 on each, 80 total)

    4.11 and 4.4

    Php, 90% Java

    Solaris 10

    Wikipedia

    20

    None, but everybody is kind of a DBA

    70+200

    40 ( 2 on each, 80 total)

    Â

    Php, c++, python

    Fedora / Ubuntu

    Facebook

    30000 databases, 1800 db servers

    2

    1200

    805

    5.0.44 with relay log corruption patch

    Php, python, c++ and erlang

    Fedora / RHEL

    Youtube

    I can not say

    3

    I can not say

    say

    I can not say

    5.0.24

    Python

    SuSE 9

    • 基本上用MySQL 5.0, 操作系统则是Linux的天下,开发语言用php,python,java,c++,另外facebook还用erlang的
    • MySQL对DBA的需求较小,程序员就是dba
    • facebook平均每个db server有20个数据库
    • 前2个公司没多少参考价值(传统行业),youtube 啥也不愿意说, I can not say...

    表格原文在:

    http://venublog.com/2008/04/16/notes-from-scaling-mysql-up-or-out/

    类别:Mysql 查看评论
  • 提高mysql memory(heap) engine内存性能的开源补丁 2008-04-21 16:28:44
  • mysql memory存储引擎(也称heap table)是一种高效的内存数据库,速度非常快,或可当作cache使用,适合需要对cache作关系查询的数据,可参考我以前的文章:
    memcached vs MySQL Memory engine table 速度比较

    但是mysql memory table有一些性能问题,其中之一就是varchar数据类型内存利用率不高,ebay也在使用这个特性,所以他的一位工程师解决了这个问题,并凭此和另外一个工具获得了 2008 MySQL Application of the Year

    项目地址:http://code.google.com/p/mysql-heap-dynamic-rows/

    As of March 2008, MySQL Heap Engine of any version is limited to fixed row format. It allocates fixed memory size for each record stored in a given Heap Table. For example, if table A has a VARCHAR(4000) column, MySQL will use at least 4000 bytes (plus other columns and per-record overhead) for every record regardless of whether it has that much user data. In this example, the table will use 4GB memory per 1M records. 类别:Mysql 查看评论
  • openfire enterprise企业版即将开源的一些看法 2008-04-17 16:46:15
    • 比较有价值的,有fastpath和archive,fastpath可看我前面的介绍:fastpath 基于openfire 的客服 web im;chat archive就是在服务端保存所有聊天历史的支持。
    • openfire clustering集群不会开源,由于集群90%的功能是通过Coherence clustering software第三方软件来实现的,并不是openfire本身的功能。Coherence是一种内存共享的模型,内部处理多台服务器的逻辑,上层的应 用可以当作单机来使用。这个模块担心以后版本会去掉,jive是想把openfire丢出去给开源社区,只剩下clustering商业化也没什么价值。另外jive在短 期之内把clustering重新开源实现的可能性也比较小。本来就不是它的看重,以后更不会是。特别看重cluste功能的用户最好去投奔ejabberd了。
    • Jivesoftware 今后的核心转移到 clearspace 上了,今后 openfire 最大的工作是整合 clearspace 并提供所需的social & collaborative的功能。XEP的支持不是首要考虑的,不过目前的XEP也够用了。
    • Clearspace整合。从最新的源代码也可以看到,增加了许多 clearspace 的程序。对于单独部署 openfire 的用户那些功能可能是鸡肋。
    我个人比较希望的改进
  • web im。纯Web,使用comet/HTML/ajax,不是基于flash的XIFF, Flash虽然也不错,但是与其他应用集成不便。
  • 开放性。服务器架构的开放, plugin机制已经做得不错了,不过有不少需求还是需要改源代码才能实现。改了源代码,服务器又有新版本了比较烦。
  • 独立性。最好不要做 org.jivesoftware.openfire.clearspace 这样的集成,感觉丧失了独立性,如果需要对外提供roster等功能,可以做成标准的api,第三方也可以用。不要成为clearspace的附庸。
  • c++ 的客户端,pidgin那样的最好,啥都可以连,spark国内的接受程度低。(4应该没有可能:)
  • 即将(据说是4/27)开源的功能
    • Reporting and Chat transcripts plugin - 一般
    • SparkWeb - SparkWeb 是基于flash的。
    • Client Control plugin - the ability to manage clients will be available as an Openfire plugin
    • Fastpath plugin - Web IM
    稍后开源的,估计还要等几个月
    • Reporting and chat archiving - 就是聊天记录保存在服务器。
    类别:Openfire 查看评论
  • 一个支持40万并发用户的即时通讯架构介绍 2008-04-04 21:19:44
  • 原文要点:
    • 采用私有IM协议
    • db(用户、好友等):采用分区的方式
    • Cluster: 前面有一个负责分配节点的服务器,用户的请求可以由任何一个逻辑服务器来处理。逻辑服务器之间网状结构。
      • 用户所在节点find方法, 可能是询问所有网内节点,然后在本地cache
    • Cache: 自定义的Local cache: UserInfoCacheModule,未使用分布式缓存
    • 容量:目前支持40万并发,作者感觉可以支持到100万
    • 开发语言:C/C++?
    • 逻辑图
    • 部署图

    原文地址:一个即时通信系统架构实现的讨论 类别:服务器架构 查看评论
  • comet server之java实现:asyncweb,jetty,tomcat 2008-03-29 16:42:13
  • 前不久自己用C实现的comet http server,基于libevent,用c实现了一个comet server原型,由于libevent封装了一个http协议实现,代码比较简洁,但不简单。最近又了解了一下Java的实现方案。
    • Java中目前有2种选择,一种是基于Apache MINA框架的,稍复杂但适合用在大场合;一种是基于Java Web容器自己提供的支持,如Jetty和Tomcat,适合comet只是应用中一小部分场合。
    • Mina只是个网络层(相当socket层)的框架,如果用mina需要自己实现HTTP协议。好消息是这个工作已经有开源做了,一个叫Asyncweb项目在mina的基础上实现了HTTP协议层的封装。而且asyncweb正在被mina合并,将加入到mina的发行版中。
    用asyncweb编程很简单,只需实现一个接口,实际上只需要实现 handleRequest, 在 request 返回结果。 public interface HttpService
    {
    void handleRequest( HttpServiceContext context ) throws Exception;

    void start();

    void stop();
    }
    • 经过测试,asyncweb适合做异步http server,但不适合做comet server(long pooling), 参看一下例子
    handleRequest 例子,不管是同步还是异步,都必须一步输出,不支持一次写一部分 /** 同步处理的例子 */
    public void handleRequest( HttpServiceContext context ) throws Exception {
    MutableHttpResponse response = new DefaultHttpResponse();

    StringWriter buf = new StringWriter();
    PrintWriter writer = new PrintWriter(buf);
    writer.println("test");
    writer.flush();

    IoBuffer bb = IoBuffer.allocate(1024);
    bb.setAutoExpand(true);
    bb.putString(buf.toString(), Charset.forName("UTF-8").newEncoder());
    bb.flip();
    response.setContent(bb);

    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setStatus(HttpResponseStatus.OK);

    context.commitResponse(response);
    }

    /** 异步处理的例子,可以不马上返回,但是必须一次返回 */
    public void handleRequest( HttpServiceContext context ) throws Exception {
    context.addClientListener( new HttpClientListener() {
    public void clientDisconnected( HttpServiceContext ctx ) {
    }

    public void clientIdle( HttpServiceContext ctx, long idleTime, int idleCount ) {
    // do something...
    // context.commitResponse(...)
    }
    });
    }
    所以Asyncweb如果用来做一个专业的comet http server还需要修改source code,所以目前成熟的做法还是用Jetty or Tomcat,另外在网上见到说GlassFish中的Grizzly使用修改了asyncweb实现了comet功能,或许那个1年多前的修改版本更值得借鉴。

    Jetty 的Comet实现从编程的角度是最简单的,suspend的时候本次执行就结束了。
    public class ForeverFrameJettyServlet extends HttpServlet {
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    // handle the time request
    if (req.getRequestURI().endsWith("/time")) {
    // get the jetty continuation
    Continuation cc = ContinuationSupport.getContinuation(req, null);

    // set the header
    resp.setContentType("text/html");

    // write time periodically
    while (true) {
    cc.suspend(1000); // suspend the response
    resp.getWriter().println("test");
    resp.getWriter().flush();
    }
    }

    // ...
    }
    }
    Tomcat6 也支持Comet,需要实现一个CometProcessor接口,稍繁琐。例子可参考下面Resource1

    Resource:
    1. Asynchronous HTTP and Comet architectures
    An introduction to asynchronous, non-blocking HTTP programming
    http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html

    2. AsyncWeb Performance Test 与Apache2性能比较 类别:Web Im 查看评论
  • libjingle在Linux下不能编译的解决方法 2008-03-26 12:07:27
  • 以Ubuntu为例,先安装
    • sudo apt-get install build-essential
    • sudo apt-get install expat
    • sudo apt-get install libexpat1-dev
    • sudo apt-get install libssl-dev
    • sudo apt-get install pkg-config
    然后编译
    ./configure
    ./make

    编译会报错,需要修改
    talk/base/stringutils.h
    talk/base/base64.h
    talk/xmpp/xmppclient.h
    talk/p2p/base/sessionmanager.h 160

    类似如下,

    From:
    inline static const char* Traits<char>::empty_str() { return ""; }
    To:
    inline static const char* empty_str() { return ""; }

    参看一下编译出错的行号就可以找到,很好改。

    参考Resources:
    http://groups.google.com/group/google-talk-open/browse_thread/thread/bf92d054c144f167
    http://cyclone.blog.ubuntu.org.cn/2008/01/23/libjingle-create-a-program/ 类别:jabber客户端 查看评论
  • xmpp与social network整合的思路 2008-03-26 11:53:11
  • XMPP(jabber)组织最近成立了一个social邮件列表: social@xmpp.org

    主要关注协议层面xmpp与social network整合的问题。目前主要推动者是Harper Reed
    他主要关注用开源技术和XMPP来构建social network,如skinnyCorp ,目前倾向使用ejabberd来扩展。

    由于maillist刚创建,现在不少人在自我介绍,包括XMPP与mobile, web, social game, p2p音乐, 电子书分享等整合的领域。

    目前考虑到的思路

    1. 目前讨论的思路是利用XMPP现有的roster好友管理,pub/sub分享/订阅等协议来实现一个social network的功能,由于roster,pub/sub已经有很长时间的应用基础,而且也有大型分布式的一些成熟模块。目前的局限就是这些功能还是限制在xmpp client的使用层面,没有在Web或者更广泛的层面发挥作用。
    One of the things I've talked a bit about is how useful some of the
    core xmpp tools would be to developers of social networks (say using
    the roster tools, which would automatically handle registration,
    friending, defriending etc. but do it on a giant scale and
    distributedly). Getting this data out of xmpp right now though, is by
    and large limited to people with access to xmpp clients. This wouldn't
    be so bad but it's a pain in the butt to spin up thousands and
    thousands of xmpp clients to access people friendship data.
    2. XMPP组织下一步web & xmpp 整合是一个重心

    James Walker wrote:

    > particularly if we'll be
    > discussing integrating web & xmpp stuff.

    You betcha, that's the big focus here.

    Peter

    3. 一些其他观点和思路值得借鉴
    I'm Bill de hÓra, engineering director at NewBay Software. At work
    we're looking at XMPP to push out notifications, status and alerts from
    web systems, social networks and phones to non-web clients. Polling and
    managing large user numbers (rosters!) is a big deal there. I also
    co-edited the Atom Protocol and as a long time XMPP fan, having Atom
    travel over XMPP as well as the Web is a natural next step :) 邮件列表Web查看:
    http://mail.jabber.org/pipermail/social/2008-March/thread.html

    (本文来源:http://hi.baidu.com/jabber)
    类别:Xmpp 查看评论
  • memcached 1.2 内存模型图 2008-03-07 23:33:18
  • 参考了以下资源和 memcached-1.2.5的源代码,画了一个memcached模型图,作为下面资源的补充。
    slab内存模型的优点(减少碎片,速度快)和缺点(有空间浪费)下面的链接里面都有讲,Tim也没有什么新观点,就不重复了。

    参考资源:
    Current memcached memory management:
    http://lists.danga.com/pipermail/memcached/2003-September/000214.html

    LRU淘汰算法只是在每个SLAB内部使用,下面文章说将来版本考虑使用一个全局LRU淘汰算法。
    New proposal:
    http://lists.danga.com/pipermail/memcached/2003-October/000302.html

    还有一篇网上流传比较多的中文的文章,写得很详细,包括hash算法都有介绍。Memcached深度分析

    3/8补充:
    看到另外一个白板图memcache使用小结,具体内容和我的基本类似。
    类别:Memcached 查看评论
  • 用apache来给tomcat做负载均衡 2008-03-03 14:36:16
  • 网上看到的文章Load-balancing Tomcat with Apache 核心内容如下:

    原理:apache mod_proxy 改写 Tomcat 发出的 cookie, 判断用户属于哪个服务器。
    优点:Tomcat什么也不用做。不需要share session,不需要配置cluster...
    图示:
    类别:高性能服务器 查看评论
  • 比较Java中几种数据cache方式 2008-03-03 13:54:31
  • 现在很多网站一说到cache就想到memcached,memcached确实是非常优秀的系统,但是在某些场合,特别在不是分布式应用的场合,或者某些数据不需要分布式的访问,那它就未必是最佳的选择。

    下面比较3种cache方式,用测试结果说话

    • Map,严格的说不能算cache,它适合本机访问,没有过期时间,不适合大容量,不能预计长度的数据,可能会使内存耗尽。
    • ehcache,可设过期时间,当超过指定内存数量,可设置淘汰算法,可输出到磁盘,可适合本机访问,也适合用作分布式缓存,分布式缓存配置和原理稍复杂,没有memcached直观,本测试未使用ehHcache分布式支持。
    • Memcached, 适合分布式缓存,可设过期时间

    1. 环境
    OS: Linux, Ubuntu 7.04 64-bit
    Memory: 4G
    CPU: Intel(R) Pentium(R) D CPU 2.66GHz
    SCSI DISK, ext3 file system

    libevent 1.3e
    Memcached 1.2.4
    Java 1.6.0

    2. 测试方法
    Key: 数字,1~100万
    数据:100字节字符串

    // put 100 char
    Element e = new Element(String.valueOf(n), "blah.....blah... 100 chars...");
    cache.put(e);

    Memcache的设置方法参看memcachedb的性能测试

    3. ehcache 设置 <cache name="cache1"
    maxElementsInMemory="1000000"
    eternal="true"
    overflowToDisk="false"
    timeToIdleSeconds="36000"
    timeToLiveSeconds="36000"
    diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU"
    />

    4. 测试结果

    类型 测试数据
    平均速度(次/秒)
    最大速度(次/秒)
    占用内存
    Thread(s) HashMap.put* 1千万
    146,268
    254,262
    1344.18MB
    1* Hashtable.put 1千万
    128,752
    253,911
    1572.52MB
    4 EHCache.put 1千万
    118,399
    381,601
    1245.08MB
    4 Memcached.put 1百万
    16,515
    19,942
    118.20MB
    4

    * HashMap 不是线程安全,多线程测试无意义。

    * 未比较GET测试结果,由于GET测试先要模拟一定数据,用空表去测试GET结果可能无意义。(但是GET比较可能更重要,有时间补上)

    本文地址为:http://hi.baidu.com/jabber

    参考资源:NP博士的文章PHP cache的比较 《大型》系列(三)——Cache & Buffer

    补充:

    写完几天之后无意在网上看到这两篇文章:一正一反,

    正方:Comparing Memcached and Ehcache Performance说ehcache要快50~100倍

    反方:Unfair Benchmarks of Ehcache vs Memcached,貌似国内访问不到,里面意思是说要用memcached的getmulti方式测试比较才公平。另外担心ehcache中LRU算法GC不能回收内存。

    类别:高性能服务器 查看评论
  • memcachedb单线程访问bdb的阻塞问题 2008-02-24 23:38:58
    • 本文讨论的是sina的memcachedb,不是memcached
    • Memcachedb基于libevent实现,也就是说单线程的。理论上讲所有的IO操作都需要通过信号来处理,先注册信号,系统通知可以读写了再调用具体的读写命令。这主要针对网络,严格意义上来说本地的读写也要这样处理。否则本地阻塞会引起整个服务器阻塞。
    • Memcachedb基于实用的原因,读写数据库未作信号处理,但问题也不大:
      • 使用嵌入的berkeley db,仅本程序访问。
      • 直接调用berkeley db的API操作数据库,相当于直接操作文件的性能。
      • 由于不是标准的IO调用,而是berkeley db API,要通过信号来控制也很复杂。
      • 但如果启用berkeley db的replication特性,数据库阻塞的机会可能会增大。

    为什么考虑这个呢,因为今天考虑在libevent里面调用mysql,情况就复杂一点。

    • 调用的MySQL client C API, 通过socket同MySQL沟通,网络可能会阻塞。
    • MySQL同时服务多个应用,可能有时候会繁忙响应很慢。
    • MySQL C API无法设置event

    所以感觉不能用memcachedb的方法。目前想到的办法就是把所有的MySQL操作通过异步去完成,比如把操作放入队列,用另外一个程序或线程去处理。但是这只适合插入和修改,如果是查询需要即时等待返回结果就不适合,很麻烦。

    本文分类:高性能服务器

    附:memcachedb的存取数据库代码

    void complete_nread(conn * c) {
    item *it = &(c->item);
    int comm = c->item_comm;
    int ret;
    stats.set_cmds++;
    while (1) {
    if (strncmp(ITEM_data(it) + it->nbytes - 2, "\r\n", 2) != 0) {
    out_string(c, "CLIENT_ERROR bad data chunk");
    break;
    }
    cleanup_dbt();
    if (comm == NREAD_ADD || comm == NREAD_REPLACE) {
    dbkey.data = ITEM_key(it);
    dbkey.size = strlen(ITEM_key(it));
    if ((ret = dbp->get(dbp, NULL, &dbkey, &dbdata, 0)) == 0) {
    if (comm == NREAD_ADD) {
    out_string(c, "NOT_STORED");
    break;
    }
    } else if (comm == NREAD_REPLACE) {
    out_string(c, "NOT_STORED");
    break;
    }
    }
    cleanup_dbt();
    dbkey.data = ITEM_key(it);
    dbkey.size = strlen(ITEM_key(it));
    dbdata.data = ITEM_data(it);
    dbdata.size = it->nbytes;
    // 这里直接调用数据库存取
    if ((ret = dbp->put(dbp, NULL, &dbkey, &dbdata, 0)) == 0) {
    /* some future code? */
    out_string(c, "STORED");
    } else {
    out_string(c, "NOT_STORED");
    }
    break;
    }
    return;
    } 类别:高性能服务器 查看评论
  • 利用memcache协议来服务器间通讯,即作为comet input channel 2008-02-22 14:44:22
  • comet http server是一个非常简单的服务器,它只是一个通道管理器,把application server需要发送的信息送到browser。application server通常在别的服务器,可能采用任何语言任何操作系统开发。他们之间必须选择一种方式通讯。如果是同一种语言通讯就比较简单,但是异构系统通常要用web service等方法来实现,比较低效。memcache协议是一种更高效的方式,同时具有各种语言的client library。

    图示如下,是一个share nothing的架构,comet server之间不需要通讯
    (这个图是 orbited.org 作者画的,他实现了一个python的comet方案)

    至于memcache协议层的server实现就可以找现成的,比如用memcached的code修改。前不久刚好下载了sina开发的memcachedb,封装得也很好,就一个memcachedb.c文件。只要把自己用C实现的comet http server,基于libevent的源代码合并进去即可。当然它里面的bdb部分也不需要了,可以全部删掉。因为只需要他的协议处理部分。

    修改部分的Source code
    /* add function for send to comet */
    void notify_comet(char *key, char *str) {
    int nudge = atoi(key);
    if (requests[nudge] != NULL) {
    evbuffer_add_printf(bufs[nudge], "Oops, from memcache: %s!\r\n", str);
    evhttp_send_reply_chunk(requests[nudge], bufs[nudge]);
    }
    }

    /*
    * we get here after reading the value in set/add/replace commands. The command
    * has been stored in c->item_comm, and the item is ready in c->item.
    * 这个函数完全修改了
    */
    void complete_nread(conn * c) {
    item *it = &(c->item);

    int comm = c->item_comm;

    int ret;

    stats.set_cmds++;

    while (1) {
    if (strncmp(ITEM_data(it) + it->nbytes - 2, "\r\n", 2) != 0) {
    out_string(c, "CLIENT_ERROR bad data chunk");
    break;
    }
    out_string(c, "STORED");

    // send to comet server
    notify_comet(ITEM_key(it), ITEM_data(it));
    break;
    }

    return;
    }
    类别:Web Im 查看评论

  • 贡献者...




    关注者...
    ©2006 Aobo.com