实操笔记:为 NSQ 配置监控服务的心路历程
在 Go 语言实现的实时消息队列中, NSQ 的热度可以排第一。
NSQ 这款消息中间件简单易用,其设计目标是为在分布式环境下运行,为去中心化服务提供一个强大的基础架构。它具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。
NSQ 以分布式架构, 能够处理数亿级别的消息能力俘获了众多 gopher 的心。 我司也不例外,较多的业务都依赖 NSQ 做消息推送。今天我想和大家唠一唠关于 NSQ 监控的问题。
为什么要部署监控?
监控的重要性大家应该都清楚。没有监控的服务就是 “盲人骑瞎马,夜半临深池”。 这样讲可能有些抽象,我来给大家分享一个亲历的真实案例吧。
还记得那天,我正吃着火锅唱着歌,心里甭提有多美了,突然手机响了,打开一看,发现有客户反馈 CDN 刷新成功后未生效的问题。
火锅是不可能继续愉快地吃了,我抱起电脑一顿操作猛如虎,可惜结果不靠谱: 我查了系统调用链路上相关服务的日志,但是客户需要刷新的 URL 却没在日志中查到任务蛛丝马迹。那问题出在哪呢?

这块业务涉及到的服务调用示意图如上图所示。因为客户需求的紧急,我也把视线从沸腾的火锅收了回来,对着服务链路图沉思起来:
如图所示,用户成功提交了刷新请求说明请求流转到了 ohm 服务层,并且 ohm 成功处理了这个请求。
ohm 服务是刷新预热相关业务的 gateway,记录的是 ERROR 级的 log。没有在 ohm 的日志中查到 该请求的相关的记录,表明 ohm 向下游的 NSQ 推送消息的动作是成功的。
NSQ 对应的消费者是 purge 和 preheat 组件。purge 负责执行刷新动作,它记录的日志是 INFO 级,每一条刷新的 URL 它都会记录到日志中。 但是为什么在 purge 中却查不到相关日志?
刚才我就卡在了这里。问题的症结在于哪些情况下会在 purge 服务中查不到对应的日志。我大致列举了如下几种情况:
服务变更。purge 服务如果最近更新的代码如果有 Bug 可能导致了异常。但是我很快排除了这点,因为发布记录中,这个服务最近几个月都没人动过。
NSQ 坏了。这个更不靠谱,NSQ 是集群部署的,单点故障可以避免,全局故障的话恐怕公司群现在已经炸翻了天。
NSQ 没把消息发过来。但是 NSQ 是实时消息队列,消息投递应该很快,而且客户的刷新操作是在几个小时前了。
会不会因为 NSQ 消息堆积了,才没及时把消息投递过来呢?之前在测试环境没有发现此类问题,因为测试的量级与线上环境相比远远不够 ... 想到这,有点茅塞顿开的感觉。登录 NSQ 的控制台看对应的 Topic,果然问题出现在这,NSQ 上未投递的消息已经堆积了几亿条!
问题定位了,后续先通过内部工具先替客户解决问题就属于常规操作了,这里就不展开了。
监控部署落地
工单处理完了,我松了一口气,但是事情并没有告一段落。这个故障算是敲响了警钟:不能觉得 NSQ 性能不错就认为消息不会堆积了,必要的监控报警还是得安排上。
因为我司已经存在的基础设施,所以我决定使用 Prometheus 来监控 NSQ 服务。(Prometheus 的相关背景知识就不在这里科普了, 想看的请留言。)
Prometheus 通过 exporter 去采集第三方服务的数据,也就是说 NSQ 必须配置一个 exporter 才能接入 Prometheus。
Prometheus 的官方文档[https://prometheus.io/docs/instrumenting/exporters/]上对 exporter 有推荐,我顺着链接找到了官方推荐的 NSQ exporter[https://github.com/lovoo/nsq_exporter]。NSQ exporter 这个项目年久失修,最近的一次提交已经在 4 年前。

于是,我把这个项目拿到了本地,做了一些简单的改造, 使它支持 go mod。(PR 在这里[https://github.com/lovoo/nsq_exporter/pull/29])
NSQ exporter 部署完成后,接下来的问题是哪些指标需要监控?
参考官网[https://nsq.io/components/nsqadmin.html]我认为这些指标需要重点关注:
Depth:当前 NSQ 堆积的消息。NSQ 在内存中默认只保存 8000 消息,超过的消息会持久化到磁盘中。
Requeued:消息 requeue 的次数。
Timed Out:处理超时的消息。
Prometheus 建议配置 Grafana 更加直观地查看指标的变动情况,我配置大体的效果如下:

超时消息对应着 Timed Out 指标
堆积消息对应着 Depth 指标
负载是根据公式 sum(irate(NSQ_topic_message_count{}[5m])) 生成的。
探测服务是探测 NSQ exporter 服务是否正常。 因为该服务经常会因为 NSQ 压力过来导致 exporter 自身服务不可用。
自从 NSQ 配置监控服务后,我们能迅速感知 NSQ 当前状况,在报警发出后及时人工处理跟进。相关业务的稳定性有明显提升,此类问题引起的工单变少了;此外监控收集到的相关数据,让我们在接下来的性能优化工作中的思路更加清晰,方向更加明显。
实操笔记:为 NSQ 配置监控服务的心路历程的更多相关文章
- harbor安装实操笔记
纸上得来终觉浅,实操一遍吧! 把所有开发的后端服务先在打成镜像,传到私有镜像仓库: 然后在任意的远程机器拉取镜像,然后可采用docker或者docker-compose的方式运行,本节先按照docke ...
- SNMP学习笔记之Centos7配置SNMP服务
0x00 安装yum源安装SNMP软件包 1.yum源安装SNMP服务: yum -y install net-snmp net-snmp-utils 2.查看SNMP版本号: snmpd -v 0x ...
- 【实操笔记】MySQL主从同步功能实现
写在前边: 这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑 ...
- Hadoop1.2.1 全然分布式集群搭建实操笔记
前期准备工作: 1.改动Linux主机名:/etc/hostname ubuntu系统:vi /etc/hostname ...
- lightweight openpose 入门实操笔记(pytorch环境)
最近有个小项目要搞姿态识别,简单调研了一下2D的识别: 基本上是下面几种 (单人)single person 直接关键点回归 heatmap,感觉其实就是把一个点的标签弄成一个高斯分布 (多人)mul ...
- mysql数据库实操笔记20170418
一.建立商品分类表和价格表: 1.分类表`sankeq``sankeq`CREATE TABLE cs_mysql11(id INT(11) NOT NULL AUTO_INCREMENT,categ ...
- mysql数据库实操笔记20170419
一.insert与replace区别: insert:当表里有字段设置了主键或者唯一时,插入重复的唯一或主键字段值是不能执行的: replase:当表里有字段设置了主键或者唯一时,插入重复的唯一或主键 ...
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...
- 6.3 Pandora 实操 - 数据立方
简介 数据立方是适用于大规模实时数据(每天百亿条,10TB+ 级别数据)查询与分析的数据库系统,提供交互式的访问数据的能力,支持数据过滤.分组.聚合,实现亚秒级以内对亿行级别的数据表进行多维探索分析. ...
随机推荐
- 原创 Spring Boot 2.3 新特性分层JAR
背景 在我们实际生产容器化部署过程中,往往会遇到 Docker 镜像很大,部署发布很慢的情况 影响 docker 镜像大小的因素,主要有以下三个方面: 基础镜像的大小 .尽量选择 aphine 作为基 ...
- 字符串函数的实现(三)之strcat
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- Spring Boot demo系列(二):简单三层架构Web应用
2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...
- 诸葛亮的锦囊妙计竟然是大名鼎鼎的Java设计模式:策略模式
目录 应用场景 简单实现例子 改进代码 策略模式 定义 意图 主要解决问题 何时使用 优缺点 诸葛亮的锦囊妙计 应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减 ...
- Compound Words UVA - 10391
You are to find all the two-word compound words in a dictionary. A two-word compound word is a wor ...
- Java多线程详解——一篇文章搞懂Java多线程
目录 1. 基本概念 2. 线程的创建和启动 2.1. 多线程实现的原理 2.2.多线程的创建,方式一:继承于Thread类 2.3.多线程的创建,方式一:创建Thread匿名子类(也属于方法一) 2 ...
- Asp.Net Core&CAP实现分布式事务
需要注意的是标题中的CAP不是指的CAP理论,而是园区大神杨晓东实现的框架,CAP框架基于本地消息表用最终一致性实现分布式事务. 本地消息表 首先我们考虑一个场景,在将用户信息更改后,需要发送一条消息 ...
- 用html自己开发自己的串口TCP通讯调试软件
今天给大家介绍一个通讯工具,可以自己写html页面,自己写Js脚本实现数据收发. 本程序在不断完善中,请大家不要喷,多多理解,有意见只管提. 系列文章 概述 串口基础功能 TCP客户端收发 参数篇 串 ...
- 认识二进制安全与漏洞攻防技术 (Windows平台)
二进制漏洞是指程序存在安全缺陷,导致攻击者恶意构造的数据(如Shellcode)进入程序相关处理代码时,改变程序原定的执行流程,从而实现破坏或获取超出原有的权限. 0Day漏洞 在计算机领域中,0da ...
- 缓冲区溢出分析第07课:MS06-040漏洞研究——静态分析
前言 我在之前的课程中讨论过W32Dasm这款软件中的漏洞分析与利用的方法,由于使用该软件的人群毕竟是小众群体,因此该漏洞的危害相对来说还是比较小的.但是如果漏洞出现在Windows系统中,那么情况就 ...