周末本来准备窝在家里打游戏,惊闻b站大佬要来北京分享,赶紧起床去听课。期间也和其它公司的人聊了聊,感觉收获不少。
B站现在作为国内二次元的门户,聚集了大部分的动漫爱好者,因为业务模型和日本的 niconico
比较像,所以早期也肯定从n站的产品上学到了不少东西(这句是我说的)。从文化衍生出的直播、周边、游戏服务又能够帮助这个站点进一步地造血赚钱,比如现在非常火的FGO。因为这一两年B站关注度变高,所以即使是对二次元没什么兴趣的人也会感觉和b站有关的新闻越来越多了。比如去年在知乎上先后有
flv.js、2233娘竞拍的事情,也是把他们推上了风口浪尖。
很多70后80后可能都不一定会上B站,但是你可能想不到B站也是一个亿级用户的站点了。从09年创立到现在,在技术上他们也经历了从一个创业公司到越来越正规的过程。有很多方面我觉得做得比现在的公司还要好。挑几个值得说的总结一下吧~
Code Review
首先是我来了现在的公司一直头痛的 Code
Redis 客户端和 Redis 服务器使用 RESP 协议通信,RESP 是 REdis Serialization Protocol
的简称。尽管该协议是为redis设计的,你仍然可以把他用在其它的 client-server 架构的软件项目中。
RESP 协议是下面一些设计原则的折衷:
> 实现简单
> 解析(Parse)迅速
> 可读(Human Readable)
RESP 协议支持 integer、string、array 等类型的序列化,同时对错误也设计了特殊的类型来进行支持。请求从
在技术群里有人问了这么一个问题,redis的sds不是号称二进制安全吗?但是sdsnew函数里有对strlen进行调用啊。
跟着仔细看了一下源码,还真的是这样:
sds sdsnew(const char *init) {
size_t initlen = (init == NULL) ? 0 : strlen(init);
return sdsnewlen(init, initlen);
}
但是说sds二进制安全是说错了么?也不是,我们看看sdslen这个函数:
static inline size_t sdslen(const sds s)
说实话这个标题可能比较欠扁。不过在这种辞旧迎新的气氛里还是觉得应该不吐不快吧。
从入职新公司到现在为止一年过去了,新公司的工作能发挥自己主观能动性的任务非常之少,除了年初在公司没有任何可用的垂直搜索方案的时候就自告奋勇地给自己部门搭了一套
es 集群,到年后将这个方案接入到公司公用的 binlog 信息流之中。再到后来为了接入方便开发了简单的 SQL
解析,以及工作时间处理各种集群查询、删除之类的操作导致的 OOM/GC
之类的问题啊什么的(感觉自己已经负责了不少运维的工作233)。其余的工作大多还是搬砖居多。
称之为搬砖一点都不为过吧,就是写写 CRUD ,写写 api ,然后和前端和其它系统和外部门的人来各种联调。
大公司么,总是会花多余的钱让稍微高级一些的人去干低级的事情。反正有钱。
话虽然是这么说,写写简单的 api ,过程也不是那么一帆风顺,
部门的一个新项目使用了kafka
0.9来进行开发,不得不说目前公司的kafka版本真是够混乱,从0.8~0.10三个版本都存在,而我们部门在选择版本的时候则更加不慎重,追新追时髦,0.9刚出就直接开始使用了。还依赖一个不成熟的spring-kafka库来做开发,开发到快要上线遇到了消费hang住的情况,没有去深查源码,选择了去第三方库的方式。。。用官方的原生sdk来规避这个问题。说来运气不错,这个问题竟然被成功地规避掉了(233。
然后就遇到了紧接着的重复消费的问题,同事遇到了问题首先的疑惑是,为什么我使用了别人的demo代码,但在我的场景里才出现了重复消费呢?
嗯,好吧,我们来查一查。
一个kafka 0.9比较典型的消费一般是长这样的
main:
for(int