悠悠楠杉
Golang构建基础评论审核系统:从设计到实现
go
func (s *ModerationService) CheckComment(c *Comment) *ModerationResult {
result := &ModerationResult{
Passed: true,
Score: 0,
}
var mu sync.Mutex
var wg sync.WaitGroup
checkField := func(field, fieldName string) {
defer wg.Done()
if hits := s.keywordFilter.FindAll(field); len(hits) > 0 {
mu.Lock()
result.Passed = false
result.RejectedBy = append(result.RejectedBy, hits...)
result.Score += float64(len(hits)) * 10
mu.Unlock()
}
}
wg.Add(3)
go checkField(c.Title, "title")
go checkField(c.Description, "description")
go checkField(c.Content, "content")
wg.Wait()
return result
}
这种并行处理方式充分利用了多核CPU的能力,在高负载环境下仍能保持低延迟响应。
规则配置与动态更新
硬编码的关键词列表难以适应不断变化的内容环境。为此,我们引入配置热加载机制。通过监听配置文件变化,系统可以在不重启服务的情况下更新敏感词库:
go
func (f *KeywordFilter) WatchConfig(path string) {
watcher, _ := fsnotify.NewWatcher()
defer watcher.Close()
done := make(chan bool)
go func() {
for {
select {
case event := <-watcher.Events:
if event.Op&fsnotify.Write == fsnotify.Write {
f.ReloadFromFile(path)
}
}
}
}()
}
同时,我们支持分级规则配置。例如,某些词汇仅在特定组合下才被视为违规,或者根据不同字段设置不同的权重系数。这为精细化运营提供了技术基础。
接口设计与集成
最后,我们暴露RESTful API供上游服务调用:
go
func (h *Handler) ModerateComment(w http.ResponseWriter, r *http.Request) {
var comment model.Comment
if err := json.NewDecoder(r.Body).Decode(&comment); err != nil {
http.Error(w, "invalid json", http.StatusBadRequest)
return
}
result := h.moderationService.CheckComment(&comment)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(result)
}
该接口接收JSON格式的评论数据,返回审核结果。前端或后端服务可在用户提交评论后立即调用此接口,实现近乎实时的内容过滤。
