首页 微博热点正文

刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券

简介

差不多十年前,跟着功用机的挑选和智能机的遍及,互联网开端进入移动互联网年代,最具代表性的产品便是微博、微信,以及后来的今日头条、快手等。这些移动化联网年代的新产品在曩昔几年间借着智能手机的风高速成长。

这些产品都是Feed流类型产品,由于Feed流一般是依照时刻“从上往下活动”,十分适合在移动设备端阅读,终究这一类运用就锋芒毕露,敏捷抢占了上一代产品的商场空间。

Feed流是Feed + 流,Feed的原意是饲料,Feed流的原意便是有人一向在往一个当地投递新鲜的饲料,假如需求饲料,只需求盯着投递点就能够了,这样就能连绵不断获取到新鲜的饲料。在信息学里边,Feed其实是一个信息单元,比方一条朋友圈状况、一条微博、一条咨询或一条短视频等,所以Feed流便是不断更新的信息单元,只需注重某些发布者就能获取到连绵不断的新鲜信息,咱们的用户也就能够在移动设备上逐条去阅读这些信息单元。

当时最盛行的Feed流产品有微博、微信朋友圈、头条的资讯引荐、快手抖音的视频引荐等,还有一些变种,比方私信、告知等,这些体系都是Feed流体系,接下来咱们会介绍怎么规划一个Feed流体系架构。

Feed流体系特色

Feed流实质上是一个数据流,是将 “N个发布者的信息单元” 经过 “注重联系刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券” 传送给 “M个接收者”。

Feed流体系是一个数据流体系,所以咱们中心要看数据。从数据层面看,数据分为三类,分别是:

  • 发布者的数据:发布者发生数据,然后数据需求依照发布者安排,需求依据发布者查到一切数据,比方微博的个人页面、朋友圈的个人相册等。
  • 注重联系:体系中个别间的联系,微博中是注重,是单向流,朋友圈是老友,是双向流。不管是单向仍是双向,当发布者发布一条信息时,该条信息的活动永久是单向的。
  • 接收者的数据:从不同发布者那里获取到的数据,然后经过某种次序(一般为时刻)安排在一起,比方微博的主页、朋友圈主页等。这些数据具有时刻热度特色,越新的数据越有价值,越新的数据就要排在最前面。

针对这三类数据,咱们能够有如下印度女儿界说:

  • 存储库:存储发布者的数据,永久保存。
  • 注重表:用户联系表,永久保存。
  • 同步库:存储接收者的时刻热度数据,只需求保存最近一段时刻的数据即可。
  • 规划Feed流体系时最中心的是确认清楚产品层面的界说,需求考虑的要素包含:
  • 产品用户规划:用户规划在十万、千万、十亿级时,规划难度和侧重点会不同。
  • 注重联系(单向、双写):假如是双向,那么就不会有大V,不然会有大V存在。
  • 上述是挑选数据存储体系最中心的几个考虑点,除此之外,还有一些需求考虑的:
  • 怎么完结Meta和Feed内容查找?
  • 尽管Feed流体系自身能够不需求查找,可是一个Feed流产品有必要要有查找,不然信息发现难度会加大,用户留存率会大幅下降。
  • Feed流的次序是时刻仍是其他分数,比方日本初中女生个人的喜爱程度?
  • 双向联系时由于联系很严密,一定是按时刻排序,就算一个联系很严密的人发了一条空音讯或许低价值音讯,那咱们也会需求注重了解的。
  • 单向联系时,那么或许就会存在大V,大V的粉丝数量理论极限便是整个别系的用户数,有一些产品会让一切用户都默许注重产品负责人,这种书画山风景区产品中,该负责人便是最大的大V,粉丝数便是用户规划。
  • 接下来,咱们看看整个Feed流体系怎么规划。

Feed流体系规划

上一节,咱们提早考虑了Feed流体系的几个要害点,接下来,在这一节,咱们自顶向下来规划一个Feed流体系。

1. 产品界说

第一步,咱们首要需求界说产品,咱们要做的产品是哪一种类型,常见的类型有:

  • 微博类
  • 朋友圈类
  • 抖音类
  • 私信类

接着,再具体看一下这几类产品的异同:

上述比照中,只比照各类产品最中心、或许最底子特色,其他非必须的不考虑。比方微博中相互注重后便是双向注重了,可是这个不是微博的立命之本,仅仅弥补,无法撼动底子。

从上面表格能够看出来,首要分为两种区别:

  • 注重联系是单向仍是双向:
  • 如石兰大露八字奶果是单向,那么或许就会存在大V效应,一起时效性能够低一些,比方到分钟等级;
  • 假如是双向,那便是老友,老友的数量有限,那么就不会有大V,由于每个人的精力有限,他不或许主动加几千万的老友,这时分由于联系更精细,时效性要求会更高,需求都秒等级。
  • 排序是时刻仍是引荐:
  • 用户对feed流最简略接受的便是时刻,现在大部分都是时刻。
  • 可是有一些场景,是从全网数据里边依据用户的喜爱给用户引荐和用户喜爱度最匹配的内容,这个时分就需求用引荐了,这种状况一般也会省掉掉注重了,相关于注重了全网一切用户,比方抖音、头条等。
  • 确认了产品类型后,还需求继续确认的是体系规划方针:需求支撑的最大用户数是多少?十万、百万、千万仍是亿?

用户数很少的时分,就比较简略,这儿咱们首要考虑 亿级用户 的状况,由于假如体系能支撑亿级,那么其他量级也能支撑。为了支撑亿级规划的用户,首要子体系选型时需求考虑水平扩展才干以及一些子体系的可用性和牢靠性了,由于体系大了后,任何一个子体系的不安稳都很简略涉及整个别系。

2.刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券 存储

咱们先刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券来看看最重要的存储,不管是哪种同步形式,在存储上都是相同的,咱们界说用户音讯的存储为存储库。存储库首要满意三个需求:

  • 牢靠存储用户发送的音讯,不能丢掉。不然就找不到自己从前发布到朋友圈状况了。
  • 读莲蕊取某个人发布过的一切音讯,比方个人主页等。
  • 数据永久保存。

所以,存储库最重要的特征便是两点:

  • 数据牢靠、不丢掉。
  • 由于数据要永久保存,数据会一向增加,所以要斗破天穹之碧落黄泉易于水平扩展。

综上,能够选为存储库的体系大概有两类:

  • 关于牢靠性,散布式NoSQL的牢靠性要高于联系型数据库,这个或许有违许多人的认知。首要是联系型数据库开展很长时刻了,且很成熟了,数据放在上面咱们定心,而散布式NoSQL数据库开展晚,运用的并不多,不太信赖。可是,散布式NoSQL需求存储的数据量更多,对数据牢靠性的要求也加严厉,所以一般都是存储三份,牢靠性会更高。现在在一些云厂商中的联系型数据库由于选用了和散布式NoSQL相似的方法,所以牢靠性也得到了大幅进步。
  • 水平扩展才干:关于散布式NoSQL数据库,数据天然是散布在多台机器上,当一台机器上的数据量增大后,能够经过主动割裂两部分,然后将其间一半的数据迁移到另一台机器上去,这样就做到了线性扩展。而联系型数据库需求在扩容时再次分库分表。

所以,结论是:

  • 假如是自建体系,且不具有散布式NoSQL数据库运维才干,且数据规划不大,那么能够运用MySQL,这样能够撑一段时刻。
  • 假如是依据云服务,那么就用散布式NoSQL,比方Tablestore或Bigtable。
  • 假如数据规划很大,那么也要用散布式NoSQL,不然便是走上一条不归路。

假如运用Tablestore,那么存储库表规划结构如下:

到此,咱们确认了存储库的选型,那么体系架构的概括有了:

3. 同步

体系规划和产品类型,以及存储体系确认后,咱们能够确认同步方法,常见的方法有三种:

  • 推形式(也叫写分散):和姓名相同,便是一种推的方法,发送者发送了一个音讯后,立行将这个音讯推送给接收者,可是接收者此刻不一定在线,那么就需求有一个当地存储这个数据,这个存储的当地咱们称为:同步库。推形式也叫写分散的原因是,一个音讯需求发送个多个粉丝,那么这条音讯就会仿制多份,写扩大,所以也叫写分散。这种形式下,对同步库的要求便是写入才干极强和安稳。读取的时分由于音讯现已发到接收者的收件箱了,只需求读一次自己的收件箱即可,读恳求的量极小,所以对读的QPS需求不大。概括下,推形式中对同步库的要求只要一个:写入才干强。
  • 拉形式(也叫读分散):这种是一种拉的方法,发送者南通通州气候发送了一条音讯后,这条音讯不会当即推送给粉丝,而是写入自己的发件箱,当粉丝上线后再去自己注重者的发件箱里边去读取,一条音讯的写入只要一次,可是读取最多会和粉丝数相同,读会扩大,所以也叫读分散。拉形式的读写份额刚好和写分散相反,那么对体系的要求是:读取才干强。别的这儿还有一个误区,许多人在最开端规划feed流体系时,首要想到的是拉形式,由于这种和用户的运用体感是相同的,可是在体系规划上这种方法有不少痛点,最大的是每个粉丝需求记载自己前次读到了注重者的哪伯妮丝条音讯,假如有1000个刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券注重者,那么这个人需求记载1000个方位信息,这个量和注重量成正比的,远比用刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券户数要大的多,这儿要特别注意,尽管在产品前期数据量少的时分这种方法能够敷衍,可是量大了后就会因小失大,因小失大,牢记牢记。
  • 推拉结合形式:推形式在单向联系中,由于存在大V,那么一条音讯或许会分散几百万次,可是这些用户中或许有一半多是僵尸,永久不会上线,那么就存在资源糟蹋。而拉形式下,在体系架构上会很杂乱,一起需求记载的方位信息是天量,欠好处理,尤其是用户量多了后会成为第一个毛病点。依据此,所以有了推拉结合形式,大部分用户的音讯都是写分散,只要大V是读分散,这样既操控了资源糟蹋,又减少了体系规划杂乱度。可是全体规划杂乱度仍是要比推形式杂乱。

用图表比照:

介绍完同步形式中一切场景和形式后,咱们概括下:

  • 假如产品中是双向联系,那么就选用推形式。
  • 假如产品中是单向联系,且用户数少于1000万,那么也选用推形式,足够了。
  • 假如产品是单向联系,单用户数大于10进贡娘娘00万,那么选用推拉结合形式,这写真艺术时分能够从推形式演进过来,不需求额定从头推翻重做。
  • 永久不要只用拉形式。
  • 假如是一个草创企业,先用推形式,快速把体系规划出来,然后让产品去验证、迭代,等客户数大幅上涨到1000万后,再考虑晋级为推拉调集形式。
  • 假如是按引荐排序,那么是别的的考虑了,架构会彻底不相同,这个后边专门文章介绍。

假如挑选了Tablestore,那么同步库表规划结构如下:

确认了同步库的架构如下:

4. 元数据

前面介绍了同步和存储后,整个Feed流体系的根底功用完结了,可是关于一个完好Feed流产品而言,还缺元数据部分,接下来,咱们看元数据怎么处理:

Feed流体系中的元数据首要包含:

  • 用户概况和列表。
  • 注重或老友联系。
  • 推送session池。

咱们接下来逐个来看。

4.1 用户概况和列表

首要是用户的概况,包含用户的各种自界说特色和体系附加的特色,这部分的要求只需求依据用户ID查询到就能够了。

能够选用的散布式NoSQL体系或许联系型数据库都能够。

假如运用NoSQL数据库Tablestore,那么用户概况表规划结构如下:

4.2 注重或老友联系

这部分是存储联系,查询的时分需求支撑查询注重列表或许粉丝列表,或许厚道告知我是谁直接老友列表,这儿就需求依据多个特色列查询需求索引才干,这儿,存储体系也能够选用两类,联系型、散布式NoSQL数据库。

  • 假如现已有了联系型数据库了,且数据量较少,则挑选联系型数据库,富大龙饶敏莉女儿比方MySQL等。
  • 假如数据量比较大,这个时分就有两种挑选:
  1. 运用具有索引的体系,比方云上的Tablestore,更简略,吞吐更高,扩容才干也同时处理了。
  2. 需求散布式事务,能够选用支撑散布式事务的体系,比方散布式联系型数据库。

假如运用Tablestore,那么注重联系表规划结构如下:

Table:user_relation_table

多元索引的索引结构:

查询的时分:

  • 假如需求查询某个人的粉丝列表:运用TermQuery查询固定user_id,且依照timestamp排序。
  • 假如需求查询某个人的注重列表:运用TermQuery查询固定follow_user_id,且依照timestamp排序。
  • 当时数据写入Table后,需求5~10秒钟推迟后会在多元索引中查询到,未来会优化到2秒以内。

除了运用多元索引外,还能够运用GlobalIndex。

4.3 推送session池

考虑一个问题,发送者将音讯发送后,接收者怎么知道自己有新音讯来了?客人交户端周期性去改写?假如是这姿态,那么体系的读恳求压力会跟着客户端增加而增加,这时分就会有一个危险,比方平常的设备在线率是20%~30%,忽然某天渠道爆发了一个热门消刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券息,很多休眠设备登陆,这个时分就会呈现“查询风暴”,一会儿就把体系打垮了,一切的用户都不能用了。

处理这个问题的一个思路是,在服务端保护一个推送session池,这个里边记载哪些用户在线,然后当用户A发送了一条音讯给用户B后,服务端在写入存储库和同步库后,再告知一下session池中的用户B的session,告知他:你有新音讯了。然后session-B再去读音讯,然后有音讯后将音讯推送给客户端。或许有音讯后给客户端推送一下有音讯了,客户端再去拉。

这个session池运用在同步中,可是实质仍是一个元数据,一般只需求存在于内存中即可,可是考虑到failover状况,那就需求耐久化,这部分数据由于只需求指刷牙出血,架构 - 规划一个超级牛逼的 Feed 流体系,国海证券定单Key查询,用散布式NoSQL或联系型数据库都能够,一般复用政和洞宫山当时的体系即可。

假如运用Tablestore,那么session表规划结构如下:

5. 谈论

除了私信类型外,其他的feed流类型中,都有谈论功用,谈论的特色和存储库差不多,可是多了一层联系:被谈论的音讯,所以只需将谈论依照被被谈论音讯分组安排即可,然后查询时也是一个规划查询就行。这种查询方法很简略,用不到联系型数据库中杂乱的事务、join等功用,很适合用散布式NoSQL数据库来存储。

所以,一般的挑选方法便是:

  • 假如体系中现已有了散布式NoSQL数据库,比方Tablestore、Bigtable等,那么直接用这些即可。
  • 假如没有上述体系,那么假如有MySQL等联系型数据库,那就选联系型数据库即可。
  • 假如挑选了Tablestore,那么“谈论表”规划结构如下:

假如需求查找谈论内容,那么对这张表树立多元索引即可。

6. 赞

最近几年,“赞”或“like”功用很盛行,赞功用的完结和谈论相似,仅仅比谈论少了一个内容,所以挑选方法和谈论相同。

假如挑选了Tablestore,那么“赞表”规划结构同谈论表,这儿就不再赘述了。

体系架构中加了元数据体系后的架构如下:

7. 查找

到此,咱们现已介绍完了Feed流体系的主题架构,Feed流体系算是完结了。可是Feed流产品上还未完毕,关于一切的feed流产品都需求有查找才干,比方下面场景:

  • 微博中的查找用户。
  • 查找微博内容。
  • 微信中查找老友等。

这些内容查找只需求字符匹配到即可,不需求十分杂乱的相关性算法,所以只需求有能支撑分词的检索功用即可,所以一般有两种做法:

运用查找引擎,将存储库的内容和用户信息表内容推送给查找体系,查找的时分直接拜访查找体系。

运用具有全文检索才干的数据库,比方最新版的MySQL、MongoDB或许Tablestore。

所以,挑选的准则如下:

  • 假如存储库运用了MySQL或许Tablestore,那么直接挑选这两个别系就能够了。
  • 假如整个别系都没运用MySQL、Tablestore,且现已运用了查找体系,那么能够直肉H接复用查找体系厚夫厚夫规划顾问公司,其他场景都不应该再额定加一个查找体系进来,徒添杂乱度。

假如运用Tablestore,那么只需求在相应表上树立多元索引即可:

  • 假如需求对用户名支撑查找,那么需求对user_table树立多元索引,其间的nick_name需求是Text类型,且单字分词。
  • 假如需求对Feed流内容支撑查找,那么需求对存储库表:store_table树立多元索引,这样就能直接对Feed流内容进行各种杂乱查询了,包含多条件挑选、全文检索等。

体系架构中加了查找功用后的架构如下:

8封成瑾. 排序

现在的Feed流体系中的排序方法有两种,一种是时刻,一种是分数。

咱们常用的微博、朋友圈、私信这些都是时刻线类型的,由于这些产品界说中,需求咱们主动注重某些人后才会看到这些人宣布的内容,这个时分,最重要的是实时性,而不是发布质量,就算注重人发布了一条废物信息,咱们也会被迫看到。这种类型的产品适用于依照时刻线排序。这一篇咱们介绍的架构都是依据时刻类型的。

别的一种是不需求注重任何人,我简筑翎们能看到的都是体系期望咱们看到的,体系在后台会剖析咱们的每个人的喜好,然后给每个人推送差异化的、各自喜爱的内容,这一种的架构和依据时刻的彻底不相同,咱们在后续的引荐类型中专门介绍。

9. 删去Feed内容

在Feed流运用中有一个问题,便是假如用户删去了之前宣布的内容,体系该怎么处理?由于体系里边有写分散,那么删去的时分是不是也要写分散一遍?这样的话,删去就不及时了,很难应对法律法规要求的快速删去。

针对这个问题,咱们在之前规划的时分,同步表中只要音讯ID,没有音讯内容,在用户读取的时分需求到存储库中去读音讯内容,那么咱们能够直接删去存储库中的这一条音讯,这样用户读取的时分运用音讯ID是读不到数据的,也就相当于删去的内容,并且删去速度会很快。除了直接删去外,别的一种方法是逻辑删去,关于删去的feed内容,只做符号,当查询到带有符号的数据时就以为删去了。

10. 更新Feed内容

更新和删去Feed处理逻辑相同,假如运用了支撑多版别的存储体系,比方Tablestore,那么也能够支撑修改版别,和现在的微博相同。

11. 总结

上面介绍了不同子功用的特色和体系要求,能满意需求的体系首要有两类,一类是阿里云的Tablestore单体系,一类是开源组件组成的组合体系。

  • 开源组件组成的组合体系:包含MySQL、Redis、HBase等,这些体系单个都不能处理Feed流体系中遇到的问题,需求组合在一起,各司其职才干完结一个Feed流体系,适用于热心开源体系,人多且喜爱运维操作的团队。
  • Tablestore单体系:只运用Tablestore单个别系就能处理上述的一切问题,这时分必定有人要问?你是不是在吹嘘?这儿不是吹嘘,Tablestore在三年前就现已开端注重Feed流类型事务,之前也宣布过多篇文章介绍,功用上也在专门为Feed流体系特别定制规划,所以到今日,只运用Tablestore一款产品,是能够满意陈曾德上述需求的。挑选Tablestore做Feed流体系的用户具有以下一些特征:
  • 产品规划方针规划大,千万级或亿级。
  • 不喜爱运维,喜爱专心于开发。
  • 高效率团队,期望尽快将产品完结落地。
  • 期望一了百了,未来体系跟着用户规划增加能够主动扩容。
  • 期望能按量付费,用户少的时分费用低,等用户增加起来后费用在跟从用户数增加。
  • 假如具有上述四个特征的任何一个,那么都是适合于用Tablestore。


版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

程愫,政务出行有了同享轿车,百多邦软膏的作用

  • 手术后吃什么伤口愈合快,应对药品缺少有了技能攻略,石家庄地铁