本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
数字
ruststream-sqs-sns 的基准测试数字测量什么,以及不能从中得出什么结论。
与裸客户端的对照
一行中的三个循环可以相互比较,因为它们在同一个进程中交替运行,连接同一个端点。一行不能与另一个 Broker crate 公布的行相比较:不同的传输在每条消息上做的工作不同。
每条消息都要付出一次自己的 HTTP 往返,即它的 ack 背后的 DeleteMessage。这些往返决定了两行的速度。在 受 Broker 限制 的行里,它们至少占了一次投递耗时的一半。这时,crate 和运行时的工作发生在裸客户端同样要付出的等待之中,循环之间的差值只是这部分工作的下界,而不是对它的测量。
代码的开销
指令数包含运行时、本 crate,以及 AWS SDK 在服务线程上的工作:构建并签名每个请求、HTTP 交换,以及解析每个应答。一次投递分摊一次 ReceiveMessage,自己付出一次 DeleteMessage,应答再加一次 SendMessage。因此,每个数字的大部分是 SDK 的工作,而不是本 crate 的工作,这些数字也不能与客户端在自己线程上工作的 Broker 的数字相比较。同样的计数在缓存未命中时耗时更多,所以计数不等于时间。
每个数字都是稳态,即 1000 次投递与 2000 次投递两次运行之差。加载 AWS 配置、解析队列、读取它的可见性超时,以及背后最初的那些内存分配,都属于冷启动,只付出一次。
它们不意味着什么
测试环境是 LocalStack,一个 SQS 与 SNS 的模拟器,而不是托管服务。它在回环接口上用明文 HTTP 应答,省去了 TLS 握手、凭证刷新和区域的延迟。对照仍然有效,因为三个循环连接的是同一个模拟器。吞吐量则不能照搬:区域中的队列在另一个时间尺度上应答。
三个循环都请求 20 秒的等待。在有积压的队列上,等待永远不会到期,因为接收一有消息就返回。等待只决定空队列的开销。
一行是一个消费者以较小的正文读取一个队列。它测量的是一次投递在本 crate 内部的开销,而不是 SQS 能承载多少。FIFO 行把消息分散到 64 个消息组上,因此每次接收总能找到一个没有被扣住的组。
这些数字是一台机器在某一天的快照,构建信息记录在旁边。它们在一台专供运行的机器上手动重新测量:它们显示的差异小于共享机器上的噪声。