SSWG 年度更新
Swift 服务端工作组 (SSWG) 在 12 个月前 设定了目标,开始定义和优先考虑新的工作,以满足 Swift 服务端社区的需求。从那时起,我们一直忙于定期会议,与社区合作,定义指南,编写 Swift 软件包,对提案进行投票,在论坛上发帖等等。我们认为,我们朝着去年设定的目标取得了重大进展,今天想与您分享一个高级别的更新。
孵化过程
我们认为,一个健康的开源生态系统在很大程度上依赖于其软件包的质量。因此,我们最大的重点是软件包的提案流程(有点类似于 Swift 演化),我们称之为孵化过程。这个过程定义了拥有现有 Swift 软件包或新想法的人如何获得反馈,遵循最佳实践,并最终被包含在官方 Swift 服务端软件包索引中。
孵化过程充满了围绕并发、测试和代码风格等方面的深思熟虑的指南和要求。SSWG 正在持续改进孵化过程及其建议。已经提出并接受了对该过程的两项修正案。
虽然我们希望代码质量高,但我们也意识到要尽可能降低入门门槛。为了使孵化过程简单易用,我们使用了 Swift 论坛。提交您的想法或软件包(孵化过程的第一步)是通过在“服务器 > 提案”类别中创建一个新帖子来完成的。
一旦软件包完成孵化过程并被 SSWG 接受,它将被列在 Swift 服务端软件包索引中。被接受的软件包将接受定期审查,以确保它们仍然符合合格标准。虽然这个索引仍处于初级阶段,但我们希望它能成长为 Swift 程序员的宝贵资产。
库
到目前为止,已经通过孵化过程接受了九个提案。这些软件包正在被流行的服务端 Swift 框架(如 Vapor 4 和 Kitura)的即将发布的版本快速采用。
SwiftNIO
- 接受日期:2018 年 9 月 7 日
- 作者:Apple (@apple)
- 代码:github.com/apple/swift-nio
用于高性能协议服务器和客户端的事件驱动型网络应用程序框架,非阻塞。
这个软件包是 Swift 服务端生态系统的核心。它为网络通信提供了一个通用的 API,该 API 具有高度的可扩展性和效率。大多数进行网络操作的软件包要么直接构建在 SwiftNIO 之上,要么提供一些包装器以便于互操作。
SwiftLog
- 接受日期:2019 年 2 月 7 日
- 作者:Johannes Weiss (@weissi)
- 代码:github.com/apple/swift-log
Swift 的日志记录 API
任何想要输出日志但又不想担心使用哪种特定日志记录实现的软件包都可以使用这个通用的日志记录 API。通过使用 SwiftLog,您的软件包可以让最终用户选择如何累积信息。
由于日志记录 API 的成功在很大程度上取决于采用率,因此 SSWG 优先开发此软件包,以确保质量和尽早可用性。
SwiftMetrics
- 接受日期:2019 年 4 月 4 日
- 作者:Tomer Doron (@tomerd)
- 代码:github.com/apple/swift-metrics
Swift 的指标 API
SwiftMetrics 为指标提供了一个通用的 API。这允许软件包使用仪表(如量规、计时器、计数器等)报告结构化信息。与 SwiftLog 一样,使用 SwiftMetrics API 的软件包让最终用户可以自由选择使用哪种指标实现。
PostgresNIO
- 接受日期:2019 年 5 月 16 日
- 作者:Tanner Nelson (@tanner0101)
- 代码:github.com/vapor/postgres-nio
用于 PostgreSQL 的非阻塞、事件驱动型 Swift 客户端。
PostgresNIO 是第一个获得 SSWG 批准的数据库驱动程序(未来还会有更多)。这个 Postgres 客户端从头开始基于 SwiftNIO 2 构建,遵循了孵化过程概述的最佳实践。
与基于阻塞式 C 的方法相比,原生使用 SwiftNIO 使这个 Postgres 客户端在与 SwiftNIO HTTP 服务器一起运行时效率更高。
rediStack
- 接受日期:2019 年 6 月 27 日
- 作者:Nathan Harris (@mordil)
- 代码:github.com/Mordil/swift-redi-stack
用于 Redis 的非阻塞、事件驱动型 Swift 客户端。
在 Postgres 客户端之后不久,就出现了 Redis 客户端 RediStack。这个软件包也是原生基于 SwiftNIO 2 构建的,并非常注意遵循最佳实践。鉴于 Redis 的 RESP 协议的简单性,这个软件包对于任何有兴趣制作自己的数据库驱动程序的人来说,都是一个很好的示例项目。
AsyncHTTPClient
- 接受日期:2019 年 6 月 27 日
- 作者:Artem Redkin (@artemredkin)
- 代码:github.com/swift-server/async-http-client
基于 SwiftNIO 构建的 HTTP 客户端库
对于 Swift 服务端应用程序,此软件包提供了一个高效且易于使用的 URLSession
替代方案。与基于 Linux 的 cURL 的 URLSession
相比,AsyncHTTPClient 可以与其他基于 SwiftNIO 的软件包更高效地协同使用。此软件包支持流式传输主体、代理、Cookie 解析等。
APNSwift
- 接受日期:2019 年 6 月 27 日
- 作者:Kyle Browning (@kylebrowning)
- 代码:github.com/kylebrowning/APNSwift
一个基于 swift-nio 构建的 HTTP/2 APNS 库
这个软件包使得通过 APNS 发送推送通知变得容易。它提供了一个简单的 API,该 API 在幕后使用 ECDSA 处理 HTTP/2 连接、负载编码和 JWT 签名创建。
StatsdClient
- 接受日期:2019 年 8 月 8 日
- 作者:Tomer Doron (@tomerd)
- 代码:github.com/apple/swift-statsd-client
swift-metrics 的指标后端,使用 statsd 协议。
这个软件包允许 Swift Metrics API 使用 statsd 协议将数据输出到聚合服务器。
Prometheus
- 接受日期:2019 年 8 月 8 日
- 作者:Jari (@MrLotU)
- 代码:github.com/MrLotU/SwiftPrometheus/
Swift 中的客户端 Prometheus 库
这个软件包允许 Swift Metrics API 将数据输出到 Prometheus。
工具链
除了软件包孵化之外,SSWG 还专注于改进 Swift 及其在 Linux 上的工具链。
Docker
现在可以通过 Docker hub 获取适用于 Swift 3、4 和 5 的官方 Swift 镜像,这些镜像支持 Ubuntu 16.04 (Xenial) 和 Ubuntu 18.04 (Bionic) 系统。每当发布新版本的 Swift 时,都会创建新的镜像。除了包含构建和运行 Swift 所需一切内容的普通镜像外,现在还有“slim”镜像,其中仅包含运行 Swift 所需的内容。这些镜像非常适合在使用多阶段构建 Docker 构建时减小最终容器的大小。请查看 Swift Docker 仓库 以获取更多信息。
Swift Backtrace
- 作者:Ian Partridge (@ianpartridge)
- 代码: github.com/ianpartridge/swift-backtrace
此软件包为 Linux 上 Swift 程序的自动打印崩溃回溯提供了支持。回溯由内置的 C 库 libbacktrace 生成,并使用私有的 Swift 运行时调用进行反混淆。我们希望通过采用 SE-0262 (如果获得批准) 来改进实现。我们还在与 Swift 核心团队合作,讨论将此功能合并到 Swift 标准库中的好处。
Linux 补丁版本
从 Swift 4.2.2 开始,Linux 现在每月都会收到包含错误修复的补丁版本。每个补丁版本都会有一名审核经理负责在为期三周的窗口期内合并补丁。在此窗口期结束后,补丁将最终确定并在 上发布。这意味着 Linux 服务器将比以前更快地访问 Swift 及其核心库中的错误修复和改进。
未来:2020 年的重点领域
展望未来,我们的主要重点将继续放在向我们的索引添加新的软件包。我们希望在 2020 年看到大量软件包。除了软件包之外,我们还希望继续改进 Swift 及其在服务器上的工具。
如果以下列出的任何新重点领域引起您的兴趣,我们强烈建议您参与进来。如果您不确定从哪里开始,请考虑在 Swift 论坛的 服务器版块 中发布您的问题或想法。您也可以考虑更正式地向工作组 推介 您的想法。查看我们的 孵化流程,其中描述了如何向我们的索引推介、提议和提交软件包。
数据库驱动程序和存储客户端
SSWG 已接受 Postgres 和 Redis 的客户端实现。
目前正在努力提出使用 MongoKitten 和 MongoDB C 驱动程序 的 MongoDB 客户端。
Vapor 计划推介其另外两个数据库驱动程序,MySQLNIO 和 SQLiteNIO。
但是还有更多数据库!仅举几例,如 Zookeeper、Cassandra 和 Kafka。我们强烈鼓励任何在数据库驱动程序方面有专长的人考虑参与进来。
分布式追踪
可观测性的前两个 支柱 已被接受:swift-log 和 swift-metrics。现在我们需要最后一块:追踪。最近在追踪方面取得了令人兴奋的进展,例如 OpenTracing 加入 CNCF。如果您有兴趣帮助设计 Swift 中分布式追踪的未来,我们很乐意听取您的意见。
连接池
Vapor 的 AsyncKit 软件包、AsyncHTTPClient 和其他软件包正在开发连接池实现。关于并发和性能已经出现了很多有趣的问题。是否可以有一个连接池来统治一切,还是应该有许多遵循深思熟虑的最佳实践的独立连接池?如果您对 Swift 中的连接池应如何工作有想法,请集思广益。
OpenAPI
Kitura 长期以来一直支持 OpenAPI,而 Vapor 也开始探索这个领域。我们认为这里有共享库的空间。与 SSWG 接受的日志记录、指标和追踪解决方案深度集成的内容尤为重要。如果您对 OpenAPI 感兴趣,请考虑参与进来。
Linux 发行版
Swift 目前为 Ubuntu 提供预构建的工具链。还有许多其他发行版,我们很乐意看到它们得到官方支持。目前,向 Swift 添加新的 Linux 发行版的过程尚不明确。我们认为这可以改进。社区可以通过确定哪些 Linux 发行版很重要并贡献可靠的构建脚本来提供帮助。在一个理想的世界中,我们可以使整个系统自助服务。您对此感兴趣吗?如果是这样,请与我们联系。
部署指南
让您的应用程序准备好投入生产可能是一个令人生畏的过程。有些事情很简单,例如记住使用 -c release
,还有更难的事情,例如编写 水平可扩展 的代码。一旦您的应用程序投入生产,您将如何处理泄漏和崩溃等问题?
我们可以做很多事情来简化此过程:代码模板、操作指南、最佳实践信息等等。如果这看起来让您感兴趣,我们很乐意听取您的想法。
展示采用情况
“服务器端 Swift 是否已准备好投入生产?”
是的!
服务器端 Swift 正在被各种规模的公司广泛应用于生产环境。我们需要更好地向人们展示这一点。我们如何收集这些信息?我们如何放大成功案例?如果您有任何想法,请告诉我们。
以及更多...
服务器端 Swift 正在快速发展,SSWG 希望做的事情远不止此列表中的内容。如果您有未在此处列出的绝妙想法,请在 Swift 论坛 上告知我们。如果您有具体的问题或意见,可以在 Swift 论坛上找到此博客文章的 匹配帖子!