用户在下载应用之后,可以发评论。
通过唯一主键:appid+version+country+uid限制对一个app的发表次数。
对UID维度,在redis进行发评论计数,比如10分钟超过10条就暂时拉黑。
通过一个字典树维持敏感词,对评论内容进行过滤,如果包含敏感词直接发表失败。这个操作是同步的,敏感词库的条数后来已经来到了几千条,存在内存里面不涉及IO,实际上性能还可以接受。
评论请求还会起一个异步线程,调用安全服务做自动化审核,这个服务不在我们这边,里面大概做一些对ip、uid、内容文字等的识别,判断是否存在一些集聚的刷子黑产。
入库的时候,会在主线程写入es、mysql、Cassandra,清空或刷新redis缓存。同时做一些发消息、打点。
每次进详情页,都要查是否发表过评论,没有的话就展示发表评论,早期的时候每次都会查表, 浪费很多性能,后面做了一个缓存,即使没发过也会缓存一次。这个缓存的维度是uid*appId的,量会很大,所以设计的非常精简,上线后确实占用了很多redis内存,但还可以接受。
发表评论会对应用的评论统计产生影响,对于头部应用,如果每次发表评论就做一次全量统计,会有很大的负荷。所以后来做了一个优化,只对评论数较少的应用,在发布评论的时候会做评分、评论数统计刷新。对于评论数较多的应用,通过定时任务,一个一个app异步去做刷新。