技术概述
这篇文章主要用于场景设置。这里没有什么特别引人注目的内容,但在我们深入探讨真正有趣的设计方面之前,先把基本事实说明白是很有用的。
提醒一下,如果你想看看目前这些内容的表现形式,请访问 https://election2029.uk。
需要始终记住的主要一点是,该网站具有一些相对罕见的特性:
- 它是纯只读的:如果有用户输入,也只是为了改变显示内容。
- 数据量足够小,所有内容都可以放在内存中。
- 在选举夜本身之前,数据变化非常缓慢。在选举宣布之前,每天可能只有两三次数据变化。在选举活动期间,很可能每天会有多次新的民意调查和MRP。在选举夜,我希望尽可能快地提供最新结果。
技术栈选择
你可能会注意到,大部分技术栈都基于Google Cloud。是的,我有偏见。不,我没有费心去研究在Azure或AWS上构建相同的东西是否会更容易或更便宜。除此之外,我喜欢成为自己的客户:我使用为GCP构建的库,如果发现有什么令人沮丧的地方,我会提交功能请求并可能实施修复。同样,我可以将其他方面(如Cloud Run和Cloud Build)的反馈传递给同事。我相信这个网站可以在任何其他云平台上构建。我在这里的选择并不是要贬低其他选项——但我必须说,我对自己做出的选择非常满意。
Web:ASP.NET Core 和 Razor
该网站使用Razor进行所有HTML格式化,但并没有以"正常"方式真正使用MVC或Razor Pages。很少有页面有代码隐藏文件。它类似于MVVM,或者至少是"我理解的MVVM"(这可能会让大多数实践者感到震惊)。我将在后续文章中详细介绍这一点,包括它如何与依赖注入一起工作。
目前我使用的是.NET 9——我期望在发布新版本时更新到新版本的.NET,但从不使用预发布版本。这意味着在选举夜,该网站很可能运行的是.NET 13。
我使用一些JavaScript库用于图形展示目的,但就Web技术而言,仅此而已。没有所谓的"框架"——没有Bootstrap、没有Angular、没有React等等。我相信它们有它们的用武之地,但到目前为止,我还没有感觉到除了手工制作的CSS之外还需要任何东西。
托管:Google Cloud Run
我2024年的选举网站运行在GKE集群上,现在我已经关闭了它,转而将所有内容托管在Cloud Run上。我花了一段时间才真正接受整个无服务器的概念,但现在我很喜欢它。它确实带来了一些设计挑战,我将在另一篇文章中讨论这些挑战,但总的来说,我非常满意。几年前至少需要一些努力的方面(个性化域名和HTTPS证书)现在确实非常简单——这对于一个业余项目来说意义重大。(为商业项目花一整天配置基础设施是一回事;为业余爱好则完全是另一回事。)
目前我仍然在Google Cloud Platform上有承诺使用折扣(这是我在认真考虑关闭GKE集群之前购买的),但当它在2027年到期时,我期望能够以每天不到一美元的价格运行我所有的网站。可能值得续订我的CUD,但金额要低得多。我必须临近时再看看。
当然,如果网站成功,我预计在选举活动期间它会相当昂贵——但它必须非常成功,才需要扩展到足够多的实例,让我的钱包出汗。
构建/部署:Google Cloud Build
虽然在这里我可以考虑其他选项,但Cloud Run与Cloud Build集成得非常好,而Cloud Build又与GitHub集成得很好。当我写关于不同环境的文章时,我会在这里更详细地介绍,但大部分都很无聊,这正是我喜欢的方式。我编写代码,提交它,推送它,然后在想要的时候部署它。
数据/存储:Firestore
Firestore是一个文档数据库。现在当你听到"数据库"时,你可能会想到查询——而这正是我真正做得不多的事情。可以公平地说,我使用Firestore的方式几乎肯定可以同样好地使用Google Cloud Storage(基本上是blob存储)来实现。我甚至可能在某个时候将其实现为一个选项,只是为了看看它在代码复杂性和性能方面的表现。
但目前,Firestore对我来说肯定足够好用,而且我使用它的方式几乎是免费的。
源代码控制:GitHub
代码都存储在GitHub中。回答下一个明显的问题:不,它不在公共仓库中。这有几个原因,其中一些是官僚主义的,但最重要的原因可能是我保留了民意调查的基础数据副本(主要是Excel文件和PDF),这些是由民意调查公司发布的。这是他们向所有人免费提供的数据,但我不确定他们是否乐意看到这些数据在其他地方公开分发。
当然,我可以采取其他方法,例如将数据文件存储在GCS中而不是源代码控制中,等等。我可能在未来重新审视这个决定,特别是如果官僚主义方面随着时间的推移而消失。这绝对不是因为这个网站的"秘方"太出色,以至于我认为出于经济原因值得保密。
数据源
这是最可能过时的方面,但目前我使用以下数据源:
- Democracy Club,用于获取关于候选人、选票、结果等的大量数据。
- 议会成员API,用于获取政党变更的数据。
- 国家统计局,用于获取邮政编码信息。
- 维基百科的下次选举民意调查页面,用于查看何时有新的民意调查需要添加。
- 许多民意调查公司,他们都慷慨地允许我使用他们的民意调查和席位预测。