技术概览
本文主要作为技术背景介绍。虽然内容没有特别突出之处,但在深入探讨真正有趣的设计细节之前,先了解基本事实非常有用。
提醒:如需查看当前网站效果,请访问 https://election2029.uk。
需要始终牢记的是,该网站具有一些相对罕见的特点:
- 纯只读架构:用户输入仅用于改变显示内容
- 全内存数据:数据量较小,可全部加载至内存
- 渐进式数据更新:大选夜之前数据变化缓慢。选举公告前每日最多2-3次数据更新,竞选期间每日可能新增多个民调和MRP数据。大选夜将尽可能快速提供最新结果
技术栈选择
大部分技术栈基于Google Cloud。我承认存在偏好,但并未比较在Azure或AWS构建相同功能的难易度或成本。更重要的是,我喜欢作为自己的客户:使用为GCP构建的库,遇到问题时可以提交功能请求并自行修复。同时也能向同事反馈Cloud Run和Cloud Build的使用体验。虽然该网站可在任何云平台构建,但当前选择令人满意。
前端:ASP.NET Core与Razor
网站使用Razor进行HTML格式化,但未采用标准的MVC或Razor Pages模式。极少页面使用代码后置文件,更接近MVVM模式(或至少是我理解的MVVM)。后续文章将详细说明其与依赖注入的集成方式。
当前使用.NET 9,计划随新版本发布持续升级,但绝不使用预发布版本。预计大选夜将运行.NET 13。
仅使用少量JavaScript库进行图形展示,未采用Bootstrap、Angular、React等框架,目前手工编写的CSS已满足需求。
托管:Google Cloud Run
2024年大选网站运行于GKE集群,现已转为全量托管至Cloud Run。虽然花时间才适应无服务器概念,但现在非常满意。尽管存在设计挑战(将另文说明),但自定义域名和HTTPS证书等原本复杂的功能现在变得简单,这对业余项目至关重要。
目前仍享有GCP承诺使用折扣(关闭GKE集群前购买),2027年折扣到期后预计每日运营成本低于1美元。若网站访问量激增,可能需要扩展实例规模,但预计成本仍在可控范围。
构建部署:Google Cloud Build
Cloud Run与Cloud Build无缝集成,后者又与GitHub紧密对接。代码提交后可通过推送触发部署流程,具体环境配置将在后续文章中详述。
数据存储:Firestore
Firestore作为文档数据库,在本项目中查询功能使用较少。当前使用方式其实也可通过Google Cloud Storage(Blob存储)实现,未来可能尝试比较两种方案在代码复杂性和性能方面的差异。目前Firestore完全满足需求且成本极低。
源码管理:GitHub
所有代码存储于GitHub私有仓库。主要原因包括政策因素和民调原始数据(Excel/PDF文件)的存储考虑。虽然这些数据可公开获取,但不宜在其他平台分发。未来可能调整数据文件存储策略,例如迁移至GCS。
数据来源
当前使用的数据源包括:
- Democracy Club:候选人、选票、结果等数据
- 议会成员API:政党变更数据
- 国家统计局:邮编信息
- 维基百科下届大选民调页面:新民调数据监测
- 多家民调机构:已获授权使用其民调和席位预测数据