• Feeds

  • Archive for the ‘架构’ Category


    多IDC数据时序问题及方法论

    上一周在微博架构与平台安全演讲中提到多IDC及架构设计的方法,由于最近工作中经常碰到这种情况,再举一个小案例补充一下。

    Web数据访问比较好的设计模式是使用cursor方式(参考前文用Twitter的cursor方式进行Web数据分页),原理上相当于增量方式访问数据,可以极大提高访问性能。

    在单IDC场景中,如图1,系统的id是递增,假设用户上一次访问最新一条记录是1002,则本次访问最佳的方式是 get?cursor=1002,可以高效取到后面3条新记录。

    多IDC场景,看图2,假设白色背景属于Region 1,灰色背景属于Region 2, 由于两地同步有延迟,这样在Region 1中1001和1003来到时间较晚,排在本地数据1002和1004后面。假设用户上一次也是取到最新一条是1002(注意此时1001没取到,因为从外地未同步过来)。在Region 1调用 get?cursor=1002返回结果会得到什么?从数据库角度来看,访问cursor=1002 只会取到id>1002的记录,而上次未取到的1001即使已经同步过来是永远不会返回了。这样就产生了数据一致性问题,1001丢了。另外一个机房Region 2调用也产生类似问题。不同的cursor产生不同的丢失问题。

    提出这个问题后身边很多技术人员非常感兴趣,经常走在路上被拦住介绍他们突然想到的一种更巧妙的解决方法。部分思路如下
    (这里先不考虑ID递增算法如何实现,多IDC使用K-SORT方式递增也是比较容易的)

    • 例外的方式,把迟到的id都存下来
    • 补方式,把cursor往前多取一点,宁滥毋缺
    • 快照方式,最近取的记录都存下来,这样服务器内部知道这个cursor上次哪些id取了哪些没取

    大部分方法貌似都能工作,但都有问题或不完美,更重要的一点,也就是上周演讲中提到的,架构要把复杂的问题抽象简单,很多技术人员面对这个问题,并没有深层次思考这个场景的问题本质是什么,因此虽然匆匆考虑了很多复杂的解决方案,但是没有完美解决问题。

    有兴趣的朋友可以继续思考,看能否将复杂的问题抽象简单并解决?

    微博架构与平台安全演讲稿

    本文是在2010中国首届微博开发者大会演讲稿(PPT),由于网上已经有演讲视频及全程文字记录,这里就不做补充,演讲稿如下。

    需要下载请点击 view on Slideshare,在 Slideshare 打开后 Download

    降低应用latency方法谈

    上个月发的谈团队每周技术交流引起不少同行感兴趣,如果那篇文章能起到促进业界公司内部技术交流那就是最大的贡献了。

    上周五我们继续内部技术讨论,对某Java Web应用进行了latency分析。Latency主要是分析一个URL高并发请求下消耗时间的分布,比如ab(ApacheBench)输出结果最后一段

    Percentage of the requests served within a certain time (ms)
      50%      5
      66%      6
      75%      6
      80%      6
      90%      7
      95%      8
      98%     10
      99%     18
     100%     92 (longest request)

    表示99%的调用是在18ms返回的,从结果来看latency比较低,反映相应URL的性能是比较理想。

    这次技术讨论首先是情况介绍,测试工程师介绍了主要URL从本地IDC到全国的latency的分布图。另外DBA也从数据库的角度介绍了DB层面常见的latency来源。这样会后我们可以对最明显的问题进行优化和改进。

    除去通用的问题之后当然是讨论方法,程序员关注的重心大部分还是从应用层面怎么降低latency。

    压力测试

    很多Web开发的朋友也经常讨论Web应用如何有效的进行压力测试,目前也没有万能的方法。可以使用的工具有loadrunner, 或者Erlang语言开发的tsung等,很多公司也有自己的内部工具。HTTP/Memcache/MySQL等协议压力测试其实相对简单,通常用自己脚本或者高级语言开发的工具比起通用工具来说效果会更佳。

    profiling

    对接口进行Profiling是发现瓶颈最直观的方法,Google据说就有很完善的内部profiler工具(当然Google内部什么工具都有)。我们讨论了目前不同开发人员使用的profiling方法的优缺点。

    1. 直接使用专业工具,比如JProfiler, 还有Java自带的JVisualVM等。
    2. AOP(Aspect-oriented programming)的方式,优点是对程序没有污染,在外部配置需要profiling的方法。
    3. 工具类的方法,需要在service方法前后加入小量关键点,优点是纯Java的实现,可以运行时动态打开或关闭profiler。比如通过给进程发signals的方法(见Signals and Java)动态让程序输出当前运行情况,起到了能够动态profiling服务器但在正常情况下又不影响服务器性能的作用。

    从讨论情况来看大部分开发人员还是倾向于方法3,我们也希望团队能逐步建立类似Google内部profiler之类自己的工具。