Feed,微博中的一条微博就是一个Feed 无 Feeds流 Feed流本质上是数据流,核心逻辑是服务端系统将 “多个发布者的信息内容” 通过 “关注收藏屏蔽等关系” 推送给 “多个接收者”.如公众号订阅消息 feeds 流系统。 feeds 流系统通用的特点(挑战): 实时性: 消息是实时产生,实时消费,实时推送的。 我们上面提到过 feeds 流系统是一个读多写少的系统, 所以选择写扩散会更好, 不过针对上面提到的大V用户问题对写的放大太严重了, 性能受到较大影响。 timeline feeds 系统设计 架构设计 整体架构设计如下: User Svr: 存储用户信息, 用户维度的服务能力 Relation Svr: 存储用户关系, 获取关注列表、粉丝列表等 Item
item.get_absolute_url() def item_guid(self, item): return 2、然后在urls.py中添加: from DjangoBlog.feeds
图片先分享下我们业务的一些数据:feeds 发表峰值(写)大约是在 x k/s 左右,日发表量约在 xkw,活跃用户大约 x 亿,单条 feeds 约 900B,每个用户存最近 x 条,大约需要 5T 存储;好友 feeds 流时间线拉取(读)峰值大约在 xk/s。 技术方案社交 feeds 型的产品,绕不开的挑战是:读写方案选型。海量 feeds 存储选型。 具体来说,就是用户每次进入页面,我们将当前计算好的 feeds 列表缓存在 mongo 中(只缓存最近10页),下次用户进入页面时,计算增量的 feeds 列表,然后合并到 feeds 列表缓存中去。 Feeds 超长清理手Q游戏中心,毕竟不是一个 feeds 流的产品形态,只是希望展示用户最近的好友动态。因此产品策略上,对 feeds 的保留时间做了限制,每个用户只保留最近 N 条。
上述场景,可以简单抽象为曝光去重,就是用户看过的 feeds1、feeds2、feeds3 ...... 等,如何保证在用户下次进入系统时不会再次出现呢?今天,我们就来探讨下几种实现方案吧。 每次推荐系统要出新的 feeds 时,去 set 中 check 一下是否存在,如果存在的话,就过滤掉这条 feeds。 一般来说,像是短视频推荐的场景下,对 feeds 的实时性要求相对较高,一般会使用 Redis 作为曝光打击的载体。 我们来简单试算一下,假设国民级 App 的日活跃用户在 3kw,每人每天平均刷 200 条视频 feeds,每条 feeds 的 id 长度为 32B。 还是以相同的条件来试算,假设国民级 App 的日活跃用户在 3kw,每人每天平均刷 200 条视频 feeds,每条 feeds 的 id 长度为 32B。
就是这么个 Feed 流系统让掘金的工程师分成两派吵作一团,一直吵到了小明办公室。。。 使用拉模型方案用户每打开一次「关注页」系统就需要读取 N 个人的文章(N 为用户关注的作者数), 因此拉模型也被称为读扩散。 推模型 另一部分工程师认为在创作者发布文章时就应该将新文章写入到粉丝的关注 Timeline,用户每次阅读只需要到自己的关注 Timeline 拉取就可以了: 使用推模型方案创作者每次发布新文章系统就需要写入 使用「在线推,离线拉」时只给 Timeline 缓存未失效的用户推送即可 需要在缓存中放置标志来防止缓存击穿 一层缓存不够再来一层 虽然 Redis 可以方便的实现高性能的关注 Timeline 系统,
Feeds流其实不是一开始就是这种形式。它起源于RSS系统。 读写结合:由于Feeds流是读多写少的场景,所以一般情况下,我们采用写扩散,系统的性能会比读扩散要好。 总体设计 一、架构设计 上面我们Feeds流的底层模型进行了详细的分析,综合考虑后,本次开发决定采用以下架构进行开发系统。 而后是我们的系统内部,核心难点是发布和拉取Feeds流两个功能。对这些问题,下面我们也会具体分点介绍设计。 核心的发布Feed、拉取Feeds流的总体交互图如下: 总结 相信看了本文以后,对于如何实现一个较为可靠,性能相对有保证的Feeds流系统,你已经有了一定的了解。
Feeds相对于Timeline,最大特点是有rank影响排序,需要按类型合并,有推荐算法的插入,有更复杂的数据结构…这些都是影响架构设计的重要因素,但这些都没有文档详细描述。 ---- 3人人网 参考《人人网Feed系统结构浅析.pdf》和《人人网网站架构–服务化的演进》。作为中国的大型SNS网站,设计上也有很多自己的特色。 但是,人人网的Feeds,又比twitter类的timeline,有更复杂的结构和功能需求,所以在设计上,会有FB和Twitter双方融合的特点。 ? Renren在网络通信上大量使用 ICE框架 ,协议上多用Protobuf,实现缓存等中间层、新鲜事儿等系统。大量自己开发的server集群,通过他们高效通信。 同大多的timeline系统一样,使用队列来异步化和解耦,不过qq的解耦包括了系统解耦和业务解耦(和Renren网的“中转单向RPC调用的消息队列”类似),不但解耦模块,还使得各模块开发得以并行,提升开发效率
| 导语 腾讯神盾开放通用推荐系统一般将推荐问题转化为分类问题,而对于列表推荐场景,推荐问题更近似于排序问题。 本文将介绍排序学习技术与推荐算法结合的Pairwise方法及其具体实现 – Pairwise Ranking Factorization Machines (PRFM) 算法,并分享PRFM算法在手Q动漫Feeds Pairwise方法作为排序学习 (learning to rank) 技术与推荐系统算法的结合,近年来得到了学术界与工业界的密切关注与研究。 本文介绍的Pairwise Ranking Factorization Machines (PRFM) 算法是Pairwise方法的一种具体实现,我们在神盾推荐中实现了PRFM算法,并应用在手Q动漫首页Feeds 下图展示了在手Q动漫Feeds流上的调优示例,根据调优结果我们决定使用的参数为:init_std=0.005,reg=0.0001,factor=100。 ?
作者:徐匆,黄俊|腾讯社交网络运营部高级研究员 腾讯神盾开放通用推荐系统一般将推荐问题转化为分类问题,而对于列表推荐场景,推荐问题更近似于排序问题。 本文将介绍排序学习技术与推荐算法结合的Pairwise方法及其具体实现 – Pairwise Ranking Factorization Machines (PRFM) 算法,并分享PRFM算法在手Q动漫Feeds Pairwise方法作为排序学习 (learning to rank) 技术与推荐系统算法的结合,近年来得到了学术界与工业界的密切关注与研究。 本文介绍的Pairwise Ranking Factorization Machines (PRFM) 算法是Pairwise方法的一种具体实现,我们在神盾推荐中实现了PRFM算法,并应用在手Q动漫首页Feeds 下图展示了在手Q动漫Feeds流上的调优示例,根据调优结果我们决定使用的参数为:init_std=0.005,reg=0.0001,factor=100。
背景 在浏览器Feeds的测试工作中,目标主要分为两个方面: 样式 其他功能 所谓样式,即为Feeds下滑过程中每一个条目所展现的形式,也是我们本文测试方案关注的重点,其具体形式如下图所示: ? 所有Feeds内容都通过服务器端下发,数据下发之后在终端Hippy框架中做Native处理,最终呈现给用户,其大概逻辑如下图所示: ? 目前Feeds中样式合计66个, 从下面的分布图中可以看出,top10的总量已经超过了95%。 图如下所示: ?
对于QQ空间Feeds信息流产品,通过产品的系统性思考,会发现Feeds基于空间的枢纽作用,连接空间各个业务内容,并以Feeds产品形态分发给UGC和PGC用户。 因此形成了以解决“Feeds缺失系统化”为基础,有节奏的探索解决Feeds关键触点暴露问题的解决策略。 ? ? 解决行动第2步:解决“Feeds缺失系统化”,即Feeds设计系统化,也就是将整个Feeds产品体系化,进行设计的规范化和组件化,并在设计层面和开发层面统一共享资源,并应用到产品的后续迭代中。 Feeds设计系统化主要有以下3个阶段:明确设计系统化目标 - 明确设计系统化思路 - 设计系统化过程。 首先是明确设计系统化目标,明确预期目标有助于我们在项目后期更好的评估系统化设计的价值和效果,空间Feeds信息流产品主要从3个维度明确目标:规范化(形成Feeds基础设计体系,保障Feeds整体设计统一性
获取微博通过 pull 方式还是 push 方式 sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等, 试想,一个大量用户的微薄系统通过使用推模式,是不是会产生非常惊人的数据呢? 下面看下拉模式(pull) ? 图五:拉模式 拉模式只需要用户发表微博时,存储一条微博数据到feeds表中(feeds表可以是一个临时表,只保存近期可接受范围的数据).用户每次查询feed时都会去查询feeds表。 但是feeds表会产生很大的压力,怎么说feeds表也要保存最近十天半个月的数据吧,对于一个大点的系统,这会产生比较大的数据,如果following的人数比较多,数据库的压力就会非常大。 当然,时间分区拉模式也可以结合推模式,根据某些特点来增加系统的性能。 B. 发布微博的频率要远小于阅读微博 C.
cp feeds.conf.default feeds.conf scripts/feeds update -a scripts/feeds install -a 具体过程: openwrt scripts/feeds update -a openwrt@localhost:/openwrt$ scripts/feeds update -a Updating feed 'packages /feeds/management.index' openwrt@localhost:/openwrt$ scripts/feeds install -a Collecting package info EXT4 filesystem support ext文件系统支持 <*> kmod-fs-vfat..................................... VFAT filesystem support fat32文件系统支持,ntfs不选,因为有ntfs-3g Wireless Drivers ---> 这里有无线驱动 Native
feeds, String accessToken) { // 校验 Feed 内容不能为空,不能太长 AssertUtil.isNotEmpty(feeds.getContent 让 id=10 的用户关注 id=7 的用户: 让 id=9 的用户关注 id=7 的用户: 让 id=8 的用户关注 id=7 的用户: id=7 的用户登录系统并发送一条动态 : http://localhost/feeds? access_token=48781f97-1c3a-4737-ae55-984c0944649e 查看数据库 feeds 信息: 查看 redis 中粉丝的 feeds 信息: : 让用户10取消关注用户7: 用户7的所有feeds(朋友圈) 应该从用户10的feeds集合中移除: 只剩下用户8、9相关的。
2.系统总览 这是朋友圈广告后台系统的主要模块图,下面将挑选部分展开分析。 而朋友圈广告则很不同,因为一个用户在拉取朋友圈Feeds之后,他可能不会往下拉着去看完所有的Feeds,也许到了第二天,第三天才去往下翻着看,此时也要产生扣费。 7.朋友圈后台架构支持 在原先朋友圈后台中,每条Feeds的评论点赞信息都是存储在一个objectid上,它存储于kv存储系统中,每次拉取与更新都是对这些数据全存全取。 另外,广告Feeds不能像用户普通Feeds一样,一直存在于用户的Feeds流中,因为假如用户回顾以往,发现一条条广告时候,那一定会很扫兴的,于是我们会对用户没有特别感兴趣的广告进行定期删除。 另外,用户的Feeds发表之后就只有删除的动作了,而一个广告的Feeds假如其中某个图片需要临时更新,我们也要提供一种快速更新的机制,不能让广告主删掉广告。
上述的场景还是比较理想,我们事实上在实际环境中会有非常复杂的场景,比如异构的网络,异构的操作系统等等: ? 在这样一个复杂的系统中,后台任意端点的失败都可能阻塞前端的开发流程,因此我们会采用mock的方式来解决这个问题: ? 我们往往在集成的时候才发现,本来协商的数据结构变了:deliveryAddress字段本来是一个字符串,现在变成数组了(业务发生了变更,系统现在可以支持多个快递地址);price字段变成字符串,协商的时候是 ,然后根据这两个列表的交集来绘制出所有的星号的状态(有的是空心,有的是实心): $.when(feeds, favorite).then(function(feeds, favorite) { list_page).to have_banner expect(list_page).to have_feeds end it 'user can see 3 feeds in the
上述的场景还是比较理想,我们事实上在实际环境中会有非常复杂的场景,比如异构的网络,异构的操作系统等等: ? 在这样一个复杂的系统中,后台任意端点的失败都可能阻塞前端的开发流程,因此我们会采用mock的方式来解决这个问题: ? 我们往往在集成的时候才发现,本来协商的数据结构变了:deliveryAddress字段本来是一个字符串,现在变成数组了(业务发生了变更,系统现在可以支持多个快递地址);price字段变成字符串,协商的时候是 ,然后根据这两个列表的交集来绘制出所有的星号的状态(有的是空心,有的是实心): $.when(feeds, favorite).then(function(feeds, favorite) { var have_banner expect(list_page).to have_feeds end it 'user can see 3 feeds in the list' do expect(list_page.all_feeds
系统实现 首先,要注意到朋友圈广告的生命周期都是短的,所以如果采用离线数据计算再反推到在线系统之上的方案,就会使得整个投放阶段效果很差。 而朋友圈广告则很不同,因为一个用户在拉取朋友圈Feeds之后,他可能不会往下拉着去看完所有的Feeds,也许到了第二天,第三天才去往下翻着看,此时也要产生扣费。 7.朋友圈后台架构支持 在原先朋友圈后台中,每条Feeds的评论点赞信息都是存储在一个objectid上,它存储于kv存储系统中,每次拉取与更新都是对这些数据全存全取。 另外,广告Feeds不能像用户普通Feeds一样,一直存在于用户的Feeds流中,因为假如用户回顾以往,发现一条条广告时候,那一定会很扫兴的,于是我们会对用户没有特别感兴趣的广告进行定期删除。 另外,用户的Feeds发表之后就只有删除的动作了,而一个广告的Feeds假如其中某个图片需要临时更新,我们也要提供一种快速更新的机制,不能让广告主删掉广告。
文章目录 业务场景 Feed流相关概念 Feed流特征 Feed流分类 实现思路 环境搭建 数据库表结构 新建Feeds功能微服务ms-feeds 配置类 RedisTemplateConfiguration Feed流相关概念 我们在讲如何设计Feed流系统之前,先来看一下Feed流中的一些概念: Feed:Feed流中的每一条状态或者消息都是Feed,比如朋友圈中的一个状态就是一个Feed,微博中的一条微博就是一个 Feed流特征 Feed流系统有一些非常典型的特点,比如: 多账号内容流:Feed流系统中肯定会存在成千上万的账号,账号之间可以关注,取关,加好友和拉黑等操作。 只要满足这一条,那么就可以当做Feed流系统来设计。 非稳定的账号关系:由于存在关注,取关等操作,所以系统中的用户之间的关系就会一直在变化,是一种非稳定的状态。 功能微服务ms-feeds pom依赖: <?
}}/feeds/all.atom? title_include=张三{{ORIGIN_URL}}/feeds/MP_WXS_123.json? articles,要获取更新后的articles需去掉update参数再请求一次){{ORIGIN_URL}}/feeds/MP_WXS_123.rss? update=true前言准备工作本实例可以安装在NAS,Linux系统,windows等支持docker的本文将以下资源搭建服务器一台域名一个,下文以 wx-rss.xgss.net 代替(非必须,最好是备案过的域名 ,如果没有可以新注册个)SSL 证书一个(非必须)系统:本文是Centos7.9+宝塔面板Docker 命令启动开源地址:https://github.com/cooderl/wewe-rssSqlite