乐闻世界logo
搜索文章和话题

服务端面试题手册

MQTT 5.0 相比 MQTT 3.1.1 有哪些新特性?

MQTT 5.0 版本在 3.1.1 版本的基础上进行了重大改进,引入了许多新特性,显著提升了协议的功能性和灵活性。MQTT 5.0 主要新特性1. 属性(Properties)定义:在控制报文中携带键值对形式的元数据作用:扩展协议功能,无需修改协议格式应用场景:消息过期时间请求/响应模式订阅标识符内容类型用户属性(自定义元数据)2. 请求/响应模式(Request/Response Pattern)相关属性:Response Topic:指定响应消息的主题Correlation Data:关联请求和响应工作流程:客户端发送请求消息,包含 Response Topic 和 Correlation Data服务端处理请求服务端发送响应消息到 Response Topic,包含相同的 Correlation Data客户端根据 Correlation Data 匹配响应优势:简化应用层实现减少自定义协议开发提高互操作性3. 会话和消息过期会话过期:Session Expiry Interval:指定会话过期时间(秒)0 表示立即过期,4294967295 表示永不过期替代了 Clean Session 标志消息过期:Message Expiry Interval:指定消息过期时间(秒)Broker 不再分发过期消息减少无效消息传输优势:更灵活的会话管理自动清理过期资源减少存储压力4. 共享订阅(Shared Subscriptions)语法:$share/<group>/<topic>示例:$share/consumer1/sensor/data工作原理:多个订阅者组成一个共享组每条消息只分发给组中的一个订阅者实现负载均衡优势:提高消息处理能力实现消费者扩展避免消息重复处理应用场景:高吞吐量数据处理分布式任务处理微服务架构5. 订阅标识符(Subscription Identifier)定义:为订阅分配一个数字标识符特点:每个客户端可以有多个订阅标识符标识符范围:1-268435455在 PUBLISH 报文中返回匹配的订阅标识符应用场景:区分不同的订阅实现复杂的消息路由简化应用逻辑6. 主题别名(Topic Alias)定义:用数字代替完整的主题字符串机制:客户端和 Broker 独立维护别名映射别名范围:1-65535在 CONNECT 或 PUBLISH 中声明优势:减少网络传输量降低带宽消耗提高传输效率应用场景:长主题名称高频消息传输带宽受限环境7. 流量控制(Flow Control)接收最大值(Receive Maximum):客户端指定未确认 PUBLISH 报文的最大数量防止消息积压默认值:65535最大数据包大小(Maximum Packet Size):限制最大数据包大小防止大包攻击默认值:无限制优势:防止资源耗尽提高系统稳定性适应不同网络条件8. 原因码(Reason Codes)定义:更详细的错误和状态信息范围:0x00-0xFF分类:成功码(0x00-0x00)错误码(0x80-0xFF)优势:更精确的错误诊断更好的问题排查改进的互操作性9. 认证增强(Enhanced Authentication)认证方法(Authentication Method):指定认证方法(如 SCRAM)支持多种认证协议认证数据(Authentication Data):携带认证相关的数据支持多轮认证重新认证(Re-authentication):在连接期间重新认证无需断开连接优势:更灵活的认证机制支持现代认证协议提高安全性10. 服务器断开(Server Disconnect)功能:服务器主动断开客户端连接原因码:说明断开原因服务器引用:提供服务器信息应用场景:服务器维护强制下线负载均衡MQTT 3.1.1 vs MQTT 5.0 对比| 特性 | MQTT 3.1.1 | MQTT 5.0 ||-----|-----------|----------|| 属性支持 | 无 | 支持 || 请求/响应 | 自定义实现 | 原生支持 || 会话管理 | Clean Session | Session Expiry || 共享订阅 | Broker 扩展 | 标准特性 || 主题别名 | 无 | 支持 || 流量控制 | 无 | 支持 || 错误码 | 简单 | 详细 || 认证机制 | 基础 | 增强 || 消息过期 | 无 | 支持 || 服务器断开 | 无 | 支持 |迁移建议向后兼容性MQTT 5.0 客户端可以连接到 MQTT 3.1.1 BrokerMQTT 3.1.1 客户端可以连接到 MQTT 5.0 Broker新特性仅在双方都支持时生效迁移策略评估需求:确定是否需要新特性逐步迁移:先升级 Broker,再升级客户端测试验证:充分测试兼容性和功能监控观察:监控迁移后的系统表现应用场景适合使用 MQTT 5.0 的场景需要请求/响应模式的应用高并发、高吞吐量的物联网平台需要精确错误诊断的系统需要灵活认证机制的企业应用带宽受限的物联网设备可以继续使用 MQTT 3.1.1 的场景简单的传感器数据采集低频率的消息传输已有稳定运行的系统资源极度受限的设备MQTT 5.0 的引入显著提升了协议的功能性和灵活性,为更复杂的物联网应用提供了更好的支持。
阅读 0·2月21日 15:45

MQTT 的遗嘱消息(Last Will)是什么?如何使用?

MQTT 的遗嘱消息(Last Will and Testament,LWT)是一种重要的机制,用于在客户端异常断开连接时通知其他客户端。遗嘱消息的概念定义遗嘱消息是客户端在连接时预先设置的一条消息,当客户端异常断开连接时,Broker 会自动将这条消息发布到指定的主题。作用异常检测:通知其他客户端某个设备已离线状态通知:发布设备离线状态故障告警:触发告警机制资源清理:通知系统清理相关资源遗嘱消息的工作原理设置遗嘱消息客户端在发送 CONNECT 报文时设置遗嘱消息参数:CONNECT 报文参数:- Will Flag: true(启用遗嘱消息)- Will Topic: 遗嘱消息的主题- Will Message: 遗嘱消息的内容- Will QoS: 遗嘱消息的 QoS 级别- Will Retain: 是否保留遗嘱消息触发条件遗嘱消息在以下情况下会被触发:客户端异常断开网络故障设备断电程序崩溃连接超时Broker 检测到连接断开Keep Alive 超时TCP 连接断开心跳检测失败不触发的情况以下情况不会触发遗嘱消息:正常断开连接客户端发送 DISCONNECT 报文正常关闭连接连接未建立CONNECT 报文发送失败连接被拒绝遗嘱消息的参数Will Flag(遗嘱标志)作用:标识是否启用遗嘱消息值:true/false必需:启用遗嘱消息时必须为 trueWill Topic(遗嘱主题)作用:指定遗嘱消息发布的主题格式:标准的 MQTT 主题字符串示例:device/123/status要求:必须设置Will Message(遗嘱消息内容)作用:遗嘱消息的实际内容格式:二进制数据示例:offline 或 {"status":"offline","timestamp":1234567890}要求:必须设置Will QoS(遗嘱 QoS)作用:指定遗嘱消息的 QoS 级别值:0/1/2默认值:0选择建议:QoS 0:一般状态通知QoS 1:重要状态通知QoS 2:关键状态通知Will Retain(遗嘱保留)作用:指定是否保留遗嘱消息值:true/false默认值:false影响:true:新订阅者会收到遗嘱消息false:只有在线订阅者收到遗嘱消息使用场景1. 设备在线状态监控设备上线:- 发布 "online" 到 device/123/status设备离线(正常):- 发布 "offline" 到 device/123/status设备离线(异常):- 遗嘱消息 "offline" 发布到 device/123/status2. 故障告警遗嘱主题:alert/device/123遗嘱消息:{"type":"offline","device":"123","timestamp":1234567890}监控系统订阅 alert/device/123收到遗嘱消息后触发告警3. 资源清理遗嘱主题:cleanup/device/123遗嘱消息:{"device":"123","action":"cleanup"}清理服务订阅 cleanup/device/123收到遗嘱消息后清理相关资源4. 负载均衡遗嘱主题:worker/offline遗嘱消息:{"worker":"worker1"}负载均衡器订阅 worker/offline收到遗嘱消息后重新分配任务代码示例Python (paho-mqtt)import paho.mqtt.client as mqttimport jsonimport timedef on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") client.subscribe("device/+/status")def on_message(client, userdata, msg): print(f"Received: {msg.topic} - {msg.payload.decode()}")client = mqtt.Client()# 设置遗嘱消息will_topic = "device/123/status"will_message = json.dumps({"status": "offline", "timestamp": int(time.time())})client.will_set(will_topic, will_message, qos=1, retain=True)client.on_connect = on_connectclient.on_message = on_messageclient.connect("broker.example.com", 1883, 60)# 发布在线状态client.publish("device/123/status", json.dumps({"status": "online"}))client.loop_forever()JavaScript (MQTT.js)const mqtt = require('mqtt');const client = mqtt.connect('mqtt://broker.example.com', { will: { topic: 'device/123/status', payload: JSON.stringify({ status: 'offline', timestamp: Date.now() }), qos: 1, retain: true }});client.on('connect', () => { console.log('Connected'); // 发布在线状态 client.publish('device/123/status', JSON.stringify({ status: 'online' })); // 订阅状态主题 client.subscribe('device/+/status');});client.on('message', (topic, message) => { console.log(`Received: ${topic} - ${message.toString()}`);});最佳实践1. 遗嘱消息设计简洁明了:消息内容简洁,易于解析包含时间戳:便于追踪离线时间设备标识:明确标识是哪个设备状态信息:包含详细的离线原因2. 主题命名规范推荐格式:- device/{device_id}/status- alert/{device_id}/offline- cleanup/{device_id}避免使用:- 通配符作为遗嘱主题- 过于复杂的主题结构3. QoS 选择一般设备:QoS 0重要设备:QoS 1关键设备:QoS 24. Retain 设置状态监控:建议设置为 true告警通知:建议设置为 false资源清理:根据需求设置5. 遗嘱消息处理及时处理:收到遗嘱消息后及时处理避免重复:防止重复处理同一设备的离线事件记录日志:记录离线事件,便于问题排查注意事项正常断开:正常断开连接时,应该先发送 DISCONNECT 报文,避免触发遗嘱消息遗嘱消息更新:重新连接时可以更新遗嘱消息内容Broker 限制:某些 Broker 可能对遗嘱消息有大小限制网络延迟:网络延迟可能导致遗嘱消息延迟发送多设备场景:在多设备场景中,需要明确区分不同设备的遗嘱消息遗嘱消息的局限性无法区分离线原因:遗嘱消息不包含具体的离线原因可能误报:网络抖动可能导致误报处理延迟:从离线到发送遗嘱消息可能有延迟依赖 Broker:完全依赖 Broker 的可靠性MQTT 遗嘱消息是物联网应用中非常重要的机制,合理使用可以有效监控设备状态,提高系统的可靠性和可维护性。
阅读 0·2月21日 15:45

MQTT 的发布/订阅模式是如何工作的?

MQTT 的发布/订阅模式是一种消息传递架构,它解耦了消息的生产者和消费者,实现了灵活的一对多通信。核心概念1. 主题(Topic)定义:主题是消息的路由地址,采用层级结构格式:使用斜杠(/)分隔的字符串,如 home/livingroom/temperature特点:层级清晰,便于组织和管理支持通配符订阅大小写敏感长度限制:最多 65535 字节2. 发布者(Publisher)角色:消息的生产者功能:向特定主题发送消息特点:不需要知道订阅者的存在可以同时向多个主题发布消息发布后立即返回,不等待订阅者响应3. 订阅者(Subscriber)角色:消息的消费者功能:订阅感兴趣的主题,接收相关消息特点:可以订阅多个主题可以使用通配符订阅一类主题只接收订阅后发布的消息4. Broker(代理服务器)角色:消息的中转站和路由器功能:接收发布者发送的消息根据订阅关系将消息分发给订阅者管理客户端连接和会话处理消息的 QoS 保证工作流程连接建立:客户端(发布者/订阅者)连接到 Broker订阅主题:订阅者向 Broker 发送订阅请求发布消息:发布者向特定主题发送消息消息路由:Broker 接收消息,查找订阅该主题的客户端消息分发:Broker 将消息转发给所有订阅者消息接收:订阅者接收并处理消息通配符订阅单级通配符(+)匹配单个层级示例:home/+/temperature 匹配 home/livingroom/temperature,但不匹配 home/livingroom/kitchen/temperature多级通配符(#)匹配多个层级,必须放在主题末尾示例:home/# 匹配 home/ 下的所有主题优势解耦性:发布者和订阅者完全解耦,互不依赖灵活性:支持一对多、多对一、多对多的通信模式可扩展性:易于添加新的发布者和订阅者异步性:发布者不需要等待订阅者响应高效性:Broker 负责消息路由,减少网络开销与点对点模式的对比| 特性 | 发布/订阅模式 | 点对点模式 ||-----|-------------|-----------|| 耦合度 | 低 | 高 || 消息接收者 | 多个 | 一个 || 消息持久化 | 可选 | 通常需要 || 复杂度 | 中等 | 简单 || 适用场景 | 广播、通知 | 直接通信 |MQTT 的发布/订阅模式使其成为物联网、实时通信和消息推送等场景的理想选择。
阅读 0·2月21日 15:45

MQTT 的保留消息(Retained Messages)是什么?如何使用?

MQTT 的保留消息(Retained Messages)是一种特殊的消息机制,允许 Broker 保存最新消息,供新订阅者接收。保留消息的概念定义保留消息是 Broker 持久化存储的消息,当有新的客户端订阅该主题时,Broker 会立即将保留消息发送给该客户端。作用状态同步:新订阅者可以立即获取最新状态初始化数据:为新连接的客户端提供初始数据状态恢复:帮助客户端快速恢复到最新状态减少请求:避免客户端主动请求最新状态保留消息的工作原理设置保留消息发布消息时设置 Retain 标志:PUBLISH 报文参数:- Topic: 主题名称- Payload: 消息内容- QoS: QoS 级别- Retain: true(设置为保留消息)保留消息的存储存储位置:Broker 内存或持久化存储存储数量:每个主题只保留一条最新消息存储覆盖:新发布的保留消息会覆盖之前的保留消息保留消息的发送当客户端订阅主题时:客户端发送 SUBSCRIBE 报文Broker 检查该主题是否有保留消息如果有,立即发送保留消息给客户端然后发送后续的新消息保留消息的特性1. 每个主题一条规则:每个主题只保留一条最新的保留消息覆盖机制:新发布的保留消息会替换之前的清除机制:发布空消息(Payload 为空)可以清除保留消息2. QoS 级别继承性:保留消息的 QoS 级别由发布时决定订阅限制:订阅者接收的 QoS 级别受限于订阅时的 QoS 设置QoS 规则:实际 QoS = min(发布 QoS, 订阅 QoS)3. 持久化内存存储:默认存储在内存中持久化存储:可配置持久化到磁盘Broker 重启:持久化的保留消息在 Broker 重启后仍然存在4. 消息顺序发送顺序:保留消息在普通消息之前发送订阅时机:只在订阅时发送一次后续消息:不重复发送保留消息使用场景1. 设备状态同步场景:温度传感器保留主题:sensor/123/temperature保留消息:{"value": 25.5, "unit": "C", "timestamp": 1234567890}新订阅者订阅 sensor/123/temperature立即收到最新温度值2. 配置信息发布场景:设备配置保留主题:config/device/123保留消息:{"mode": "auto", "interval": 60}新设备上线订阅配置主题立即获取最新配置3. 系统状态广播场景:系统状态保留主题:system/status保留消息:{"status": "running", "version": "1.0.0"}新客户端订阅系统状态立即获取当前系统状态4. 开关状态场景:智能开关保留主题:switch/123/state保留消息:{"state": "on"}新订阅者立即获取开关状态代码示例Python (paho-mqtt)import paho.mqtt.client as mqttimport jsonimport timedef on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") # 订阅主题 client.subscribe("sensor/+/temperature")def on_message(client, userdata, msg): print(f"Received: {msg.topic} - {msg.payload.decode()}") print(f"Retained: {msg.retain}")# 发布保留消息client = mqtt.Client()client.connect("broker.example.com", 1883, 60)# 发布保留消息(retain=True)message = {"value": 25.5, "unit": "C", "timestamp": int(time.time())}client.publish("sensor/123/temperature", json.dumps(message), retain=True)# 清除保留消息(发布空消息)# client.publish("sensor/123/temperature", "", retain=True)client.disconnect()# 订阅者subscriber = mqtt.Client()subscriber.on_connect = on_connectsubscriber.on_message = on_messagesubscriber.connect("broker.example.com", 1883, 60)subscriber.loop_forever()JavaScript (MQTT.js)const mqtt = require('mqtt');// 发布保留消息const publisher = mqtt.connect('mqtt://broker.example.com');publisher.on('connect', () => { console.log('Publisher connected'); // 发布保留消息(retain: true) const message = JSON.stringify({ value: 25.5, unit: 'C', timestamp: Date.now() }); publisher.publish('sensor/123/temperature', message, { retain: true }); // 清除保留消息(发布空消息) // publisher.publish('sensor/123/temperature', '', { retain: true }); publisher.end();});// 订阅者const subscriber = mqtt.connect('mqtt://broker.example.com');subscriber.on('connect', () => { console.log('Subscriber connected'); subscriber.subscribe('sensor/+/temperature');});subscriber.on('message', (topic, message) => { console.log(`Received: ${topic} - ${message.toString()}`); console.log(`Retained: ${message.retain}`);});最佳实践1. 保留消息设计状态信息:保留消息应该表示当前状态简洁明了:消息内容简洁,易于解析包含时间戳:便于判断消息的新旧程度版本控制:可以包含版本信息2. 主题命名推荐格式:- sensor/{device_id}/temperature- config/{device_id}- status/{system_id}避免使用:- 通配符主题(不能发布到通配符主题)- 过于复杂的主题结构3. 消息大小限制大小:保留消息不宜过大建议大小:通常小于 1KBBroker 限制:注意 Broker 对消息大小的限制4. QoS 选择一般状态:QoS 0重要状态:QoS 1关键状态:QoS 25. 清除机制主动清除:发布空消息清除保留消息定期清理:定期检查和清理过期的保留消息生命周期管理:为保留消息设置合理的生命周期注意事项内存占用:保留消息会占用 Broker 内存,大量保留消息可能影响性能持久化配置:如果需要保留消息在 Broker 重启后仍然存在,需要配置持久化消息更新:频繁更新保留消息会增加 Broker 负担订阅时机:保留消息只在订阅时发送,不会重复发送QoS 限制:订阅者接收的 QoS 级别受限于订阅时的 QoS 设置空消息清除:发布空消息(Payload 为空)可以清除保留消息保留消息 vs 遗嘱消息| 特性 | 保留消息 | 遗嘱消息 ||-----|---------|---------|| 触发时机 | 订阅时 | 异常断开时 || 消息来源 | 发布者设置 | 客户端设置 || 存储位置 | Broker | Broker || 发送对象 | 新订阅者 | 订阅该主题的客户端 || 消息数量 | 每主题一条 | 每客户端一条 || 清除方式 | 发布空消息 | 正常断开或重新连接 |保留消息的局限性每主题一条:每个主题只能保留一条消息,无法保存历史消息内存占用:大量保留消息会占用较多内存实时性:保留消息可能不是最新的(取决于发布频率)无历史记录:无法获取历史状态变化依赖 Broker:完全依赖 Broker 的可靠性MQTT 保留消息是物联网应用中非常重要的机制,合理使用可以有效实现状态同步和初始化,提高用户体验和系统可靠性。
阅读 0·2月21日 15:44

Ollama 与其他 LLM 部署方案(如 vLLM、LM Studio)相比有什么优缺点?

Ollama 与其他 LLM 部署方案相比,各有优劣:1. Ollama vs. vLLM:Ollama 优势:安装简单,一行命令即可部署跨平台支持(Linux/macOS/Windows)内置模型管理和 API 服务适合个人开发和小型应用vLLM 优势:更高的推理性能和吞吐量支持 PagedAttention 技术更适合大规模生产环境支持更多模型格式2. Ollama vs. LM Studio:Ollama 优势:命令行和 API 友好更适合服务器部署开源且免费更好的自动化集成LM Studio 优势:图形化界面,用户体验好内置模型市场适合桌面用户可视化配置选项3. Ollama vs. OpenAI API:Ollama 优势:完全本地运行,数据隐私保护无 API 调用费用可自定义模型无网络依赖OpenAI API 优势:模型性能更强(GPT-4 等)无需本地硬件持续更新和优化更好的多语言支持4. Ollama vs. LocalAI:Ollama 优势:更轻量级更简单的配置更好的性能优化活跃的社区支持LocalAI 优势:OpenAI API 兼容性更好支持更多模型类型更灵活的配置选项支持多模型并行5. Ollama vs. Text Generation WebUI:Ollama 优势:更适合 API 集成更简单的部署更好的性能命令行友好Text Generation WebUI 优势:功能丰富的 Web 界面支持更多高级功能可视化参数调整更好的交互体验选择建议:个人开发/学习:Ollama 或 LM Studio生产环境 API 服务:Ollama 或 vLLM需要 OpenAI 兼容性:LocalAI桌面用户:LM Studio需要最高性能:vLLM需要图形界面:LM Studio 或 Text Generation WebUI
阅读 0·2月21日 15:43

Gin 框架的性能优化技巧和最佳实践有哪些?

Gin 框架的性能优化技巧和最佳实践如下:1. 路由优化1.1 路由分组// 合理使用路由组,减少重复前缀api := r.Group("/api/v1"){ users := api.Group("/users") { users.GET("", getUsers) users.GET("/:id", getUser) users.POST("", createUser) }}1.2 路由顺序将高频路由放在前面静态路由优先于动态路由避免路由冲突1.3 减少路由嵌套避免过深的路由层级合理规划路由结构2. 中间件优化2.1 中间件选择// 只在需要的路由上添加中间件r.GET("/public/data", getData) // 不需要认证r.GET("/private/data", authMiddleware(), getPrivateData) // 需要认证2.2 中间件逻辑优化保持中间件逻辑轻量避免在中间件中进行阻塞操作使用缓存减少重复计算2.3 中间件顺序将性能影响小的中间件放在前面将可能中断请求的中间件放在前面3. 数据绑定优化3.1 使用明确的绑定方法// 推荐:使用明确的绑定方法c.ShouldBindJSON(&obj)// 不推荐:使用通用绑定方法c.ShouldBind(&obj)3.2 避免过度验证只验证必要的字段使用合理的验证规则4. 数据库优化4.1 连接池配置db.SetMaxOpenConns(100)db.SetMaxIdleConns(10)db.SetConnMaxLifetime(time.Hour)4.2 查询优化使用索引避免 N+1 查询合理使用缓存5. 响应优化5.1 启用压缩import "github.com/gin-contrib/gzip"r.Use(gzip.Gzip(gzip.DefaultCompression))5.2 流式响应// 对于大数据量,使用流式响应c.Stream(func(w io.Writer) bool { // 写入数据 w.Write(data) return true // 继续写入})5.3 合理设置缓存头c.Header("Cache-Control", "public, max-age=3600")6. 并发优化6.1 使用 goroutine 池// 使用 worker pool 处理并发任务type WorkerPool struct { tasks chan func()}func (p *WorkerPool) Submit(task func()) { p.tasks <- task}6.2 避免阻塞操作将阻塞操作放到 goroutine 中使用 context 控制超时7. 内存优化7.1 对象复用// 使用 sync.Pool 复用对象var bufferPool = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) },}7.2 避免内存泄漏及时释放资源避免在 Context 中存储大量数据使用 defer 确保资源释放8. 日志优化8.1 异步日志// 使用异步日志记录logger := log.New(os.Stdout, "", log.LstdFlags)go func() { for entry := range logChannel { logger.Println(entry) }}()8.2 合理的日志级别生产环境使用 INFO 或 WARN 级别开发环境使用 DEBUG 级别9. 监控和性能分析9.1 使用 pprofimport _ "net/http/pprof"go func() { log.Println(http.ListenAndServe("localhost:6060", nil))}()9.2 添加性能指标// 使用 Prometheus 等工具收集指标import "github.com/prometheus/client_golang/prometheus"var requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "HTTP request duration in seconds", }, []string{"method", "path"},)10. 最佳实践总结合理使用路由组和中间件启用 gzip 压缩配置数据库连接池使用缓存减少重复计算避免阻塞操作使用对象池减少内存分配异步日志记录添加性能监控定期进行性能测试使用 pprof 分析性能瓶颈通过以上优化技巧,可以显著提升 Gin 应用的性能和稳定性。
阅读 0·2月21日 15:43

Prometheus 的 Recording Rules 和 Alerting Rules 有什么区别?

Prometheus Recording Rules 和 Alerting Rules 的区别和使用:Recording Rules(记录规则):预先计算并存储常用的查询结果提高查询性能,减少计算开销不会触发告警配置示例:groups: - name: api_recording_rules interval: 30s rules: - record: job:http_requests:rate5m expr: sum by (job) (rate(http_requests_total[5m])) - record: job:request_errors:rate5m expr: sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))使用场景:频繁查询的复杂表达式需要聚合多个指标的计算提高仪表盘加载速度减少实时查询压力Alerting Rules(告警规则):监控指标并触发告警支持告警分组、抑制、静默发送通知到 Alertmanager配置示例:groups: - name: api_alerting_rules rules: - alert: HighErrorRate expr: job:request_errors:rate5m / job:http_requests:rate5m > 0.05 for: 5m labels: severity: critical annotations: summary: "High error rate on {{ $labels.job }}" description: "Error rate is {{ $value | humanizePercentage }}"关键区别:| 特性 | Recording Rules | Alerting Rules ||------|----------------|----------------|| 目的 | 预计算查询结果 | 触发告警通知 || 存储 | 生成新的时间序列 | 不存储新序列 || 性能 | 提高查询性能 | 可能增加评估开销 || 使用 | 仪表盘、查询 | 监控、告警 |最佳实践:Recording Rules:使用有意义的命名规范合理设置评估间隔定期审查和清理无用规则使用 by 子句进行分组Alerting Rules:合理设置 for 参数避免误报使用分级告警(info、warning、critical)添加清晰的描述信息使用标签便于分组和路由规则管理:使用版本控制管理规则文件使用 promtool 检查规则语法测试规则后再部署监控规则评估性能验证规则:promtool check rules /path/to/rules.yml
阅读 0·2月21日 15:41