技术概述
这篇文章主要用于场景设定。这里没有特别引人注目的内容,但在我们深入探讨真正有趣的设计方面之前,先把基本事实说清楚是很有用的。
提醒一下,如果您想查看当前网站的样子,请访问 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,用于获取政党变更的数据。
- 国家统计局,用于获取邮政编码信息。
- 下一次选举民意调查的维基百科页面,用于查看何时有新的民意调查需要添加。
- 许多民意调查公司,他们都慷慨地允许我使用他们的民意调查和席位预测。