1 分•作者: m_barsukou•3 个月前
大家好,
我一直以来都想在 Go 方面提升自己,但一直没有合适的展示机会。
我想 - 也许可以利用 Go 在 API 解决方案和工具方面的出色性能。
我特别想确认 Go 的 goroutine 能够很好地处理一些扇出操作,例如,接收请求、记录日志、发布事件,而不会导致明显的性能下降。
我在 AWS 方面有相当多的经验,尤其是在无服务器架构方面。基本上,除了 EventBridge 之外,没有其他调度选项,尽管它有一个不错的免费套餐。但如果你不在 AWS 基础设施内呢,因为基础设施本身可能很昂贵,尤其是在他们取消了“12 个月试用”之后。
所以,我认为类似 cron-as-a-service 的东西可能是一个好的起点。
我决定采用一个直接的堆栈:Go API 服务器、Postgres、Redis 作为作业队列和缓存,所有这些都运行在单个每月 5 欧元的 Hetzner VPS 上,位于 Caddy 之后。
我读到可以使用 Redis 作为队列。因此,也想尝试一下——通过 LPUSH/BRPOP 使用作业队列,并使用 5 分钟 TTL 的 API 密钥缓存,这可以减少每个经过身份验证的请求中对 Postgres 的调用次数。
为了验证性能表现,我从欧洲内部运行了一个基准测试——10,000 个请求,100 个并发,针对实时 API:
请求/秒:621
平均延迟:158 毫秒(网络主导——服务器位于 Hetzner 德国)
p99:442 毫秒
最快:84 毫秒
大部分延迟是跨欧洲的往返时间。实际的服务器处理时间——Go 处理程序 + 本地 Postgres 查询——花费的时间要少得多。但即便如此,这还是针对一个非常基本的 Hetzner VPS 实例。
很乐意收到任何反馈——尤其是在调度程序设计方面,以及工作池方法是否可以处理实际负载。