技术概览
本文主要为场景设定目的而写。这里没有什么特别引人注目的内容,但在我们深入真正有趣的设计方面之前,先了解基本事实是有用的。
提醒一下,如果您想查看目前任何内容的外观,请访问 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用于政党变更的数据。
- 国家统计局用于邮政编码信息。
- 下一个选举的维基百科页面用于查看何时有新的民意调查要添加。
- 许多民意调查公司,他们都慷慨地允许我使用他们的民意调查和席位预测。