V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DAOCLOUD
推荐学习书目
Python Cookbook
Using Google App Engine
推荐下载
Latest Google App Engine SDK
其他兼容技术
AppScale
Livid
V2EX  ›  Google App Engine

关于在 GAE 上实现 home timeline

  •  
  •   Livid · 2010-04-26 17:51:49 +08:00 · 7765 次点击
    这是一个创建于 5323 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SELECT IN() 操作限制只能有 30 个 item,因此理论上来说,如果用传统做法,好友超过 30 个就 not working 了。而且想必很慢。

    大家有什么好想法么?
    21 条回复    1970-01-01 08:00:00 +08:00
    zaykl
        1
    zaykl  
       2010-04-26 20:16:55 +08:00
    人多流量就马上超了。。
    orlaa
        2
    orlaa  
       2010-04-26 20:35:17 +08:00
    如果已经不在乎墙了的话,国外一个便宜的VPS或者能让程序更加的“自由”,当然,看起来似乎没有部署在GAE上那么酷。
    Livid
        3
    Livid  
    MOD
    OP
       2010-04-26 20:38:32 +08:00
    当注册用户过万之后,需要面临的 scale out 问题,在 LAMP 上和在 GAE 上的难度是差不多的。
    orlaa
        4
    orlaa  
       2010-04-26 20:50:51 +08:00
    对于GAE没有深入了解,没有过多的发言权,只是感觉一个让人愉悦的web应用它的内在也是需要自由的,而GAE给我的感觉太多条条框框了。
    总之,加油!
    Livid
        5
    Livid  
    MOD
    OP
       2010-04-26 20:56:58 +08:00
    ^_^

    我希望有一天这里能够有超过 10 万的用户,却依然很快很愉悦。
    orlaa
        6
    orlaa  
       2010-04-26 21:04:05 +08:00
    ^_^
    假如这样,估计v2ex是第一个在GAE上有超10万用户的应用,Google到时是否会有政策倾斜呢?哈,我想多了。
    number5
        7
    number5  
       2010-04-26 21:15:01 +08:00
    可以参考一下jaiku的实现,他们现在全部在GAE上了,http://code.google.com/p/jaikuengine/
    darcy
        8
    darcy  
       2010-04-27 01:39:56 +08:00
    jaiku都被Google废弃了
    Kenyth
        9
    Kenyth  
       2010-04-27 13:49:01 +08:00
    上一届Google IO会议有一个slides就是讲scalability的best practice的,你可以参考一下,结合 @number5 提到的jaiku的GAE实现一起看效果更佳:)
    zack
        10
    zack  
       2010-04-27 16:26:23 +08:00
    这确实是个麻烦问题,GAE如果支持类似Cassandra的存储机制就比较好解决了。当然最主要的还是取决于功能设计上是否有需求。
    Livid
        11
    Livid  
    MOD
    OP
       2010-04-27 16:28:42 +08:00
    其实 Twitter 自己的做法也不是 SELECT IN(),而是为每个用户创建一个队列。然后当新的 status 发出来时,就将 status 的 ID 插入到 followers 的队列中,而 status 的正文是在一个 key-value 数据库中。

    这种做法是可以在 GAE 上实现的。只是当 unfollow 的时候,清除队列中的数据貌似很头疼。
    zack
        12
    zack  
       2010-04-27 16:42:20 +08:00
    @Livid 恩,确实是这样的。GAE并没有一个很好用的应对这种情景的存储API。

    而Cassandra似乎比较适合这样的应用场景。

    两篇参考的文章,问题的情景是基本一样的:

    http://about.digg.com/blog/looking-future-cassandra

    http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/
    xuming
        13
    xuming  
       2010-04-27 17:07:30 +08:00
    使用query.ancestor,数据存放在同一个节点上,再加上一些必要的冗余或许可以
    Los
        14
    Los  
       2010-04-27 17:54:01 +08:00
    redis 很适合这些场景,而且性能上也跟得上去。
    vvoody
        15
    vvoody  
       2010-04-29 23:56:55 +08:00
    @livid 用Task Queue在后台维护这么一个队列?不知道效率如何
    vvoody
        16
    vvoody  
       2010-05-02 19:56:37 +08:00
    @Livid 如果已经跟随的用户发出tweets那么插入timeline队列没什么问题。但如果你新follow了一个人,他之前的tweets如何高效的插入timeline队列就是个问题了
    Tigris10
        17
    Tigris10  
       2010-08-21 20:36:19 +08:00
    可以运行在vps上吗?要怎么配置呢
    jorakura
        18
    jorakura  
       2010-12-13 15:06:38 +08:00
    有同样的需求,也考虑类似的做法。 #11 @livid提到的做法。
    有Twitter的实现的具体ref么?

    和#15 @vvoody 说的一样,插入 timeline 和 unfo 的时候的删除都会是大规模的批量操作。只能用taskqueue做,但是性能还不确定。

    这里有一个即时的性能参考 http://gaejava.appspot.com/
    keakon
        19
    keakon  
       2010-12-13 15:45:07 +08:00
    用一个model专门保存每个用户的公开时间线(实际上就是topic id),然后memcache它们

    取的时候直接用memcache.get_multi()来获取

    如果其中有些为None,再去数据库里取公开时间线

    详细的想法可以参考这篇:

    http://www.keakon.net/2010/04/26/Twitter%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E4%BD%BF%E7%94%A8NoSQL%EF%BC%9F
    vvoody
        20
    vvoody  
       2010-12-13 17:13:03 +08:00
    很丑陋地实现了... https://github.com/vvoody/twidao
    不过还是如 @keakon 文章里说的那样,用单一公开时间线比较好。
    jorakura
        21
    jorakura  
       2010-12-14 09:53:19 +08:00
    @vvoody twidao 很赞!学习中
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3207 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:15 · PVG 20:15 · LAX 04:15 · JFK 07:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.