差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。
这些产品都是Feed流类型产品,由于Feed流一般是按照时间“从上往下流动”,非常适合在移动设备端浏览,最终这一类应用就脱颖而出,迅速抢占了上一代产品的市场空间。
Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备上逐条去浏览这些信息单元。
当前最流行的Feed流产品有微博、微信朋友圈、头条的资讯推荐、快手抖音的视频推荐等,还有一些变种,比如私信、通知等,这些系统都是Feed流系统,接下来我们会介绍如何设计一个Feed流系统架构。
Feed流本质上是一个数据流,是将 “N个发布者的信息单元” 通过 “关注关系” 传送给 “M个接收者”。
Feed流系统是一个数据流系统,所以我们核心要看数据。从数据层面看,数据分为三类,分别是:
针对这三类数据,我们可以有如下定义:
设计Feed流系统时最核心的是确定清楚产品层面的定义,需要考虑的因素包括:
如何实现Meta和Feed内容搜索?
Feed流的顺序是时间还是其他分数,比如个人的喜好程度?
上一节,我们提前思考了Feed流系统的几个关键点,接下来,在这一节,我们自顶向下来设计一个Feed流系统。
第一步,我们首先需要定义产品,我们要做的产品是哪一种类型,常见的类型有:
接着,再详细看一下这几类产品的异同:
上述对比中,只对比各类产品最核心、或者最根本特点,其他次要的不考虑。比如微博中互相关注后就是双向关注了,但是这个不是微博的立命之本,只是补充,无法撼动根本。
从上面表格可以看出来,主要分为两种区分:
关注关系是单向还是双向:
用户数很少的时候,就比较简单,这里我们主要考虑 亿级用户 的情况,因为如果系统能支持亿级,那么其他量级也能支持。为了支持亿级规模的用户,主要子系统选型时需要考虑水平扩展能力以及一些子系统的可用性和可靠性了,因为系统大了后,任何一个子系统的不稳定都很容易波及整个系统。
我们先来看看最重要的存储,不管是哪种同步模式,在存储上都是一样的,我们定义用户消息的存储为存储库。存储库主要满足三个需求:
所以,存储库最重要的特征就是两点:
综上,可以选为存储库的系统大概有两类:
关系型数据库(分库分表) |
---|
如果使用Tablestore,那么存储库表设计结构如下:
到此,我们确定了存储库的选型,那么系统架构的轮廓有了:
系统规模和产品类型,以及存储系统确定后,我们可以确定同步方式,常见的方式有三种:
Redis、memcache等缓存系统或搜索系统(推荐排序场景) |
介绍完同步模式中所有场景和模式后,我们归纳下:
如果选择了Tablestore,那么同步库表设计结构如下:
其他内容,同步库中不需要包括消息内容。 |
确定了同步库的架构如下:
前面介绍了同步和存储后,整个Feed流系统的基础功能完成了,但是对于一个完整Feed流产品而言,还缺元数据部分,接下来,我们看元数据如何处理:
Feed流系统中的元数据主要包括:
4.1 用户详情和列表
主要是用户的详情,包括用户的各种自定义属性和系统附加的属性,这部分的要求只需要根据用户ID查询到就可以了。
可以采用的分布式NoSQL系统或者关系型数据库都可以。
如果使用NoSQL数据库Tablestore,那么用户详情表设计结构如下:
主键列,用于唯一确定一个用户 | 用户昵称,用户自定义属性 | 用户性别,用户自定义属性 | 其他属性,包括用户自定义属性列和系统附加属性列。Tablestore是FreeSchema类型的,可以随时在任何一行增加新列而不影响原有数据。 |
4.2 关注或好友关系
这部分是存储关系,查询的时候需要支持查询关注列表或者粉丝列表,或者直接好友列表,这里就需要根据多个属性列查询需要索引能力,这里,存储系统也可以采用两类,关系型、分布式NoSQL数据库。
如果数据量比较大,这个时候就有两种选择:
如果使用Tablestore,那么关注关系表设计结构如下:
除了使用多元索引外,还可以使用GlobalIndex。
思考一个问题,发送者将消息发送后,接收者如何知道自己有新消息来了?客户端周期性去刷新?如果是这样子,那么系统的读请求压力会随着客户端增长而增长,这时候就会有一个风险,比如平时的设备在线率是20%~30%,突然某天平台爆发了一个热点消息,大量休眠设备登陆,这个时候就会出现“查询风暴”,一下子就把系统打垮了,所有的用户都不能用了。
解决这个问题的一个思路是,在服务端维护一个推送session池,这个里面记录哪些用户在线,然后当用户A发送了一条消息给用户B后,服务端在写入存储库和同步库后,再通知一下session池中的用户B的session,告诉他:你有新消息了。然后session-B再去读消息,然后有消息后将消息推送给客户端。或者有消息后给客户端推送一下有消息了,客户端再去拉。
这个session池使用在同步中,但是本质还是一个元数据,一般只需要存在于内存中即可,但是考虑到failover情况,那就需要持久化,这部分数据由于只需要指定单Key查询,用分布式NoSQL或关系型数据库都可以,一般复用当前的系统即可。
设备ID,同一个用户可能会有多个设备,不同设备的读取位置可能不一致,所以这里需要一个设备ID。如果不需要支持多终端,则这一列可以省略。 | 该接收者已经推送给客户端的最新的顺序ID |
除了私信类型外,其他的feed流类型中,都有评论功能,评论的属性和存储库差不多,但是多了一层关系:被评论的消息,所以只要将评论按照被被评论消息分组组织即可,然后查询时也是一个范围查询就行。这种查询方式很简单,用不到关系型数据库中复杂的事务、join等功能,很适合用分布式NoSQL数据库来存储。
所以,一般的选择方式就是:
微博ID或朋友圈ID等消息的ID |
如果需要搜索评论内容,那么对这张表建立多元索引即可。
最近几年,“赞”或“like”功能很流行,赞功能的实现和评论类似,只是比评论少了一个内容,所以选择方式和评论一样。
如果选择了Tablestore,那么“赞表”设计结构同评论表,这里就不再赘述了。
系统架构中加了元数据系统后的架构如下:
到此,我们已经介绍完了Feed流系统的主题架构,Feed流系统算是完成了。但是Feed流产品上还未结束,对于所有的feed流产品都需要有搜索能力,比如下面场景:
这些内容搜索只需要字符匹配到即可,不需要非常复杂的相关性算法,所以只需要有能支持分词的检索功能即可,所以一般有两种做法:
使用搜索引擎,将存储库的内容和用户信息表内容推送给搜索系统,搜索的时候直接访问搜索系统。
使用具备全文检索能力的数据库,比如最新版的MySQL、MongoDB或者Tablestore。
所以,选择的原则如下:
如果使用Tablestore,那么只需要在相应表上建立多元索引即可:
系统架构中加了搜索功能后的架构如下:
目前的Feed流系统中的排序方式有两种,一种是时间,一种是分数。
我们常用的微博、朋友圈、私信这些都是时间线类型的,因为这些产品定义中,需要我们主动关注某些人后才会看到这些人发表的内容,这个时候,最重要的是实时性,而不是发布质量,就算关注人发布了一条垃圾信息,我们也会被动看到。这种类型的产品适用于按照时间线排序。这一篇我们介绍的架构都是基于时间类型的。
另外一种是不需要关注任何人,我们能看到的都是系统希望我们看到的,系统在后台会分析我们的每个人的爱好,然后给每个人推送差异化的、各自喜欢的内容,这一种的架构和基于时间的完全不一样,我们在后续的推荐类型中专门介绍。
在Feed流应用中有一个问题,就是如果用户删除了之前发表的内容,系统该如何处理?因为系统里面有写扩散,那么删除的时候是不是也要写扩散一遍?这样的话,删除就不及时了,很难应对法律法规要求的快速删除。
针对这个问题,我们在之前设计的时候,同步表中只有消息ID,没有消息内容,在用户读取的时候需要到存储库中去读消息内容,那么我们可以直接删除存储库中的这一条消息,这样用户读取的时候使用消息ID是读不到数据的,也就相当于删除的内容,而且删除速度会很快。除了直接删除外,另外一种办法是逻辑删除,对于删除的feed内容,只做标记,当查询到带有标记的数据时就认为删除了。
更新和删除Feed处理逻辑一样,如果使用了支持多版本的存储系统,比如Tablestore,那么也可以支持编辑版本,和现在的微博一样。
上面介绍了不同子功能的特点和系统要求,能满足需求的系统主要有两类,一类是阿里云的Tablestore单系统,一类是开源组件组成的组合系统。
Tablestore单系统:只使用Tablestore单个系统就能解决上述的所有问题,这时候肯定有人要问?你是不是在吹牛? 这里不是吹牛,Tablestore在三年前就已经开始重视Feed流类型业务,之前也发表过多篇文章介绍,功能上也在专门为Feed流系统特别定制设计,所以到今天,只使用Tablestore一款产品,是可以满足上述需求的。选择Tablestore做Feed流系统的用户具有以下一些特征:
上面我们介绍了Feed流系统的设计理论,具体到不同的类型中,会有不同的侧重点,下面会逐一介绍。
朋友圈是一种典型的Feed流系统,关系是双写关系,关系有上限,排序按照时间,如果有个人持续产生垃圾内容,那就只能屏蔽掉TA,这一种类型就是典型的写扩散模型。
我们接下来会在文章《朋友圈类系统架构设计》中详细介绍朋友圈类型Feed流系统的设计。
微博也是一种非常典型的Feed流系统,但不同于朋友圈,关系是单向的,那么也就会产生大V,这个时候就需要读写扩散模式,用读扩散解决大V问题。同时,微博也是主动关注类型的产品,所以排序也只能是时间,如果按照推荐排序,那么效果就会比较差。
接下里会在文章《微博类系统架构设计》中详细介绍微博类型Feed流系统的设计。
头条是最近几年快速崛起的一款应用,在原有微博的Feed流系统上产生了进化,用户不需要主动关注其他人,只要初始浏览一些内容后,系统就会自动判断出你的喜好,然后后面再根据你的喜好给你推荐你可能会喜好的内容,训练时间长了后,推送的内容都会是你最喜欢看的。
后面,我们会在文章《头条类系统架构设计》中详细介绍头条类型Feed流系统的设计。
私信也算是一种简单的Feed流系统,或者也可以认为是一种变相的IM,都是单对单的,没有群。我们后面也会有一篇文章《私信类系统架构设计》中做详细介绍。
上面我们介绍了Feed流系统的整体框架,主要是产品定义、同步、存储、元数据、评论、赞、排序和搜索等内容,由于篇幅有限,每一章节都介绍的比较简单。读者如果对某一部分看完后仍然有疑问,可以继续再文后提问,我会继续去完善这篇文章,希望未来读者看完这篇文章后,就可以轻轻松松设计出一个亿级规模的Feed流系统。
另外,我们也欢迎有兴趣的读者一起来完成这个系列,帮忙实现朋友圈、微博、头条或者私信类型的文章,有任何问题都欢迎来讨论。
在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈,微博,就是一种非常典型的Feed流产品,还有图片分享网站Pinterest,花瓣网等又是另一种形式的Feed流产品。除此之外,很多App的都会有一个模块,要么叫动态,要么叫消息广场,这些也是Feed流产品,可以说,Feed流产品是遍布天下所有的App中。
我们在讲如何设计Feed流系统之前,先来看一下Feed流中的一些概念:
Feed流系统有一些非常典型的特点,比如:
上面的就是Feed流产品的一些特点,下面我们来看一下Feed流系统的分类。
Feed流的分类有很多种,但最常见的分类有两种:
Feed流中的Feed不多,但是每个Feed都很重要,都需要用户看到
。
上面两种是最典型,也是最常见的分类方式,另外的话,也有其他的分类标准,在其他的分类标准中的话,会多出两种类型:
上面介绍了Feed流系统的概念,特征以及分类,接下来开始进入关键部分:如何实现一个千万级Feed流系统。由于系统中的所有用户不可能全部在线,且不可能同时刷新和发布Feed,那么一个能支撑千万量级Feed流的系统,其实在产品上可以支撑上亿的用户。
如果要设计一个Feed流系统,最关键的两个核心,一个是存储,一个是推送。
我们先来看存储,Feed流系统中需要存储的内容分为两部分,一个是账号关系(比如关注列表),一种是Feed消息内容。不管是存储哪一种,都有几个问题需要考虑:
我们后面再解答这三个问题,先继续看推送
推送系统需要的功能有两个,一个是发布Feed,一个是读取Feed流。对于提送系统,仍然有一些问题需要在选型之前考虑:
再解答这些问题之前,我们先来大概了解下阿里云的表格存储TableStore。
表格存储(TableStore)是阿里云自主研发的专业级分布式NoSQL数据库,是基于共享存储的高性能、低成本、易扩展、全托管的半结构化数据存储平台,
支撑互联网和物联网数据的高效计算与分析。
目前不管是阿里巴巴集团内部,还是外部公有云用户,都有成千上万的系统在使用。覆盖了重吞吐的离线应用,以及重稳定性,性能敏感的在线应用。目前使用的系统中,有些系统每秒写入行数超过3500万行
,每秒流量超过5GB
,单表总行数超过10万亿行
,单表数据量超过10PB
。
表格存储的具体的特性可以看下面这张图片。
这里就不详细介绍表格存储(TableStore)的功能和特性了,有兴趣的话可以到官网页面和云栖博客了解,地址如下:
我们接下来解决之前提出来的问题。
Feed流系统中需要存储的系统有两类,一类是账号关系(比如关注列表),一类是Feed消息。
我们先来看账号关系(比如关注列表)的存储,对于账号关系,它有一些特点:
变长链表
,长度可达亿级别
。
数据量比较大
,但是关系极其简单
。
最适合存账号关系(关注列表)的系统应该是分布式NoSQL数据库,原因是数据量极大,关系简单不需要复杂的join,性能要求高。
对内设计实现简单,对外用户体验好。
除了上面这些特点外,还有一个特点:
能满足有序性的分布式NoSQL数据库中,开源HBase就是一个,所以很多企业会选择开源HBase来存储账号关系,或者是关注列表。
这样虽然满足了上述四个特征,可以把系统搭建起来,但是会有一些麻烦的问题:
除此之外,阿里云的表格存储也属于有序性的分布式NoSQL数据库,之前有不少很有名的系统选择使用表格存储,在下面一些地方给系统带来了收益:
10万亿行+,10PB+
的数据量,再快的数据增长速度都不用担心。
主键列排序
,保证有序性和可预期性。
毫秒
级别,保证关注,取关的响应时间。
全托管
的分布式NoSQL数据库服务,无需任何运维
。
采用C++
实现,彻底无GC问题
,也就不会由于GC而导致较大的毛刺。
使用表格存储(TableStore)来存储账号关系会是一个比较好的选择。
接下来看一下Feed消息的存储。
Feed消息有一个最大的特点:
除此之外,还有一些其他特点:
根据上述这些特征,最佳的系统应该是具有主键自增功能的分布式NoSQL数据库
,但是在开源系统里面没有,所以常用的做法有两种:
目前业界有很多用户选择了关系系数据库+ 分库分表,包括了一些非常著名的Feed流产品,虽然这个架构可以运行起来,但是存在一些问题。
运维复杂性
。
极大耦合性
。
基于上述原因,一些技术公司开始考虑使用表格存储(TableStore),表格存储是一个具有自增主键功能的分布式NoSQL数据库,这样就只需要使用一种系统,除此之外还有以下的考虑:
无需分库分表
从上面看,使用TableStore的话,不管是在功能,性能,扩展性还是成本方面都要更加适合一些。
看完推送系统选择后,我们再来看看推送方案的选择。
我们先来回顾下之前说的Feed流系统最大的特点:
除此之外,还有一个方面会被推送方案影响:
推送方案
决定,其他的任何操作都只能是优化,质量量变,无法质变。
在推送方案里面的,有两种方案,分别是:
读扩散
。
写扩散
。
对于拉方案和推方案,他们在很多方面完全相反,在看对比之前有一点要强调下:
粉丝的关注页(收件箱) | |
所有关注者的个人页Timeline | |
放大读:读写比例到1万:1 | 放大写减少读:读写比例到50:50 |
在上面的对比中可以明显看出来,推模式要远远比拉模式更好一些,但是也有一个副作用:
针对这个缺点,可以从两个方面考虑:
想省点钱,那继续可以优化:
通过上述两个方案的对比后,总结下各个方案的适用场景:
上面了解了推送方案,接下来看下推送系统选择
如果要实现一个千万量级的Feed流产品,那么推送系统需要具备一些特点:
从上述特点来看,需要的推送系统最好是一个性能极佳,又可靠的有自增功能的NoSQL系统,所以,业内一般如果选择开源系统的话,会在选择了关系型数据库作为存储系统的基础上,选择开源Redis,这样就能覆盖上述的几个特征,也能保证Feed流系统正常运行起来,但是也会带来一些其他问题:
成本上升了以后,就有架构师开始考虑是否可以节省一些成本,要节省成本只能是减少开源Redis里面存储的数据量,一般有两种做法,这两种做法都能减少存入Redis中的数据量:
上述两个方案虽然可以节省成本,但是是以牺牲用户体验为代价的,最终需要在成本和用户体验之间权衡。
除了使用开源系统外,还可以使用阿里云的表格存储(TableStore),有不少用户选择TableStore作为推送系统的原因无非下面几点:
优化写
,高性能实例极大优化读
。
上面说了使用开源Redis和阿里云TableStore的异同,如果使用开源可以用Redis,如果选择阿里云自研NoSQL数据库,可以使用TableStore。
下面我们来看一下使用TableStore的架构图,这里为了通用性,选用推拉结合的方式,推模式更加简单。
我们先来看中间黑色框中的部分,这部分是使用TableStore的数据,从左往右分别是:
当你发布一条Feed消息的时候,流程是这样的:
当刷新自己的Feed流的时候,流程是这样的:
至此,使用推拉结合方式的发布,读取Feed流的流程都结束了。
如果只是用推模式了,则会更加简单:
个性化和定向广告是两种很强烈的产品需求。个性化可以服务好用户,增大产品竞争力和用户粘性,而定向广告可以为产品增加盈利渠道,而且还可以不招来用户反感,那么这两种方式如何实现呢? 在Feeds流里面这两种功能的实现方式差不多,我们以定向广告为例来说明:
上面是定向广告的一种比较简单的实现方式,其他方式就不再赘述了。
上面我们详细说了使用TableStore作为存储和推送系统的架构,接下来我们看看新架构能给我们带来多大收益。
如果使用大V/普通用户的切分方式,大V使用拉模式,普通用户使用推模式,那么这种架构就会存在一种很大的风险。
比如某个大V突然发了一个很有话题性的Feed,那么就有可能导致整个Feed产品中的所有用户都没法读取新内容了,原因是这样的:
结果就是,平时正常流量只有用户群A
,结果现在却是用户群A + 用户群B+ 用户群C
,流量增加了好几倍,甚至几十倍,导致读3路径的服务模块被打到server busy或者机器资源被打满,导致读取大V的读3路径无法返回请求,如果Feed产品中的用户都有关注大V,那么基本上所有用户都会卡死在读取大V的读3路径上,然后就没法刷新了。
所以这里设计的时候就需要重点关心下面两点:
接下来我们来实现一个消息广场的功能。很多App中都有动态或消息广场的功能,在消息广场中一般有两个Tab,一个是关注人,一个是广场,我们这里重点来看关注人。
接着,我们看看角色和每个角色需要的功能:
Feed消息中至少需要包括下面内容:
上面展示了如何使用表格存储TableStore的API来实现。这个虽然只用到几个接口,但是仍然需要学习表格存储的API和特性,还是有点费时间。
为了更加易用性,我们接下来会提供Feeds流完整解决方案,提供一个LIB,接口直接是add_activity(),follow()和get_activity()类似的接口,使用上会更加简单和快捷。
前面讲述的都是Timeline类型的Feed流类型,但是还有一种Feed流类型比较常见,那就是新闻推荐,图片分享网站常用的Rank类型。
我们再来回顾下Rank类型擅长的领域:
我们先来看一种架构图:
每个用户有两个收件箱:
上述两种方式是实现Rank的比较简单,常用的方式。
从上面的内容来看,表格存储(TableStore)在存储方面可以支持10PB级,推送方面可以支撑每秒千万的TPS/QPS,在Feed流系统中可以发挥很大的价值。
目前,已经有不少著名公司在使用表格存储(TableStore)来构建他们自己的Feed流系统,最终为系统,产品,公司都带来了不少收益。
移动互联网时代,微信和微博已经成为这个时代的两大支柱类社交应用。
这两类应用,其中一个是IM产品,一个是Feed流产品,微信的朋友圈也属于Feed流。
如果再细心去发现,会发现基本所有移动App都有Feed流的功能:消息广场、个人关注、通知、新闻聚合和图片分享等等。各种各样的Feed流产品占据了我们生活的方方面面。
IM和Feed流功能已经基本成为所有App标配,如何开发一个IM或者Feed流功能是很多架构师、工程师要面临的问题。虽然是一个常见功能,但仍然是一个巨大的挑战,要考虑的因素非常多,比如:
为了解决上述问题,我们之前推出了三篇文章来阐述:
:介绍了使用Table Store主键列自增功能后,对传统IM架构带来的巨大冲击,在稳定性,性能,成本,架构复杂度等多个方面都产生了巨大收益。
上述三篇文章推出后,用户反响很好,在各个平台的传播很广,为很多用户提供了设计一款IM和Feed流产品的架构思路,但是从这里到完全实现一个可靠的IM、Feed流系统平台还有很长的路,比如:
针对上述三个问题,在中引入了一个逻辑模型概念:Timeline模型。
在《现代IM系统中消息推送和存储架构的实现》中基于IM系统提出了Timeline模型,进一步会发现Timeline模型适用场景可以更广泛:
IM和Feed流产品完全匹配上述四个特征,所以Timeline模型可以完全适用于IM和Feed流场景中。
下面我们来看看如何在各个场景中使用Timeline:
每个用户只有一个同步库Timeline,就算用户A在10个群里面,那么这个10个群的同步消息都是发送给用户A的这一个同步库Timeline中。
如果是微博,粉丝可能会达到上亿级别,这时候会比朋友圈稍微复杂些:
从上面分析可以看出来,不管是IM,还是Feed流产品都可以将底层的存储、同步逻辑抽象成一个对多个Timeline进行读写的模型。
有了Timeline概念模型后,从IM/Feed流应用映射到Timeline就比较容易了,但是从Timeline映射到存储、同步系统仍然很复杂,主要体现在:
这些问题涉及的内容光,细节多,深度大,坑较多等,整体上很繁杂,这一部分在耗费了大量人力之后,结果可能并不理想。
针对上述问题,只要存储系统和推送系统确定后,剩余的工作都是类似的,可以完全将经验封装起来成为一个LIB,将表结构设计,读写方式,隐患等等都解决好,然后供后来者使用,后来者可以不用再关心Timeline到底层存储系统之间的事情了。
目前已经开源在了GitHub上:。
Timeline层,提供最终的读写接口,用户操作的也是Timeline的接口。
有了Timeline LIB之后,如果要实现一个IM或者Feed流,只需要创建两种类型Timeline(存储类,同步类),然后调用Timeline的读写接口即可。
Timeline的接口主要分为三类:
使用之前,需要先实现一个满足自己业务特点的Message类,此Message类能表示业务中的一条完整消息。
需要实现IMessage的下列接口:
在一个IM或Feed流产品中,一般会有两个子系统,一个是存储系统,一个是同步系统。
需要为这两个系统各自生成一个Store对象。
当在IM或Feed流产品中读取最新消息时,就是对相应同步库Timeline的范围读取(scan)。
当在IM或Feed流产品中读取历史消息时,就是对相应存储库Timeline的范围读取(scan)。
如果是推拉结合的微博模式,则读取最新消息时,就是对相应存储库Timeline和同步库Timeline的同时范围读取(scan)。
这一节会演示下如何使用Timeline LIB实现IM的群组功能。
构造两个store,一个用来存储,一个用例同步。
user_A发一条群消息:“有人吗”。
user_C读取自己最新的同步消息
上面的示例演示了如何用Timeline LIB实现IM中的群组功能。其他的朋友圈,微博等也类似,这里就不赘述了。
我们目前在上实现两个场景的实例:
也欢迎大家共享其他场景的实现代码。
我们使用阿里云ECS做了性能测试,效果较理想。
不同接口的写入性能上,批量batch接口最快,其次是异步writeAsync,最后是同步write接口。
如果使用一台8核的ECS,只需要3秒钟就可以完成100万条消息的写入。
由于DistributeTimelineStore使用了Table Store作为存储和同步系统,Table Store是阿里云的一款服务化NoSQL服务,支持的TPS在理论上无上限,实际中仅受限于集群大小,所以整个Timeline LIB的写入能力和压力器的CPU成正比。
下面的图展示了不同机型上完成1000万条消息写入的延迟:
在一台8核ECS上只需要27秒就可以完成1000万写入,由于写入能力和CPU成线线性关系,如果用两台16核的,则只需要7秒就可以完成1000万消息的写入。
我们再来看一下scan读取的性能,读取20条1KB长度消息,LIB端延迟一直稳定在3.4ms,Table Store服务端延迟稳定在2ms。
这个量级和能力,可以撑得住目前所有的IM和Feed流产品的压力。
Timeline LIB的想法来源于Table Store的真实场景需求,并且为了用户可以更加简单的使用,增加了主键列自增功能。
如果用户希望使用其他系统,比如MySQL作为存储系统,可以实现IStore接口构造自己的Store类。我们也欢迎大家提供自己的各种Store层实现,最终希望为社交场景的架构师和开发者提供一套完整的易用性开发框架。
大家好,我是飘老师,我又来分享干货啦。近来身体欠佳,此文是我一边挂水一边敲下的,大家多担待哈~ 经常有网友问我说:“老师老师,看你做微商好几年了,咋一直这么有条不紊的呢?你是不是懂很多黑科技啊?能分享一下呗?”说到黑科技哥其实是颇有心得的。熟悉哥的人都知道,哥的座右铭是“每天进步一点点”,像一些基础的微信功能自然没啥好介绍的,今天,就列举几个做微商“日常必用”的实用隐藏功能和大家聊一下~ 1.微信私信聊天如何换行 众所周知,在朋友圈编辑文案时,右下角是有一个“换行”选项的。可是私信聊天时,如何实现文字的“换行”效果呢?如下图: 通常死板的方式就是登录微信电脑版,按“Ctrl+Enter”进行换行,可如果没有电脑的情况下,用手机如何直接换行呢?其实特别简单,在文字编辑栏输入文字后,“长按”,即可出现“换行”选项: 2.找不到的微信群如何找回 大家做微商都加过好多群,可是时间一久,群越来越多,有的群当时没保存,就找不到了。怎么找回呢?很简单。微信主页面点开右上角“发起群聊”,然后“选择一个群”。 这样所有你加入过的群,就全部显示啦! 3.检测同在一个群里的好友 进到一个新的微信群,想知道是否有认识的好友也在这个群里。可进行如下操作: 点击“通讯录”-“标签”-“新建标签”-“添加成员”-“从群里导入”-“选择指定微信群”。 这样,有哪些好友和你同在一个群里,就一目了然了。 此方法较适用于刚进入到一个新的群,提前了解一下情况(是否有认识的人)。这样在群里方便说什么,不方便说什么,提前心里就有数啦~ 4.如何设置醒目的备忘提醒 我们做微商平时事情多,一忙起来丢三落四,所以,很多重要的事宜必须做醒目的备忘提醒,比如“欠某某代理的xx箱货未发”、“某某顾客欠xx元货款未支付”,那么如何在微信上实现一个很醒目的提醒效果呢? 很简单,打开“微信收藏栏”,点开右上角,将需要记录的文字输入。 然后点开右上角,“在聊天中置顶”。 置顶后的效果如下,所记录的文字出现在微信主页聊天列表的最上端,这样就起到一个很醒目的提醒效果啦。 另外,好友的某一条私信也可以单独设置精确的时间提醒。长按某一条私信,“提醒”,即可设置详细的提醒时间,如下图: 设置完毕点击“设置提醒”即可。这样,我们在微信上的每一项工作都能做到有条不紊,再忙也不至于手忙脚乱、丢三落四啦。 5.给微信好友“加标记” 我们做微商,通讯录里好友多,时间越久,好友越多。而许多好友又经常会更换头像昵称,所以往往都记不清谁是谁了,以至于经常发生“误删”等现象。所以我经常会给好友名字前面加上相应的“标记”。 比如我卖大闸蟹时,所有我大闸蟹的代理,我都会做如下标记: 所有我大闸蟹的零售顾客,我都会做如下标记: 所有我学习班的学员,我都会做如下标记: 这样有了标记之后就方便多了,不论这些好友的头像昵称再怎么换,我只要认标记。我通过名字前的标记就知道此人和我是什么关系,非常方便。 同时,加标记不仅只是用来识别好友,更重要的意义是,当我们进行“微信群发”时,会给我们带来极大的便利! 比如,你需要群发一条通知给你的所有代理,那么我们需要“打开群发”-“新建群发”,然后“选择好友”,如下图: 那么这时候,你如何将你所有的代理一次筛选出来全部选中呢?只是一个一个认,一个一个找吗?这样效率就太低了。而有了标记之后就容易多了,我只需在上方“搜索栏”输入一个标记: 这样,所有名字前带有此标记的好友(代理),就一次性全部筛选出来了,然后你就挨个无脑选中就行啦。 所以,养成加标记的习惯,会给我们平时的微商工作带来不少便利,特别是当需要群发时,其他的微商还在手忙脚乱,而我们分分钟解决问题,既保证了传达的精确性,又避免了打扰其他不相干的好友,工作效率天壤之别。 6.如何不打扰好友的情况下检测自己是否被删了 我们做微商,经常会遇到好友把我们屏蔽了,那么如何进一步检测对方是否已经把我们删了呢?有时候直接发私信又很尴尬,so,如何不打扰对方的情况下、神不知鬼不觉的检测一下对方是否已经把自己删了呢?很简单,向对方发起转账即可: 如图,随便输入一个金额,点“转账”,如果对方是你的好友,就会直接进入到下一步提示你输入密码,此时停止操作就可以了。如果对方已经把你删除了,则会提示:“你不是收款方好友”,这样就在对方不知情的情况下检测了是否删除/拉黑啦。 7.朋友圈如何发布10秒以上视频 大家都知道,朋友圈最多只支持发10秒钟视频,发布10秒以上的视频会出现如下界面: 怎么破?其实也很容易。先将视频上传至“微信收藏栏”: 然后点开右上角“分享到朋友圈”即可: 这里注意,如果是好友私信发给你的视频,直接收藏发布是没有用的。正确的做法是:先将视频收藏,然后点开右上角-“转存为笔记”,再点开右上角“分享到朋友圈”即可。 8.如何解决朋友圈文案“只显示1行” 众所周知,一直以来朋友圈发说说时,一条文案的字数超过5行,就会被折叠,如下图: 可前段时间微信突如其来的变动,如今一条说说字数超过5行,发布出来就直接“只显示1行”了,不再有原来的折叠效果。so,一时之间朋友圈里出现了好多下图中这样的: 一条文案被压缩到了只显示1行,以至于展示在朋友圈的视觉和可见字数都大打折扣,怎么破?没关系,马上手把手教你破解! 方法①:适用于安卓系统 发布说说时,先在文字编辑栏打一个符号,比如逗号,然后全选这个逗号,用自己的文案粘贴上去覆盖。这样发布说说即可实现“不显示1行”效果。(此方法仅适用于安卓系统)。 方法②:适用于苹果系统 发布说说时,先将文案和图片编辑好,然后不要直接发布,而是点“取消”-“保留”,再重新点进去发布说说,即可实现“不显示1行”效果。(此方法仅适用于配图片的说说,纯文字说说一旦字数超过6行,取消时就没有“保留”选项) 能达到同样效果的方法其实还有很多种,但各有局限,不一定所有手机系统都能支持。 so,以上8点技巧,灵活运用,即可极大程度提高一名微商的工作效率,自己学会的同时还能在他人面前吹牛逼,有了“炫技”的资本。哥每次在小姑娘面前一显摆,都有一群人上来围观,一种众心捧月的感觉。Exciting! (本文转自小猪导航 www.xiaozhu.hk ,原文作者:微商飘老师) |
如何向微信视频号作者发送私信困扰着很多朋友吧,接下来就让小编为大家讲述微信视频号私信功能使用教程分享,还不懂的朋友们就来兔叽下载站看一看吧。
微信视频号私信功能使用教程
2、找到微信里的视频号,点击进入。
3、点击视频号作者旁的三个小点。
4、在进入到该作者的主页后,点击私信就可以啦
注:你在给视频号作者发送私信后,对方回复前最多发送3条。 对应的在视频号个人主页也新增了「视频号私信」的功能入口。
以上就是兔叽下载站小编为您带来的分享,希望大家喜欢,想要了解更多游戏资讯,请继续关注。
随着网络的传播,人们可以更快捷的进行交流,只需要打开手机就能相互交流,目前QQ和微信是国内用户群体最多的软件,但是还有部分交流软件也是很热门的,你知道这些软件都是哪些吗?下面就让兔叽下载站小编为大家分享一下各种有趣的社交聊天软件吧~
有许多朋友想要通过社交找到一些拥有共同话题的好友聊天、能够一起开黑组队游戏的好友或者是通过社交的方式找到心仪的另一半。但是不少小伙伴们都不知道应该怎样找到交友的途径,接下来大家就来兔叽下载站看看,小编在这里为大家准备了不少的社交软件,相信大家一定能够找到好友,欢迎大家来下载使用哦。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。