dz后台网站地图,建设集团排名,合肥建设局,特产电商网站建设报价单对于队列#xff0c;无论是实现为JMS #xff0c;数据库表#xff08;即Ruby的Delayed :: Job用于队列的什么#xff09;#xff0c;甚至是Amazon的SQS #xff0c;用于评估队列状态的最常见指标是其长度。 从本质上讲#xff0c;可以基于在任何给定时间队列中驻留多少消… 对于队列无论是实现为JMS 数据库表即Ruby的Delayed :: Job用于队列的什么甚至是Amazon的SQS 用于评估队列状态的最常见指标是其长度。 从本质上讲可以基于在任何给定时间队列中驻留多少消息来得出效率度量。 如果只有几条消息则表明队列正在高效地运行。 如果有很多消息则说明效率低下必须发出警报。 但是如果您处于持续繁忙的环境中并且队列突然出现快速填充的趋势那该怎么办 如果你有足够的工人已经在运行来处理突发你需要更多的火起来 您可以解雇更多的工人但这样做可能会花费您。 也就是说您可能必须设置新的工作程序实例例如Heroku工作程序dynos或AWS AMI这最终将使您花费大量的金钱。 有时这些工作人员实例需要一些时间来启动当它们开始运行时活动爆发已经结束队列又恢复了正常–最初可用的工作人员充分地处理了负载。 事实证明队列的长度是一个滞后指标。 您浪费了不必要的资源。 错误的警报 如果您已经有足够的能力来处理队列中的消息大量涌入那么监视队列的长度就不会有太大帮助。 实际上这是一个误导性指标可能会导致您采取不必要的操作。 因此当已经有足够的工人在场时队列的长度并不表示系统的效率 。 相反在高容量环境中意味着某些事情的度量标准是消息在队列中驻留的时间 。 这是一个可行的指标如果消息被卡在队列中等待处理那么您需要更多的处理器 Moo超过队列长度让队列等待时间 默认情况下 Amazon的SQS不提供查询消息已在队列中保留多长时间的功能。 因此 我写了Moo 。 Moo为客户端提供了一个接口该接口可用于获取队列度量标准中的消息时间并对其采取措施。 这是通过使用时间戳扩展SQS消息来完成的。 然后当从SQS队列中弹出消息时将检查该时间戳。 如果超过阈值差则调用回调。 Moo的用户会发现它的用法类似于Ahoy 它是AWS Java SDK之上的面向异步回调的外观。 实际上Moo使用Ahoy 在下面带有附加功能即附加“最大排队时间”异步回调。 Moo支持多个队列时间阈值并且设置最大队列时间的方法如下 为队列中的时间添加最大阈值 //adds a 1 second max threshold
sqs.addQueueWaitTimeCallback(1000, new QueueWaitTimeCallback() {public void onThresholdExceeded(long waitTime) {//waitTime is the actual time in queue//do something... like fire off a web hook, etc}
}); 请注意 addQueueWaitTimeCallback方法在队列值和相伴的QueueWaitTimeCallback回调实现中花费的最长时间为毫秒。 如果超过最大阈值则在消息接收期间将异步调用onThresholdExceeded方法否则将被onThresholdExceeded 。 此外 onThresholdExceeded将接收实际队列等待时间作为参数。 告诉我Mo 要启动Moo实例您有多种选择包括配置AWS的AmazonSQS实例或仅传递密钥机密和队列名称如下所示 为队列中的时间添加最大阈值 SQS sqs new SQS(System.getProperty(key), System.getProperty(secret), System.getProperty(queue)); 接下来您可以将零附加到许多QueueWaitTimeCallback实例如下所示 为队列中的时间添加最大阈值 sqs.addQueueWaitTimeCallback(600000, new QueueWaitTimeCallback() {public void onThresholdExceeded(long actualWaitTime) {//do something -- fire off SNS message?}
}); 在这种情况下如果消息在队列中的时间超过10分钟我将添加一个要调用的回调。 注意这些QueueWaitTimeCallback回调由队列读取器实例触发。 因此例如 QueueWaitTimeCallback当然可以启动其自身的更多实例。 这是一个示例JSON文档您可能希望将其放入SQS队列中 为队列中的时间添加最大阈值 { employees:[{ firstName:John, lastName:Doe },{ firstName:Anna, lastName:Smith },{ firstName:Peter, lastName:Jones }
]} 发送和接收此消息与使用Ahoy时完全一样。 例如要发送消息只需将String传递给send方法 为队列中的时间添加最大阈值 sqs.send(json, new SendCallback() {public void onSend(String messageId) {//messageId is from SQS}
}); 注意 send方法带有一个可选的SendCallback 。 通过receive方法接收消息该方法需要一个强制的ReceiveCallback – 对于从队列中接收到的每个消息该回调将被异步调用。 每个实例将接收放置在队列中的消息以及消息的SQS ID。 为队列中的时间添加最大阈值 sqs.receive(new ReceiveCallback() {public void onReceive(String messageId, String message) {//do something w/the message -- in this case its JSON}
}); 注意如果在收到消息后Moo注意到消息在队列中等待的时间超过为关联的QueueWaitTimeCallback配置的最大队列等待时间阈值则Moo将调用它。 注意Moo可以调用多个实例。 因此您可以建立一条链来随着时间的增加采取各种行动。 请记住队列的长度通常是一个滞后指标。 实际含义的度量标准是消息在队列中的停留时间。 这是一个可行的指标 Moo使您能够对此做点事情 你能挖一下它么 参考 The Disco Blog博客中来自我们JCG合作伙伴 Andrew Glover的所有其他指标 均无用 。 翻译自: https://www.javacodegeeks.com/2013/10/all-other-metrics-are-useless.html