许超前的博客 - A longker in the Earth

September 12, 2009

终于把搜索更新改成基于MQ(Message Queue, 消息队列)的方式了

Filed under: Daily Life — 许超前 @ 1:45 am

经过同事们的一番努力,终于把搜索更新改为基于MQ的方式了,大家(特别是增禄和大庆)辛苦了。

搜索更新早就想改了,因为种种限制,无法实施。这些限制如下:
一)手机之家采用混合编程(主要是PHP+JAVA)。
二)JAVA调用PHP显然不是好方法。
三)用PHP做异步触发很困难。
四)用PHP写驻留程序很困难。
五)要让PHP在消费消息失败时回滚很困难。
六)基于这些限制,DAL1.0最后用PHP和数据库实现了一个不太可靠的消息队列。这显然不太好。
“旧”更新方式如下图所示:
Screenshot-001

DAL升级到2.x后,之前的种种限制已经消失了,搜索更新一下子有了很大的改进空间。具体改进如下:
一)引入双队列,为的是能异步触发,从而节省内存、降低CPU占用率,进而提高负载能力。DAL2.x内置队列写消息非常快,写一条消息耗时不到1微秒(不是毫秒,了解个大概,省略测试环境)。
二)(部分)拉改成了推,“近实时“更新有了可能性。时间关系,留待下一步继续改进。
“新”更新方式如下图所示:
Screenshot-002

接下来可能会抽个时间试试以下的方式(废弃Crond,主要是为了减少更新延迟):
Screenshot-003

注:图中提到的M3,是Massive Message Manager的简称,是我们的大庆在近期开发的作品,在此鼓励一下:)。

—The End.

13 Comments »

  1. 想请问一下 用什么做的MQ?ActiveMQ吗?

    Comment by xLight — September 12, 2009 @ 2:47 pm

  2. @xLight
    DAL2.x内置队列是自行实现的。外置队列选的是ActiveMQ,相对来说,ActiveMQ已经比较成熟了,而且,在我们的测试中,它表现得很稳定。

    Comment by 许超前 — September 12, 2009 @ 4:07 pm

  3. @超前
    继续问一句,ActiveMQ 什么版本?

    Comment by xLight — September 14, 2009 @ 1:21 am

  4. Listeners 是怎么实现的?能分享下吗?

    Comment by JeremyWei — September 14, 2009 @ 8:55 pm

  5. @xLight
    你好。
    我们用的ActiveMQ的版本是5.2。可以看看http://activemq.apache.org/activemq-520-release.html

    Comment by 许超前 — September 14, 2009 @ 11:20 pm

  6. @JeremyWei
    你好。
    说白了,所谓的listeners,就是监听某些动作或事件的对象(在函数式编程语言里可以是函数)。只要动作或事件一发生,就触发这些对象执行特定的方法。
    举例来说,只要用户调用增删改API,API在内部会调用相应的listener的方法,使得增删改事件得以处理。

    Comment by 许超前 — September 14, 2009 @ 11:27 pm

  7. 再问下,MQ怎么实现自动推送消息的?

    Comment by JeremyWei — September 16, 2009 @ 5:50 pm

  8. 许先生:您好!
    我是机械工业出版社华章公司的高级策划编辑杨福川,冒昧打扰了。很荣幸通过JE对您的采访认识您,一口气看完了采访的内容收获颇多,深深感到您在分布式数据访问层方面有深入的积累。
    刚才又来到了您的博客,拜读了几篇博文,以一个编辑的敏锐洞察力,我认为您一定是一位有潜力的作者。不知道您是否有兴趣结合自己的技术专长和市场的需要来出版一本个人的专著?如果您有这方面的想法或打算,我可以协助您来实现您的想法。
    为了便于联系,我偶们能交换一下MSN(erwa_yang@live.cn)吗?
    期待与您取得联系。

    Comment by erway — September 17, 2009 @ 11:36 am

  9. 杨先生,您好。
    很抱歉,在忙着升级系统,刚看到消息。
    已加您为好友。
    我的MSN是:chaoranxu@hotmail.com;
    我的GTALK是:chaoranxu@gmail.com。

    Comment by 许超前 — September 18, 2009 @ 1:16 am

  10. @JeremyWei
    实现的方法有多种,如可以用监听器,消息来了,我就给监听器发消息;还可以用内部轮询的方法,查到有消息后就发出去等等。

    Comment by 许超前 — September 19, 2009 @ 12:49 am

  11. PHP写驻留程序蛮稳定的,偶然看到我们项目的一个PHP后台进程是4、5月份启动的,算来持续运行超过一个季度了;
    看profile信息,发现DB的写比读快至少一个数量级,可能是缓冲、异步的关系吧,自动刷新或是在读的时候要保持数据一致性才写入;
    恭喜老兄,垃圾回复很多。

    Comment by hshqcn — September 20, 2009 @ 2:12 pm

  12. 关注,期待DAL能够开源,加油!

    Comment by thief — October 10, 2009 @ 3:37 pm

  13. 老兄不错,我听了你的演讲。
    有空把垃圾回复清掉吧

    Comment by letitbe — October 25, 2009 @ 7:26 pm

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress, 京ICP备09047672号