story
feed(聚合服务)
查
联表查询
表冗余字段
java拼接
user_service
查询用户的avator和nick_name
follow_service
查询我是否关注
item_service
查询我的in_box
in_box如何设计
redis zset
follow
数据库设计
MySQL
根据ER图设计表
create table follow(
`id` bigint unsigned not null auto_increment comment '主键',
`gmt_create` datetime null default current_timestamp,
`gmt_modified` null default current_timestamp on update current_timestamp,
`from_user_id` bigint unsigned not null comment '',
`to_user_id` bigint unsigned not null comment '',
primary key(`id`)
)
根据涉及的查询场景设置索引
--查询关注列表
--同一个连接同一个数据库
select to_user_id,nick_name,avator,introduction
from follow join user on follow.to_user_id = user.id
where from_user_id=?
--查询关注列表
--同一个连接不同数据库
select to_user_id,nick_name,avator,introduction
from a.follow join b.user on follow.to_user_id = user.id
where from_user_id=?
--查询关注列表
--表字段冗余
select to_user_id,nick_name,avator,introduction
from follow
where from_user_id=?
--查询粉丝列表
select from_user id
from follow
where to_user_id=?
index idx_from_to(`from_user_id`,`to_user_id`)
item
数据库设计
create table item(
`id` bigint unsigned not null auto_increment comment '主键',
`gmt_create` datetime null default current_timestamp,
`gmt_modified` null default current_timestamp on update current_timestamp,
`from_user_id` bigint unsigned not null comment '',
`to_user_id` bigint unsigned not null comment '',
primary key(`id`)
)
增
校验参数
item->DB
异步任务
审核
nlp打标签
异步任务(MQ)
if 大V
item_id->
item写入活跃粉丝的邮箱
模式
推
when
一开始可以都用推模式,因为推模式易于实现
how
一个用户发布了一个item,推送到粉丝的inbox
拉
when
用户的粉丝非常多
how
粉丝拉取关注用户的outbox,归并排序,去重,取几条
缺点
内存 网络
业务逻辑复杂
推拉结合
微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨-阿里云开发者社区 (aliyun.com)