auto-read-liunxdo 多数据库存储架构解析:PostgreSQL/MySQL/MongoDB三库协同设计

auto-read-liunxdo 多数据库存储架构解析:PostgreSQL/MySQL/MongoDB三库协同设计 auto-read-liunxdo 多数据库存储架构解析PostgreSQL/MySQL/MongoDB三库协同设计【免费下载链接】auto-read-liunxdoAuto-scrubbing of articles and auto-likes in discourse项目地址: https://gitcode.com/gh_mirrors/au/auto-read-liunxdo一、什么是 auto-read-liunxdo 的多数据库存储架构auto-read-liunxdo 是一款面向 Discourse 社区论坛的自动阅读与自动点赞工具它不仅能帮你自动浏览帖子、随机点赞还内置了一套非常实用的多数据库存储架构——将抓取到的文章与话题数据同时写入PostgreSQL、MySQL、MongoDB三大数据库实现三库协同、互为备份。对于想了解一个开源项目如何同时适配多种数据库的新手来说这套设计是绝佳的学习范本。它的核心代码集中在 src/db.js 一个文件里结构清晰值得反复研读。上图是 auto-read-liunxdo 在 Discourse 论坛中的运行效果启用自动点赞、开始阅读按钮一目了然。二、为什么需要三库协同单一数据库的痛点很多爬虫类项目只用一种数据库一旦数据库服务商宕机、连接超时或数据被误删历史抓取数据就会全部丢失。auto-read-liunxdo 的做法是把同一份数据并行写入多个数据库任何一个库出现问题其他库依然保有完整数据这就是三库协同设计的核心价值。三、三库协同架构谁做主库、谁是备份项目在 GITHUB_SECRETS_GUIDE.md 中定义了完整的数据库环境变量体系环境变量数据库类型角色POSTGRES_URIPostgreSQLAiven主数据库COCKROACH_URICockroachDB兼容 PostgreSQL 协议备用数据库当前实际主用NEON_URINeonServerless PostgreSQL备用数据库AIVEN_MYSQL_URIMySQLAiven关系型备用库MONGO_URIMongoDB文档型备用库值得注意的是CockroachDB 与 Neon 都兼容 PostgreSQL 协议因此它们共用pg连接池代码中只需编写一套 SQL 即可复用这大大降低了多库适配成本。相关的根证书文件存放在 postgresql/root.crt用于 SSL 加密连接。四、三库连接池的统一管理方法在 src/db.js 中作者通过统一的getAllDatabases()函数把所有连接收拢到一个数组里后续所有操作都只需遍历这个数组PostgreSQL 系使用pg的Pool连接池分别创建主库、CockroachDB、Neon 三个池MySQL使用mysql2/promise通过initMySQL()惰性初始化连接池MongoDB使用官方mongodb驱动连接后固定使用auto_read_posts数据库。每个连接都配置了合理的超时时间如connectionTimeoutMillis: 15000专门应对跨区域访问云数据库时的网络延迟问题。对应依赖可在 package.json 中查看pg、mysql2、mongodb三个核心驱动。五、数据同步与去重三库写入的关键技巧5.1 帖子数据的并行写入savePosts()函数会把解析好的 RSS 文章列表并行写入所有已启用的数据库并针对每种数据库使用不同的去重策略PostgreSQLON CONFLICT (guid) DO NOTHING利用guid唯一约束天然去重MySQLON DUPLICATE KEY UPDATE重复时更新字段MongoDBbulkWrite批量upsert按guid过滤更新。写入采用Promise.allSettled即使某个数据库写入失败也不会影响其他库的正常写入最终只要有一个库成功就算成功——这正是容错设计的精髓。5.2 GUID 查重主库优先、备库兜底isGuidExists()用于判断帖子是否已处理过。查询策略是先查主数据库如果主库没找到或查询失败再依次遍历所有备用数据库兜底查询。这一设计保证了即使主库短暂不可用去重逻辑依然可靠避免重复推送 Telegram 消息。5.3 话题数据的 JSON 存储除了 RSS 帖子项目还支持抓取话题 JSON 数据src/topic_data.js并通过saveTopicData()保存。这里展示了三库对半结构化数据的不同处理方式PostgreSQL 使用tags TEXT[]数组 raw_data JSONBMySQL 使用tags JSONraw_data JSONMongoDB 直接把整个文档原样存入集合。同一份数据三种库各用最合适的类型承载这就是协同的另一种体现。六、如何快速启用三库存储如果你也想在自己的部署中开启多数据库存储只需几步在.env或.env.local中配置对应的连接字符串例如COCKROACH_URI...、AIVEN_MYSQL_URI...、MONGO_URI...在 src/db.js 的allPools数组和getAllDatabases()中取消对应注释即可启用使用 debug_db.js 或 src/db.test.js 快速验证连接与读写是否正常。运行npm install安装依赖后数据库测试脚本会自动完成保存帖子 → 查重的完整闭环验证非常适合作为多库接入的自检工具。七、总结三库协同设计带来的启示auto-read-liunxdo 的多数据库存储架构看似复杂实则遵循了几条简单原则统一抽象一个数组管所有库、并行写入一次操作同步三库、按库定制去重发挥各自特性、容错优先allSettled 保底。对新手而言这套设计不仅保证了数据安全更是一份如何优雅地适配多种数据库的活教材。如果你正打算为自己的项目引入 PostgreSQL、MySQL、MongoDB 中的多个数据库不妨直接参考 src/db.js 的实现思路定能事半功倍。【免费下载链接】auto-read-liunxdoAuto-scrubbing of articles and auto-likes in discourse项目地址: https://gitcode.com/gh_mirrors/au/auto-read-liunxdo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考