B站工作期间部分项目汇总

我的页 可配置(创作中心部分)


【需求背景】

支持灵活在我的-创作中心配置白名单入口与红点

【需求详情】

在原有入口上,支持第1、2、3、4位按照人群包配置入口icon、标题、链接

此配置优先级最高,支持红点展示,每个入口的红点带有权重配置,权重越高优先显示该红点。全局一次最多显示一个红点,点击后消失,按权重再显示其他红点


基本配置如下:

1
2
3
4
5
6
7
8
9
[ConfigurableIconMap]

[ConfigurableIconMap.FirstIcon]

[ConfigurableIconMap.SecondIcon]

[ConfigurableIconMap.ThirdIcon]

[ConfigurableIconMap.FourthIcon]

支持把将某个位置, 替换为不同的“名称”,“图标”,“跳转链接”,并支持“是否展示红点及其优先级”,以及“面向人群”,“结束时间”

如想将 符合某条件的人群(如半年内有投稿而上个月未投稿),将第二位 换为 “限时红包”, 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[ConfigurableIconMap]

[ConfigurableIconMap.FirstIcon]

[ConfigurableIconMap.SecondIcon]
[[ConfigurableIconMap.SecondIcon.IconItems]]
IdIos = 298
IdAndroid = 413
Title = "限时红包"
UriIos = "https://www.bilibili.com/blackboard/activity-Z35_AiL2Z.html?channel=index"
UriAndroid = "https://www.bilibili.com/blackboard/activity-Z35_AiL2Z.html?channel=index"
Icon = "http://i0.hdslb.com/bfs/feed-admin/07ed0bd2b4a75c207b3faf51cdb9b2fa2b99ba2b.png"
GroupId = 12
AttrLocation = 4
RedPointPriority = 2
EndTime = 1616256000

[ConfigurableIconMap.ThirdIcon]

[ConfigurableIconMap.FourthIcon]

其中,

  • GroupId由人群包服务提供, 程序会依据某mid 是否在该人群包中,从而控制是否要展示新的图标信息

  • EndTime 是结束时刻的时间戳,到期会自动换为替换之前的图标信息


下面将进一步解释这几个字段:

如果此时还想依据 是否为游戏区资深观众,将第三位替换为 “游戏试玩”; 年龄是否低于18岁,将第二位替换为“开学有讲”(优先级大于“限时红包“),则配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[ConfigurableIconMap]

[ConfigurableIconMap.FirstIcon]

[ConfigurableIconMap.SecondIcon]

[[ConfigurableIconMap.SecondIcon.IconItems]]
IdIos = 2981
IdAndroid = 4132
Title = "开学有讲"
UriIos = "https://www.bilibili.com/blackboard/activity-Z3125_AiL2Z.html?channel=index"
UriAndroid = "https://www.bilibili.com/blackboard/activity-Z121235_AiL2Z.html?channel=index"
Icon = "http://i0.hdslb.com/bfs/feed-admin/1122.png"
GroupId = 15
AttrLocation = 5
RedPointPriority = 3
EndTime = 1616257000

[[ConfigurableIconMap.SecondIcon.IconItems]]
IdIos = 298
IdAndroid = 413
Title = "限时红包"
UriIos = "https://www.bilibili.com/blackboard/activity-Z35_AiL2Z.html?channel=index"
UriAndroid = "https://www.bilibili.com/blackboard/activity-Z35_AiL2Z.html?channel=index"
Icon = "http://i0.hdslb.com/bfs/feed-admin/07ed0bd2b4a75c207b3faf51cdb9b2fa2b99ba2b.png"
GroupId = 12
AttrLocation = 4
RedPointPriority = 2
EndTime = 1616256000

[ConfigurableIconMap.ThirdIcon]

[[ConfigurableIconMap.ThirdIcon.IconItems]]
IdIos = 2918
IdAndroid = 4113
Title = "游戏试玩"
UriIos = "https://www.bilibili.com/blackboard/121235_AiL2Z.html?channel=index"
UriAndroid = "https://www.bilibili.com/blackboard/sadasd-Z35_AiL2Z.html?channel=index"
Icon = "http://i0.hdslb.com/bfs/feed-admin/56789.png"
GroupId = 16
AttrLocation = 6
RedPointPriority = 8
EndTime = 1626256000

[ConfigurableIconMap.FourthIcon]

GroupId和EndTime 控制相同位置的展示规则:


如对于第二个位置,此时 开学有讲限时红包 都未过期,如果某mid均在这两个人群包内,则会展示第一个 即 开学有讲; 如果只在 限时红包 的人群包内,才会展示限时红包


RedPointPriority和AttrLocation, 控制红点的优先级及点击后消失:


如要求 游戏试玩 的红点优先级最高,则需要保证游戏试玩在配置中所有的AttrLocation字段中值最大;

AttrLocation字段为相关业务的前端,向创作中心服务端申请business_type

每个business_type对应一个数值,该值即AttrLocation。其具体含义是tidb的xxx库中,xxx表中attribute字段做位运算的位置(由于位运算从0开始,实际的index为该值-1)。

当用户点进该图标时,前端同学会调用前述通用消除红点接口,将该mid的该属性位置为1;

程序会依据RedPointPriority从高到低,将第一个其attribute相应位置不是1的图标的红点字段设置为1;

(现在 默认的第四位,”有奖活动“的红点优先级最低)。

在此例中,如果用户还未点击任何红点,则依据 RedPointPriority 的大小,第三位将展示红点。用户点击 游戏试玩 后, 前端根据UriIos/UriAndroid带有?channel=index,会请求通用-不再展示红点接口,从而将user_attribute表中该mid的attribute相应的属性位设置为1.

再次请求时,程序会将下一个符合条件的(RedPointPriority最大,且未点击过)位置的红点设置为展示。


几点注意事项:

  1. 四个位置的Id不能有重复。对某个位置,IdIos和IdAndroid可以相同,也可以不同
  2. UriIos/UriAndroid 中需要带上?channel=index,否则前端不会请求消除红点的接口
  3. EndTime 必须是时间戳格式,不能是”Y-m-d H:i:s“

QPS:




HBase迁移TiDB


过程中遇到的一些坑:

row_number引发的顺序问题,相同排名会随机取

如取点赞数最高的三个稿件,如果有a,b,c,d,e,f,g 7个稿件点赞数相同,可能会出现其中任意三个,由Hive写到Hbase和TiDB的可能不同


int32溢出导致的数据不一致


从Hbase/TiDB里取出的数据,用一个struct来承接. 里面所有整数类型均用int32. 但部分头部up主,某些字段的值(如播放量)可能超过了int32类型的上限2147483647,从而TiDB查询时会报错

sql: Scan error on column index 0, name "play": converting driver.Value type int64 ("3492188783") to a int32: value out of range)

这8个大up主,都有这个问题..

1
2
3
4
5
6
7
8
10330740 
15773384
258457966
4856007
732364
928123
98627270
7584632

阮一峰老师所言极是.. 最常见的电话号码


-1和4294967295


某个为-1的值,因为类型定义,最终变成4294967295


发布按钮可配置

创作中心首页改版

打卡活动

UP主推荐官