ReadMe.txt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1.  使用方法
  2. 默认行为(无需配置)
  3. # 直接运行,使用默认200ms延时
  4. ./your_program
  5. 日志输出:
  6. [WaitForBrokerRouting] Using default delay: 200ms (set MQTT_BROKER_ROUTING_DELAY_MS to customize)
  7. 自定义延时
  8. Linux/Unix
  9. # 设置为100ms(适用于高性能Broker)
  10. export MQTT_BROKER_ROUTING_DELAY_MS=100
  11. ./your_program
  12. # 设置为500ms(适用于嵌入式或低性能设备)
  13. export MQTT_BROKER_ROUTING_DELAY_MS=500
  14. ./your_program
  15. # 临时设置(仅当次运行)
  16. MQTT_BROKER_ROUTING_DELAY_MS=50 ./your_program
  17. Windows
  18. REM 设置为100ms
  19. set MQTT_BROKER_ROUTING_DELAY_MS=100
  20. your_program.exe
  21. REM 或在系统环境变量中永久设置
  22. 配置建议
  23. 根据场景选择延时
  24. | 场景 | 推荐值 | 说明 |
  25. |-----------|------------|-----------------|
  26. | 开发测试 | 50-100ms | 快速迭代,降低等待时间 |
  27. | 生产环境(高性能) | 100-150ms | 现代服务器+高性能Broker |
  28. | 生产环境(默认) | 200ms | 兼顾稳定性和性能 |
  29. | 嵌入式设备 | 300-500ms | 低性能设备或高负载 |
  30. | 极端高负载 | 500-1000ms | 系统资源紧张时 |
  31. 调优步骤
  32. 1. 初始测试:使用默认200ms,观察是否有消息丢失
  33. 2. 逐步减小:如果稳定,尝试150ms → 100ms → 50ms
  34. 3. 压力测试:在最小延时下进行快速重启、并发测试
  35. 4. 确定最优:找到不丢消息的最小延时值
  36. 验证方法
  37. # 1. 快速重启测试(验证稳定性)
  38. for i in {1..10}; do
  39. ./your_program &
  40. PID=$!
  41. sleep 2
  42. kill $PID
  43. sleep 1
  44. done
  45. # 2. 检查日志中是否有 "timeout" 或 "not received"
  46. grep -i "timeout\|not received" /path/to/logfile
  47. # 3. 如果有超时,增加延时;如果无超时,可尝试减小延时
  48. 技术原理
  49. 为什么需要这个延时?
  50. MQTT订阅的两个阶段:
  51. 1. 客户端 → Broker: SUBSCRIBE
  52. 2. Broker → 客户端: SUBACK ← WaitForSubscriptionComplete确认这一步
  53. 3. Broker内部更新路由表 ← WaitForBrokerRouting等待这一步
  54. 4. 订阅生效,可以接收消息 ✅
  55. 问题:步骤2和步骤3之间的时间间隔不确定,取决于:
  56. - Broker的实现(Mosquitto/EMQ/HiveMQ等)
  57. - 系统负载(CPU/内存/网络)
  58. - 订阅数量(单个vs批量)
  59. 为什么不能主动确认?
  60. MQTT协议限制:
  61. - SUBACK只表示"Broker收到SUBSCRIBE"
  62. - 协议没有"路由已生效"的确认机制
  63. - 无法通过发送测试消息验证(会被当作普通消息处理)
  64. 为什么设计成可配置?
  65. 不同环境差异巨大:
  66. - 云端高性能服务器:20-50ms即可
  67. - 嵌入式设备(如你的OK3588):100-200ms
  68. - 虚拟机或Docker:200-500ms
  69. 固定值无法适应所有场景,可配置提供了灵活性。
  70. 日志示例
  71. 默认配置
  72. [WaitForBrokerRouting] Using default delay: 200ms (set MQTT_BROKER_ROUTING_DELAY_MS to customize)
  73. [WaitForBrokerRouting] LogicClient_xxx - Waiting 200ms for Broker to process subscription routing
  74. 自定义配置
  75. [WaitForBrokerRouting] Using custom delay from environment: 100ms
  76. [WaitForBrokerRouting] LogicClient_xxx - Waiting 100ms for Broker to process subscription routing
  77. 故障排查
  78. 问题:仍然有消息丢失
  79. 可能原因:
  80. 1. 延时不够 → 增加MQTT_BROKER_ROUTING_DELAY_MS到300或500
  81. 2. Broker性能瓶颈 → 检查Broker日志和资源使用
  82. 3. 网络延迟 → 检查网络质量(ping、丢包率)
  83. 问题:启动太慢
  84. 解决方法:
  85. 1. 减小延时(如100ms)
  86. 2. 如果减小后丢消息,说明Broker性能不足
  87. 3. 优化Broker配置或升级硬件