问题描述
业务中使用了Azure云中的存储账号队列(Storage Account Queue),它的计费方式是按照操作数统计。
看下图:GetMessageRead 达 111.11M(1亿次),但是写入(GetMessageWrite,PutMessage)和删除(DeleteMessage)却只有区区的 101 次。
那么,在以上的API Name,那些表示真实的业务消息,那些是一些管理层面的操作呢?这些API指标说明了什么呢?
问题解答
在Transactions 的统计数中,只要是发送到服务端的请求请求,不管请求成功、或者失败,都作为一个操作指标计算。它代表的不是消息条数。
API name 说明表
| API name | 请求数 | 操作含义与读图要点 |
GetMessageRead |
111.11M | 取消息但未返回消息,通常称为空轮询。 成功返回空结果也会计入请求数,并不等于接口报错。 “空”指本次未取得可见消息 |
GetMessageWrite |
101 | 取消息且返回了消息。 服务端会更新返回消息的不可见时间和出队次数,因此名称中带有 Write,而不是指生产者写入新消息。一次请求最多可返回 32 条。 取出后不会自动删除,同一消息也可能再次被取出,故 101 次不等于 101 条唯一消息或 101 次业务成功。 |
PutMessage |
101 | 向队列添加一条新消息,即生产者入队。一次成功操作添加一条消息 统计值还可能包含失败请求,重试也可能造成重复写入,因此不能直接等同于唯一业务任务数。 |
DeleteMessage |
101 | 使用消息 ID 和有效的 PopReceipt 删除指定消息,通常在业务处理成功后调用。 未删除的消息可能在不可见期结束后重新被消费。101 次表示删除请求数。 是否删除成功需看响应,是否业务成功还需看应用日志。 |
GetQueueMetadata |
12k | 读取某个队列的属性和自定义元数据,响应中包含近似消息数。常见于监控、扩缩容或管理工具,不返回消息正文,也不改变消息可见性。 12k 是查询约 1.2 万次,不是队列积压了 1.2 万条消息。 |
GetQueueServiceProperties |
44 | 读取整个 Queue 服务的配置,例如 CORS 规则及 Storage Analytics 相关配置。它不同于查询某个队列的属性,也不是读取 Azure Monitor 指标值。 44 次表示配置读取请求,不表示修改配置或消费消息。 |
ListQueues |
4 | 列举存储账户中的队列,支持名称前缀过滤和分页。常见于管理工具浏览列表或程序发现队列,不读取队列中的消息。 4 次是列举请求数,不代表账户只有 4 个队列,也不能据此判断有几个人访问。 |
PeekMessages |
1 | 查看可见消息,但不占用或删除消息:不改变可见性,也不增加出队次数,其他消费者仍可获取消息。常见于预览和调试。 一次最多可查看 32 条,因此 1 次不代表只看了一条,更不代表完成消费。 |
QueuePreflightRequest |
1 | CORS 跨域预检,对应 HTTP OPTIONS。 浏览器等客户端先检查来源、方法和请求头是否符合跨域规则,不进行消息读写。 预检匿名执行不代表消息可以匿名访问,1 次预检也不保证后续业务请求成功。 |
Unknown |
0 | 请求在识别出操作名称前失败时使用的分类,不是一个业务 API。 |
看图说话
- 真实业务消息相关操作主要包括:PutMessage(写入消息)、GetMessageWrite(实际取到消息)、DeleteMessage(处理后删除消息)和 UpdateMessage(更新消息或延长不可见时间)。
- 管理或监控层操作主要包括:CreateQueue、DeleteQueue、ClearMessages、ListQueues、SetQueueMetadata、SetQueueServiceProperties、PeekMessages 和 QueuePreflightRequest;另外,GetMessageRead 表示队列为空时的轮询,不属于真实业务消息量。
所以,图中的Transacation指标中的 GetMessageRead 表示下游业务持续不断的从Queue中取读取消息,但可能没有读取到消息(Queue为空)。
GetMessagesRead: This likely represents the number of read operations performed with the GetMessages API call. This call is used to retrieve one or more messages from the front of the queue.
GetMessagesWrite: This likely represents the number of write operations performed with the GetMessages API call. It might seem counterintuitive to have write operations associated with a GetMessages call, but this could be due to the state management of messages. When a message is retrieved from the queue, its state changes (it becomes invisible for a certain period), which might be considered a write operation.
Reference docs:https://learn.microsoft.com/en-us/answers/questions/1282859/getmessagesread-and-getmessageswrite-metrics
参考资料
指标定义:https://learn.microsoft.com/azure/storage/queues/monitor-queue-storage-reference
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!