想象一下有水流过的管道。 水流过管道的速度可能会有所不同,即有时它流得很快,有时它流得很慢。 此概念类似于系统设计中的延迟。 延迟决定了数据从系统一端传输到另一端的速度。
延迟是衡量客户端和服务器之间数据传输速度的指标。 它与系统的性能直接相关:更低的延迟意味着更好的性能。
每当发出请求时,浏览器(客户端)都会向服务器发送信号。 服务器处理请求,检索信息,并将其发送回客户端。 因此,延迟是客户端启动请求和服务器将结果返回给客户端之间的时间间隔,即客户端与服务器之间的往返时间。
我们的最终目标是毫不拖延地开发一个系统,但各种瓶颈阻止了我们开发这样一个理想的系统。 核心思想很简单:我们可以尝试将其最小化。 系统延迟越低,处理请求所需的时间就越少。
延迟只不过是客户端在发起请求后必须等待多长时间才能收到结果的估计值。 让我们举个例子来看看它是如何工作的。
假设您正在与电子商务互动,您喜欢某样东西,并将其添加到购物车中。 现在,当您按下“添加到购物车”按钮时,将发生以下事件:
按下“添加到购物车”按钮后,延迟时钟开始滴答作响,浏览器向服务器发起请求。
服务器确认请求并对其进行处理。
服务器响应请求,响应到达您的浏览器,并将产品添加到您的购物车中。
您可以在第一步启动秒表,在最后一步停止秒表。 这种时间差称为延迟。
网络中的延迟取决于各种参数。 导致延迟的主要因素之一是出站呼叫。 在前面添加购物车 习 的示例中,当您单击浏览器上的按钮时,请求将发送到后端的服务器,该服务器再次在内部调用多个服务进行计算(并行或顺序),然后等待响应。 所有这些都会增加延迟。
延迟主要由以下因素引起:
传输介质传输介质是起点和终点之间的物理路径。 因此,系统延迟取决于用于传输请求的媒体类型。 广域网和光缆等传输介质应用广泛,但各有其局限性。
传播:它是指数据包从一个源传输到另一个源所需的时间。 因此,系统延迟很大程度上取决于通信节点之间的距离。 节点距离越远,延迟越大。
路由器路由器是通信中的重要组件,需要一些时间来分析数据包的标头信息。 因此,延迟取决于路由器处理请求的效率。 路由器到路由器跃点会增加系统延迟。
存储延迟:系统延迟还取决于所使用的存储系统的类型,因为处理和返回数据可能需要一些时间。 因此,访问存储的数据会增加系统的延迟。
有许多方法可以量化延迟。 三种最常见的方法是:
ping:Ping 是用于测量延迟的最常用实用程序。 它将数据包发送到某个地址并查看响应速度。 它测量数据从源传输到目标并返回源所需的时间。 ping 速度越快,连接越敏感。
traceroute:TraceRoute 是另一个用于测试延迟的实用程序。 它还使用数据包来计算路由到目标时每个跃点所花费的时间。
mtr:MTR 是 ping 和 traceroute 的组合。 MTR 提供网络中数据包从一端传输到另一端所需的每个跃点的报告列表。 该报告通常包含丢失百分比、平均延迟等详细信息。
延迟限制了系统的性能,因此需要对其进行优化。 我们可以通过以下方式减少延迟:
http/2:我们可以通过使用 HTTP 2 来减少延迟。 它允许并行传输,并最大限度地减少从发送者到接收者的往返。
更少的外部 HTTP 请求由于第三方服务,延迟增加。 通过减少外部 HTTP 请求的数量,可以优化系统延迟,因为第三方服务可能会影响应用程序的速度。
cdn:CDN 将资源存储在世界各地的多个位置,并减少请求和响应传输时间。 因此,靠近客户端的缓存资源可用于获取请求,而不是返回到源服务器。
浏览器缓存浏览器缓存还可以通过在本地缓存特定资源来减少对服务器发出的请求数,从而帮助减少延迟。
磁盘 i o:我们可以使用直写缓存或内存数据库,或者在可能的情况下合并写入,或者使用快速存储系统而不是频繁写入磁盘,例如 SSD。
您还可以通过在存储层、数据建模、出站呼叫扇出等方面做出更明智的选择来优化延迟。 以下是在应用程序级别优化延迟的一些方法:
低效的算法是最明显的延迟。 有必要避免不必要的循环或昂贵的嵌套操作。
使用避免锁定的设计模式,因为多线程锁会引入延迟。
使用异步编程模型可以更好地利用硬件资源,因为阻塞操作可能会导致等待时间过长。
延迟是一个与每个系统的设计相关的概念。 人们永远无法构建一个完全无延迟的系统,但它可以很容易地进行优化。 借助现代硬件和计算效率高的机器,延迟不再是系统的瓶颈。
优质作者名单