船舶越快,风险越来越少。获得优化的推出,为开发人员提供免费功能标志。 建立免费账户



当您想要实现的明确结果(例如提高转换率)和围绕具体方式的一些不确定性时,实验是一种学习工具。但有时你知道你需要改变什么,你只想能够衡量这种改变如何影响对你最重要的指标。实验也很好地为此工作,因为它提供了一种方法来验证和说明隐形变化的影响,否则无法注意到。

作为优化后端团队的工程师,我非常关心性能和延迟,因为应该在所有后端应用程序中。最近在做一些例行开发时,我发现了一个在许多请求上被执行的昂贵的数据库查询。 这是一个阻塞查询,这意味着应用程序必须在做其他任何事情之前等待它返回。 我发现了大多数时候通过缓存它在Web进程内部获取的数据来跳过查询的方法。

我相信我的缓存方法将比等待现有的查询更快。与此同时,将其作为实验部署似乎是重要的,因此我们可以准确地测量方法的差异,并为请求延迟事件添加更好的仪器,以支持未来的后端性能实验。

本实验

我用过A. 全栈 功能旗帜 要控制我的新代码,请在部署到每个环境后,设置远程配置的实验。当我能够为实际客户启用它之前测试更改时,这会导致部署风险。

 

def _has_cached_whitelist_feature():

  fullstack_client = fullstack_service.get_optly_object()

  request = request_context.get_request()

  if fullstack_client and request and 

request.registry.get('request_id'):

    # we will get significance faster if we activate on the unique Request ID

    # since it really only has to match for the duration of the request

    return fullstack_client.is_feature_enabled('cached_whitelist', request.registry.get('request_id'))

  return False

衡量成功

总的来说,我们希望看到每个请求的延迟减少。为了测量这一点,我添加了一个名为API_Response_time_ms的新事件,可以在接收请求和完成构建响应之间的后端服务器上测量时间的时间。

fullstack_client.track(
    'api_response_time_ms',
    self.request.registry.get('request_id'),
    attributes=attributes,
    event_tags=tags
)

新事件仅应用于API请求(不是页面加载),我们提出了一种有意识的决定,而不是衡量任何境内的时间作为其中的一部分,因为我们希望这种指标测量我们控制的部分,如果我们控制验证’在我们最后改善事情。这意味着我们发送的度量标准不是真正的端到端延迟度量,但它是“足够好”,为我们可以改变的部分提供基线。我还通过响应大小和路由添加了分段结果的属性,因为我不确定如何影响某些路由的延迟,而且我希望能够稍后探索数据。所以完整的仪器看起来像这样:

 

    start_time = self.request.registry.get('request_start_time')

    render_time_ms = math.floor((time.time() - start_time) * 1000)



    fullstack_client = fullstack_service.get_optly_object()

    content_length = int(self.response.headers.get('Content-Length', 0))



    if content_length > 1000 * 1000:

      response_size = '>1000kB'

    elif content_length > 500 * 1000:

      response_size = '500-1000kB'

    else:

      response_size = '0-500kB'


    route = request_context.get_route_string()


    attributes = {

      'route': route,  # Example: GET /api/v1/categories

      'response_size': response_size, # Example: 515kB

    }
    

    tags = {

      'value': render_time_ms,

    }


    fullstack_client.track(

      'api_response_time_ms',

      self.request.registry.get('request_id'),

      attributes=attributes,

      event_tags=tags

    )

结果

实验在持续约一个月后,我们平均地看到了40毫秒的改善,以获得API的响应时间延迟的平均案例。在下面的报告中,您可以看到我如何通过特定段过滤报告。在低于API的段响应时间提高了19.1%。


在进行复杂应用中的性能时,很少有一个大变化,你可以使一切都更快。通常需要增加随着时间的推移而建立的许多小增量变化来实现目标。这些变化可能有隐藏的权衡,并且并不总是清楚给定的变化会改善事情。分析和更好的仪器可以提供帮助,但探讨者往往不会在生产中运行,因此并不总是讲述整个故事。仪器通常只告诉您如何随着时间的推移改变了,但不一定导致这种变化和小变化有时会丢失噪声。实验可以确定地告诉你,你正在制作更好的事情。

 

由于实验结果,我们肯定地知道我们所做的改变是值得的。现在已经完全推出了这些变化,以使我们所有的客户都可以轻松地重用我们在这里的仪器工作来衡量我们希望将来所致的任何后端改变的延迟影响。在下一个改进!

 

为后端实验奠定基础 优化推出,我们的免费功能标记解决方案。

 
优化X.