[Instagram] 如何读取用户 Feed

在这种图中,用户要去读去feed table的时候,用什么查询呢?用他自己的user id么?这个对于那些fan out出来的照片是可以理解的,因为在fan out的时候,发布者要把自己发送的照片和他自己的follower的信息绑定起来,然后用户可以根据照片找到自己关注的人发布的照片。那么对于大v的照片,它没fan out,上面也就没有关注自己的人的信息,那这样的条目怎么和有关注着id的条目(就是fanout 后的照片一起混在一个库里呢?我理解是因为cassendra是个no sql,对schema 没有那么严的要求,那么这样就还ok),那问题是大v没有fan out 的照片放到feed table里,用户拿啥去找到呢?如果非要给我刚发的那个问题一个解释,那45页码下面这个following table应该是想要读取照片人的following table,用户要从自己following 的人里面先找出大v来,用大v的信息把大v的照片从feed table拿回来。但我觉得不对。这里有问题,或者会很麻烦,你找回来了,弄不好还有这个人之前不是大v,fan out的照片,两次就有可能拿重复了。这事儿咋解决?请老师明示。

  • 使用自己的 User ID 查询
  • Cassandra 虽然是 NoSQL,但是它的 Schema 是很严格的 (Document-based NoSQL 的 Schema 不严格),不太容易改变,所以我们不能把 Schema 不同的信息放在一个表里。
  • 一个数据库 (DB) 里可以有多个 Schema 不同的表 (Table)。Post Table 和 Feed Table 就是两个不同的表。
  • 对于没有 Fanout 的照片,我们先读取所有的该用户关注的人,然后从 Post Table 中读出是 Is Celebrity Post 为 True 的照片。再跟 Feed Table 里该用户的 Feed 合并在一起。因为 Post Table 中 Is Celebrity Post 区分了这个照片有没有 Fanout 过,所以不会和 Feed Table 的内容重复。
1 个赞

老师好,这里想追问一个关于Is Celebrity Post这个Column的问题。课件中这个Column是标为Optional的。是不是可以理解如果使用这个Column的话,那么就并不需要题主发的图中的Celebrity Post Table了?所有的posts将会被写到Post Table中。如果不使用Is Celebrity Post这个Column的话那么就需要一个Celebrity Post Table去区分一个Post是不是Celebrity发出的?

如果上述理解正确的话,想请问老师我们应该是更倾向于用一个Table(使用Is Celebrity Post),还是用两个Table呢?感觉用一个Table的话可以少写一次,不知道老师是否有不一样的见解。

有两种情况可以不需要这个 Is Celebrity Post Column。

  • 你提到的分表的情况,不用额外的 Column,而是使用两个 Table。更倾向于使用一个 Table 而不是两个。因为我们可以使用这个 Field 作为 Clustering Key 中的一个, 在读取速度上差异不大。
  • 我们假设要支持 Non-celebrity 和 Celebrity 身份的双向切换,如果只需要支持 Non-celebrity -> celebrity 的切换的话,我们可以不用这个 Is Celebrity Post Column,而是在 User Table 里加一个 Column 来表示用户是不是 Celebrity 就够了。(需要 heavily cached)。这样 Celebrity 是定义就从 Post 层面简化到了 User 层面。

谢谢老师的解答!

老师,这个地方,我觉得即使Is Celebrity Post Column是Clustering Key 中的一个, 用户还是会查询所有的partition来找到自己follow人的Is Celebrity Post为true的post(因为post table是按照authorid 做partition的),这样感觉 feed table的意义不大了啊,老师这个地方的性能提升我不是很懂?

这个地方我想了一下, feed service拿到我follow的所有人后,只有celebrity才会查询这个column用于normal people -> celebrity情况的去重,其他人不查,

这就是为什么 feed table 需要 is celebrity post 这个 column