第二章:系统架构设计 — 分层架构与技术选型

做舆情监控系统,第一步不是写代码。

我见过太多团队,上来就搞爬虫、调API,结果数据量一上来,系统直接崩了。说白了,架构设计才是真正的“地基”。这一章,我就跟你聊聊,一个靠谱的舆情监控系统,到底该怎么搭。

2.1 整体架构分层

我个人习惯把系统拆成四层:数据采集层、处理层、存储层、展示层。每一层各司其职,互不干扰。你想想看,如果所有逻辑都揉在一起,后期维护起来得多痛苦?

核心原则:每一层只做一件事,层与层之间通过标准接口通信。

下面这张图,是我自己项目里常用的架构图。你可以直接拿去用。

展示层 大屏看板 | 预警通知 | 报表导出 | 舆情地图 存储层 MySQL(元数据) | Elasticsearch(全文检索) | Redis(缓存) | HDFS(原始数据) 处理层 数据清洗 | 情感分析 | 关键词提取 | 事件聚类 | 预警规则引擎 数据采集层 微博API | 微信公众号 | 新闻RSS | 论坛爬虫 | 短视频平台 数据流 数据流 数据流

2.2 数据采集层

这一层是系统的“眼睛”。没有数据,后面全是空谈。

采集层要解决的核心问题就两个:怎么拿数据拿多少数据

  • API采集:微博、微信、知乎这些大平台,都有开放API。优点是稳定,缺点是限流。我记得有一次,微博API的调用频率被限制到每分钟30次,差点把项目搞黄。
  • 爬虫采集:针对没有API的网站,比如一些地方论坛、行业垂直网站。这里要注意,爬虫一定要遵守robots协议,别给自己惹麻烦。
  • RSS订阅:很多新闻网站还保留着RSS输出。这玩意儿虽然老,但胜在轻量、实时。
  • 消息队列缓冲:采集到的数据先扔进Kafka或RabbitMQ。为什么要这么做?因为采集速度和处理速度往往不匹配。用消息队列做缓冲,系统就不会被突发流量冲垮。

我的经验:采集层一定要做“去重”。同一个新闻被多个源转载,如果不做去重,后面分析出来的结果全是重复的。我一般用URL的MD5值做唯一键。

2.3 处理层

处理层是系统的“大脑”。数据进来之后,得让它变得有价值。

这一层我一般拆成几个模块:

  1. 数据清洗:去掉HTML标签、过滤广告、统一编码格式。嗯,这一步看着简单,但坑最多。我曾经遇到过一条数据里混了三种编码格式,清洗脚本直接报错。
  2. 情感分析:判断舆情是正面、负面还是中性。现在用预训练模型(比如BERT)效果已经不错了。但要注意,中文里的反讽、谐音梗,模型经常翻车。
  3. 关键词提取:用TF-IDF或TextRank算法,把核心实体和话题拎出来。
  4. 事件聚类:把相似的内容归到一起。比如“某品牌产品召回”和“某品牌质量问题”,其实说的是同一件事。
  5. 预警规则引擎:设定阈值,比如“负面舆情占比超过30%”或“转发量超过1万”,触发预警。

避坑指南:我曾经把预警阈值设得太低,结果半夜三点被报警短信吵醒,一看只是某个大V发了个吐槽。阈值一定要根据历史数据动态调整,别拍脑袋定。

2.4 存储层

存储层是系统的“记忆”。选错存储方案,后面查数据能查到怀疑人生。

我的选型原则很简单:不同数据,用不同数据库

数据类型 推荐存储 原因
元数据(用户、配置) MySQL 关系型,支持事务,查询灵活
全文数据(帖子、评论) Elasticsearch 全文检索快,支持分词、聚合
缓存数据(热点、排行榜) Redis 读写速度快,支持过期策略
原始数据(日志、快照) HDFS / 对象存储 容量大,成本低,适合冷数据

你可能会问:为什么不用一个数据库搞定所有?

原因很简单——没有银弹。MySQL存大文本检索慢,ES不适合频繁更新,Redis存不了海量历史数据。各司其职,才是正道。

2.5 展示层

展示层是系统的“脸面”。数据再牛,用户看不懂也白搭。

我个人习惯用 Vue + ECharts 做前端展示。为什么选这个组合?

  • Vue:上手快,组件化开发,适合快速迭代。
  • ECharts:图表库里的“瑞士军刀”,折线图、热力图、关系图,基本都能搞定。
  • WebSocket:做实时推送。舆情监控讲究的就是“快”,用户不想手动刷新页面。

展示层一般包含这几个模块:

  1. 舆情总览大屏:实时展示舆情总量、情感分布、热点话题。
  2. 预警通知:通过短信、邮件、企业微信机器人推送。
  3. 趋势分析:按时间维度展示舆情走势,支持按平台、地域下钻。
  4. 报告导出:生成PDF或Excel报告,方便汇报。

小技巧:展示层一定要做“移动端适配”。我遇到过客户在出差路上,用手机打开大屏,结果布局全乱了。从那以后,我所有项目都强制要求响应式设计。

2.6 技术选型原则

技术选型这事儿,没有标准答案。但我有几个原则,你可以参考:

  • 成熟优先:能用社区活跃、文档齐全的开源项目,就别自己造轮子。比如消息队列选Kafka,别自己写一个。
  • 团队匹配:选团队熟悉的技术栈。如果团队全是Java背景,硬上Go,后期维护成本会很高。
  • 可扩展性:系统要能水平扩展。比如采集层,加机器就能提高采集速度,而不是改代码。
  • 成本可控:别一上来就上全套云原生。小项目用单机MySQL + Redis也能跑,等量上来了再迁移。

避坑指南:我曾经为了追求“高大上”,选了一个冷门时序数据库。结果社区没人,遇到Bug只能自己啃源码。后来乖乖换回了InfluxDB。记住:选技术不是选美,实用最重要

好了,这一章的内容就这些。架构设计是系统的骨架,骨架搭好了,后面填肉才踏实。下一章,我们会深入数据采集层的具体实现,包括API对接、爬虫框架选型、反爬策略等。到时候见。


公众号:蓝海资料掘金营,微信deep3321