51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在360的服务中,如何设计监控指标,用于实时监控Web服务的性能,如QPS、错误率、响应时间,并说明如何通过这些指标发现潜在问题。

360Web服务端开发工程师难度:中等

答案

1) 【一句话结论】

在360分布式Web服务中,通过设计分层指标(业务层、服务层、系统层)并关联跨服务调用链,结合实时采集与根因分析(日志+追踪工具),构建性能监控闭环,实时发现潜在问题。

2) 【原理/概念讲解】

监控指标设计需遵循“分层覆盖、关联调用链、根因可追溯”原则:

  • 分层指标体系:
    • 业务层指标:如QPS(每秒成功请求数)、错误率(错误请求占比)、响应时间(P99分位值),覆盖吞吐量、稳定性和用户体验。
    • 服务层指标:如服务调用成功率(服务A调用服务B的成功率)、服务延迟(服务自身处理耗时),关联跨服务调用链。
    • 系统层指标:如CPU利用率、内存占用,支撑系统资源健康度监控。
  • 跨服务调用链指标关联:
    当服务A调用服务B时,A需记录对B的“调用次数”“调用成功率”;B需记录自身“响应时间”“错误率”。通过指标关联,可快速定位服务间的性能瓶颈(如A的调用成功率下降可能因B响应变慢)。
  • 根因分析流程:
    监控指标异常(如QPS下降)→ 定位异常服务(通过分层指标)→ 结合日志(ELK)分析业务逻辑错误(如数据库查询慢)→ 结合追踪工具(Jaeger)定位具体调用链(如某条调用链的延迟异常)。

3) 【对比与适用场景】

指标类型定义特性使用场景注意点
QPS(计数器)每秒成功请求数累积值,无过期吞吐量监控(如API流量)需区分业务模块(如不同API的QPS分开统计)
错误率(比率)错误请求数/总请求数累积比率,无过期稳定性监控(如错误类型占比)需区分错误类型(如500/404)
响应时间(直方图)请求处理耗时分布记录所有值,分位值(如P99)用户体验监控(如响应速度)需采样(避免全量记录影响性能)
跨服务调用成功率服务A调用服务B的成功率累积比率,无过期服务间调用链稳定性监控需关联调用方(A)和被调用方(B)
跨服务调用延迟服务A调用服务B的耗时记录分布,分位值(如P99)服务间调用链性能监控需采样(避免全量记录影响性能)

4) 【示例】

假设服务A(API Gateway)调用服务B(业务服务),伪代码展示跨服务调用链指标关联:

from prometheus_client import Counter, Histogram
import time

# 服务A(调用方)指标
A_TO_B_CALLS = Counter('service_a_to_b_calls_total', 'Total calls from service A to B')
A_TO_B_SUCCESS = Counter('service_a_to_b_success_total', 'Total successful calls from service A to B', labelnames=['service_b_name'])
A_TO_B_LATENCY = Histogram('service_a_to_b_latency_seconds', 'Latency of calls from service A to B')

# 服务B(被调用方)指标
SERVICE_B_RESPONSE_TIME = Histogram('service_b_response_time_seconds', 'Response time of service B')

def service_a_handle_request(request):
    start_time = time.time()
    # 调用服务B
    b_response = call_service_b(request)
    duration = time.time() - start_time
    # 记录服务A到B的指标
    A_TO_B_CALLS.inc()
    if b_response.status_code == 200:
        A_TO_B_SUCCESS.labels(service_b_name='service_b').inc()
        A_TO_B_LATENCY.observe(duration)
    else:
        # 记录错误
        A_TO_B_SUCCESS.labels(service_b_name='service_b').inc()
        raise Exception(f"Service B error: {b_response.status_code}")

def call_service_b(request):
    # 模拟调用服务B
    time.sleep(0.1)  # 模拟延迟
    return {"status_code": 200, "data": "success"}

# 示例调用
service_a_handle_request({'path': '/api/v1/data', 'method': 'GET'})

5) 【面试口播版答案】

面试官您好,在360的分布式Web服务中,我们通过设计分层指标并关联跨服务调用链来监控性能。首先,核心指标包括QPS(每秒成功请求数)、错误率(错误请求占比)、响应时间(P99分位值),这些指标覆盖吞吐量、稳定性和用户体验。同时,我们设计跨服务调用链指标,比如服务A调用服务B时,A记录对B的调用成功率,B记录自身响应时间,通过这些关联指标能快速定位服务间的性能瓶颈。当指标异常时,比如QPS下降或响应时间P99超过阈值,会触发告警。比如QPS下降可能意味着流量异常或后端资源不足,错误率上升可能表示业务逻辑错误,响应时间变长可能说明处理逻辑复杂。通过结合日志(ELK)和追踪工具(Jaeger),我们能进一步定位问题根源,比如通过错误率指标发现某个API的500错误率升高,结合响应时间分析,可能是因为数据库查询慢,进而排查数据库连接池问题。总结来说,我们通过分层指标、跨服务关联、实时采集和根因分析,构建了性能监控闭环,及时识别潜在问题。

6) 【追问清单】

  1. 如何设计跨服务调用链的指标关联?
    回答要点:通过服务间调用计数器(如A到B的调用次数)、成功率(A到B的成功率)、延迟(A到B的耗时)指标,实现调用链的指标关联。
  2. 根因分析时如何结合日志和追踪工具?
    回答要点:监控指标异常→ 定位服务→ 结合日志(ELK)分析业务逻辑错误→ 结合追踪工具(Jaeger)定位具体调用链,锁定问题根源。
  3. 监控系统如何保证自身可靠性?
    回答要点:采用监控采集器高可用(如Prometheus多实例部署)、数据存储冗余(如时序数据库多副本)、告警抑制规则(避免短时间重复告警)。
  4. 实时采集频率如何设置?
    回答要点:QPS、错误率等累积指标采集频率可低(如1分钟),响应时间等分布指标需高频(如1秒/5秒),避免数据延迟影响监控准确性。
  5. 如何避免监控指标对业务系统的影响?
    回答要点:采用采样(如1%请求采样)、异步写入(如Kafka+批处理)、轻量级采集器(如Prometheus pushgateway)。

7) 【常见坑/雷区】

  1. 未关联跨服务调用链,导致无法定位服务间性能瓶颈(如A的QPS下降因B响应慢,但未关联指标)。
  2. 根因分析仅依赖监控指标,未结合日志和追踪工具(如仅看响应时间变长,未排查数据库慢查询)。
  3. 监控系统自身故障导致数据丢失(如采集器宕机,导致指标缺失)。
  4. 实时采集频率设置不合理(如响应时间采样频率过低,导致P99分位值不准确)。
  5. 告警规则设置不合理(如阈值过低导致误报,或阈值过高导致漏报,如QPS下降20%未触发告警)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1