评价系统

这是七米老师的一个课程项目。
主要讨论的是两个场景下的评价和评论系统。

电商场景下评价系统


电商类评价系统主要侧重对商品的描述、质量、价格等⽅⾯的评价,需要有关联的SKU/SPU和订单等信息,
数据⽅⾯更强调标签化,好评数、中评数、差评数等。

UGC社区评论系统


UGC区的评论可以包含更多维度的信息,不仅有⽂字还可以添加图⽚、视频等多媒体信息,评论数据则以数
量、点赞数、回复数等形式进⾏统计,更注重⽤户的互动和参与度。

相同点

从技术上看都是用户对一个对象发布关联信息。

电商评价中的输入输出

模块划分


C端:⽤户端,包括发评⽤户和看评⽤户。
B端:商家端,店铺商家端,店铺管理者,商品发布者。
O端:运营端,运营同学在运营后台负责审核⽤户评价,处理商家申诉,以及基于评价进行运营活动。


架构图分为 请求入口层 → 业务服务层 → 存储与缓存层 → 搜索与任务处理层 四个部分。

请求入口层:在这里实现鉴权、限流、熔断、日志记录等跨切面关注点,保证内部服务的安全与稳定。之后将请求转发后面对应的微服务(review-c, review-b, review-o)。

业务服务层review-c (Review-Customer), review-b (Review-Business), review-o (Review-Order)。根据业务维度进行拆分。例如,review-c负责用户侧评价的展示和发布,review-b负责商家后台的回复与管理,review-o负责与订单流程相关的评价逻辑。这种拆分避免了服务过于臃肿,便于独立开发、部署和扩缩容。他们都通过调用review-service对数据进行处理。
review-service负责所有评价的核心逻辑:

  • 写入数据 → 将评价写入 MySQL。

  • 缓存加速 → 将热点数据写入 Redis,避免频繁查询数据库。

  • 搜索与查询 → 调用 Elasticsearch,支持复杂搜索(比如关键词搜索、模糊匹配)。

  • 与其他业务模块交互 → 通过 gRPC 和 review-c/b/o 服务协作。

数据处理与异步化层
这是保证系统高性能和可扩展性的关键。

  • Canal + Kafka (数据同步与消息队列)

工作流程:

Canal:伪装成MySQL的从库,实时监听并解析MySQL的binlog,当write服务向MySQL写入新的评价数据后,Canal能立刻捕获到这一行数据的变更。

Kafka:Canal将变更数据作为消息发送到Kafka消息队列中。

好处:

解耦:write服务写完数据库后就返回成功,后续所有依赖新数据的操作(如更新缓存、构建搜索索引)都通过消费Kafka的消息来完成,与主流程完全解耦,不会阻塞用户请求。

异步化:实现了最终一致性模型,系统吞吐量更高。

  • review-task (异步任务服务)

角色:作为Kafka的消费者,订阅评价数据变更的消息。

职责:它负责执行各种耗时或非实时的任务,例如:

更新Redis缓存:消费消息,将最新的评价数据更新或预热到Redis中,保证下次read服务能读到新数据。

更新搜索索引:将变更数据同步到reviewsearch(可能是Elasticsearch)中,用于支持复杂的评价搜索功能。

  • reviewsearch (搜索服务,如Elasticsearch)

用途:专门用于处理复杂的评价搜索查询,比如“搜索包含‘物流快’关键词的五星评价”。Elasticsearch的倒排索引特性使得这类查询非常高效。


可以看到两者的分层都差不多,区别在于UGC先写入kafka。
为什么两者不同

  • 电商评价系统(写 MySQL)

电商评价的特点是:

数据量相对较小(用户下单后才会评价,不是随时都能发)。

业务上要求强一致性(评价必须实时写入数据库,保证用户一提交就能看到)。

所以选择 同步写 MySQL,再通过 Canal 同步到 ES。

  • UGC 评论系统(写 Kafka)

UGC 评论的特点是:

评论量大、并发高(随时随地发评论,量级比电商评价大得多)。

允许一定程度的最终一致性(评论写入后,稍晚一点出现在页面上可以接受)。

通过 Kafka 解耦,能抗高并发,同时异步落库和构建缓存。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容