真正的挑战在于静态 CT提交 API 。具体来说,它们允许 CT 客户端提交证书链,并将其合并到仅追加日志中。我们使用Workers作为 CT 日志应用程序的前端。Workers 运行在靠近客户端的数据中心,可按需扩展以处理请求负载,使其成为运行大多数重量级请求处理逻辑的理想场所,包括验证请求、检查重复数据删除缓存(下文讨论)以及提交待排序的条目。
下一个问题是,我来处理 CT 日志排序逻辑,该逻辑需要有状态且紧密协调。我们选择了持久 澳大利亚电报号码数据 对象 (DO),这是一种特殊类型的有状态 Cloudflare Worker,其中每个实例都具有持久存储和唯一名称,可用于将来自世界任何地方的请求路由到它。DO 旨在轻松扩展,适用于那些可以轻松分解为独立单元的应用程序,这些单元之间无需进行大量协调。例如,聊天应用程序可以使用一个 DO 来控制每个聊天室。在我们的模型中,每个 CT 日志都由单个 DO 控制。这种架构使我们能够在单个 Workers 应用程序中轻松运行多个 CT 日志,但正如我们将看到的,单个单线程 DO的局限性很容易成为瓶颈。稍后将详细介绍这一点。
将 CT 日志后端作为持久对象后,其他几个组件也随之到位:持久对象的强一致性事务存储恰好满足了“锁后端”持久化日志最新检查点的要求,并且我们可以使用警报每秒触发日志排序。我们还可以使用位置提示将 CT 日志放置在地理位置上靠近客户端的位置,以降低延迟,类似于Google 的 Argon 和 Xenon 日志。