- 浏览: 2653609 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
参考:http://www.cnblogs.com/sunli/archive/2010/08/24/twitter_feeds_push_pull.html
sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com 或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed架构,也就是推拉模式(timyang 上次也分享了新浪微薄的模式)。下面我们就微博的feed推拉(push,pull)模式做一下探讨,并提出新的时间分区拉模式 。
众所周知,在微博中,当你发表一篇微博,那么所有关注你的followers(粉丝)都会在一定的时间内收到你的微薄,这有点像群发一封邮件,所有的抄送者都会在一定的时间内收到。到这里,你可能觉得没有什么难度。我们看下下面的截图:
图一:新浪微博姚晨
图二:twitter上冯大辉
新浪微博的姚晨粉丝有2594751,她发表任何一篇微博,都需要2594751个粉丝在一定的时间内收到,twitter的冯大辉发表一篇的话,需要19868个followers收到。
相反,姚晨需要收到他关注的545个人的所有更新,冯大辉需要收到他关注的2525个人的所有更新。到这里,你是不是感觉到有那么一点点小挑战呢?
下面我们看下微博一般的整体结构图:
图三:微博整体结构
图中展示了微博的整体数据流程,先了解下整体的数据结构,没有涉及到followers等的推拉模式处理。下面我们再看下推模式(push):
图四:推模式结构
推模式需要把一篇微博推送给所有关注他的人(推给所有的粉丝),比如姚晨,我们就需要推送给2594751个用户的feeds表中。当然,feeds表可 以很好的进行sharding,存储也都是一些数字型的字段,存储空间可能不是很大,用户在查询自己关注的所有人的feed时,速度快,性能非常高,但是 推送量会非常大,姚晨发表一篇,就会产生200多万条数据。试想,一个大量用户的微薄系统通过使用推模式,是不是会产生非常惊人的数据呢?
下面看下拉模式(pull)
图五:拉模式
拉模式只需要用户发表微博时,存储一条微博数据到feeds表中(feeds表可以是一个临时表,只保存近期可接受范围的数据).用户每次查询feed时 都会去查询feeds表。比如姚晨打开自己的微薄首页,就产生:SELECT id FROM feeds where uid in(following uid list) ORDER BY id DESC LIMIT n(查询最新的n条),缓存到memcached
uidlist=>{data:id list,timeline:上次查询出来的最新的一条数据的时间}
再次刷新:SELECT id FROM feeds where uid in(following uid list) AND timeline>(memcached存储的上次的timeline) ORDER BY id DESC LIMIT n
这种模式实现起来也是比较简单和容易的,只是在查询的时候需要多考虑下缓存的结构。但是feeds表会产生很大的压力,怎么说feeds表也要保存最近 十天半个月的数据吧,对于一个大点的系统,这会产生比较大的数据,如果following的人数比较多,数据库的压力就会非常大。而且一般在线的用户,客 户端都会定期扫描,又会增加很大的压力,这在查询性能上没有推模式的效率高。
下面我们在对拉模式做一下改进优化
图五:拉模式(pull)-改进(时间分区拉模式 )
拉模式的改进主要是在feeds的存储上,使用按照时间进行分区存储。分为最近时间段(比如最近一个小时),近期的,比较长时期等等。我们再来看下查询的 流程,比如姚晨登陆微博首页,假设缓存中没有任何数据,那么我们可以查询比较长时期的feeds表,然后进入缓存。下一次查询,通过查询缓存中的数据的 timeline,如果timeline还在最近一个小时内,那么只需要查询最近一个小时的数据的feed表,最近一个小时的feeds表比图四的 feeds表可要小很多,查询起来速度肯定快几个数量级了。
改进模式的重点在于feeds的时间分区存储,根据上次查询的timeline来决定查询应该落在那个表。一般情况下,经常在线的用户,频繁使用的客户 端扫描操作,经常登录的用户,都会落在最近的feeds表区间,查询都是比较高效的。只有那些十天,半个月才登录一次的用户需要去查询比较长时间的 feeds大表,一旦查询过了,就又会落在最近时间区域,所以效率也是非常高的。
关于时间的分区,需要根据数据量,用户访问特点进行一个合理的切分。如果数据发表量非常大,可以进行更多的分区。
上面介绍的推模式和拉模式 都有各自的特点,个人觉得时间分区拉模式 弥补了图四的拉模式的很大的不足,是一个成本比较低廉的解决方案。当然,时间分区拉模式也可以结合推模式,根据某些特点来增加系统的性能。
后记:本文的目的是介绍时间分区拉模式,本人对新浪微博和twitter等的推拉模式的细节并不清楚。
相关推荐
【微博Feed系统的推(push)模式和拉(pull)模式及时间分区拉模式架构探讨】 微博Feed系统是社交媒体平台的核心组成部分,它负责展示用户关注的人或事物的最新动态。推模式和拉模式是两种常见的实现方式,各有优缺点,...
在设计和优化feed流系统时,通常有两种主要的实现方式:拉模式(Read Diffusion)和推模式(Write Diffusion)。 **一、拉模式(读扩散)** 在拉模式中,数据的读取是扩散的。每个用户的feed队列只存储他们自己...
总结来说,新浪微博的架构设计经历了从快速原型到应对大规模用户的过程,涉及了推送模式优化、数据库拆分和索引策略的调整,以及系统的模块化和异步化处理。这些经验对于理解大规模社交网络的架构设计具有重要的参考...
实现这一功能涉及到多种技术和策略,包括推送(Push)与拉取(Pull)模式,以及高效的数据库设计和缓存策略。 【标签】:观察者模式 【正文】: 在微博和知乎这样的社交平台上,feed流的实现主要涉及到两个核心...
新浪微博开放平台中的Redis实践_大数据时代feed架构_微博消息系统架构演进_互联网公司技术架构资料.新浪微博.微博架构与平台安全_构建高性能的微博系统——再谈新浪微博架构 演讲视频,PPT,一些收集的博客地址等
V2.0的存储采用了分布式数据库,拆分了缓存和实时搜索消息队列(MQ),异步处理信息,这些变化标志着微博开始走向高并发和大数据处理的架构模式。 微博架构继续演进,到V3.0和V4.0版本,微博开始对核心服务进行了...
这种架构设计使得微博能够应对亿级访问量的挑战,通过服务化和组件化提升了系统的可扩展性和灵活性,而监控和治理平台则确保了系统的稳定性和高效运行。随着技术组件的不断丰富和完善,微博的架构持续演进,以适应...
本篇将详细探讨微博的技术架构、技术挑战、架构演变、Watchman分布式服务追踪系统以及Feed多级双机房缓存系统等知识点。 首先,微博的技术架构主要包括客户端和服务器端两部分。客户端包括Web端、Android应用和...
微博架构 feed 介绍,精彩不要错过~~
在IT行业中,开发社交应用和即时通讯(IM)平台时,常常需要处理用户的时间线(Timeline)、消息推送、feed流以及通信功能。本项目提供的是一个基于Java实现的抽象库,专门针对这些需求进行了优化,旨在简化开发过程...
【新浪微博架构猜想】 新浪微博作为一款大型...综上所述,新浪微博的架构设计充分考虑了高性能、实时性和可扩展性,通过各种缓存策略、数据聚合方法以及混合的推送和拉取模式,实现了大规模社交媒体平台的高效运行。
为了支持亿级用户规模,微博的技术架构历经多次重大调整和优化,逐步形成了一套成熟而复杂的系统。 1. 微博的技术架构 微博的技术架构主要分为客户端、接入层和后台三大部分。客户端包括Web端、Android端和iPhone端...
该架构采用了分布式服务追踪系统、Feed 多级双机房缓存系统、Redis 和 MySQL 数据库等技术来实现高性能和高可用性。 二、微博平台技术挑战 微博平台在亿级用户下的技术挑战主要来自于以下几个方面: 1. 高并发:...
微博的Feed架构设计主要有三种模式:Push(推)、Pull(拉)以及复合型。这三种模式各有优势和劣势,在实际应用中通常会结合使用。 ##### Push(推) - **概念**:将feed比喻为邮件。Inbox表示收到的微博,而Outbox则...