所有其他指标均无用

对于队列,无论是实现为JMS ,数据库表(即Ruby的Delayed :: Job用于队列的什么),甚至是Amazon的SQS ,用于评估队列状态的最常见指标是其长度。 从本质上讲,可以基于在任何给定时间队列中驻留多少消息来得出效率度量。 如果只有几条消息,则表明队列正在高效地运行。 如果有很多消息,则说明效率低下,必须发出警报。 时间1

但是,如果您处于持续繁忙的环境中,并且队列突然出现快速填充的趋势,那该怎么办? 如果你有足够的工人已经在运行来处理突发,你需要更多的火起来?

您可以解雇更多的工人,但这样做可能会花费您。 也就是说,您可能必须设置新的工作程序实例,例如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 it's JSON}
});

注意,如果在收到消息后,Moo注意到消息在队列中等待的时间超过为关联的QueueWaitTimeCallback配置的最大队列等待时间阈值,则Moo将调用它。 注意,Moo可以调用多个实例。 因此,您可以建立一条链来随着时间的增加采取各种行动。

请记住,队列的长度通常是一个滞后指标。 实际含义的度量标准是消息在队列中的停留时间。 这是一个可行的指标, Moo使您能够对此做点事情! 你能挖一下它么?

参考: The Disco Blog博客中来自我们JCG合作伙伴 Andrew Glover的所有其他指标 均无用 。

翻译自: https://www.javacodegeeks.com/2013/10/all-other-metrics-are-useless.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...

随着智能手机日益发展,辅助智能手机的数据线配件也越来越多样。现在我们最常见的无非就是标准Micro usb口、正反随便插的Type-c接口、还有苹果Lightning数据线,那么除了这些类型数据线,你知道如今市面上还有哪些更方便好用的手机数据线吗&…

团体程序设计天梯赛L3-019 代码排版(23分)

打算学完编译原理后再次实现它。。。 以下为比较“杂乱”的方法: 海量数据: https://pan.baidu.com/s/1Prd0ZqNLoCLLvXyJjCef3w 如果大家有发现这个程序的问题,请联系我,谢谢啦~~~ 我很疑惑,不知道错在哪里&#xff0c…

canvas入门实战--邀请卡生成与下载

1.前言 写了很多的javascript和css3的文章,是时候写一篇canvas的了。canvas是html5提供的一个新的功能!至于作用,就是一个画布。然后画笔就是javascript。canvas的用途非常的广,特别是html5游戏以及数据可视化这两个方面。现在can…

javascript 数组求交集/差集/并集/过滤重复

最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.prototype.intersect function(){let mine this.concat();for (var i 0; i < arguments.length; …

Apache ActiveMQ 5.9发布

Apache ActiveMQ团队刚刚发布了新的ActiveMQ 5.9版本 。 Apache ActiveMQ 5.9发布 自从先前的5.8版本以来&#xff0c;此版本是8个月的辛苦工作。 在此发行版中&#xff0c;我们将像往常一样对代理进行增强&#xff0c;并使用最新的协议&#xff08;例如AMQP和MQTT&#xff…

android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

前言上次我写了一遍文章《Android 关于美颜/滤镜 从OpenGl录制视频的一种方案》&#xff0c;里面利用ImageReader来从获取Surface上获取数据&#xff0c;但是经过熊皮皮的提醒&#xff0c;我发现多PBO的确可以实现跟ImageReader一样的效果&#xff0c;并且版本要求仅为Android4…

DAY77-Django框架(八)

今日内容&#xff1a;创建多表模型、多表数据操作、基于对象的跨表查询、基于双下划线的跨表查询 一、创建多表模型 class Author(models.Model):# id如果不写,会自动生成,名字叫nid,并且自增id models.AutoField(primary_keyTrue)name models.CharField(max_length32)sex m…

Async Await

接着上一篇Generator co的使用 https://juejin.im/post/5ab51336f265da239d493ff4 这里继续说说js异步处理的方法 async await( 即Generator的语法糖) async 是“异步”的简写&#xff0c;async 用于申明一个 function 是异步的&#xff0c;而 await 用于等待一个异步方法执行…

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是&#xff0c;最近我遇到了一个非常有趣的错误&#xff0c;它促使我环顾四周&#xff0c;并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表&#xff1a; 推土机&#xff1a;推土机是Java Bean到Java Bean的映射器&#xff…

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能&#xff0c;在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…

送福利:ROKID 语音开发板免费送,开启你的物联网之旅

都让一让&#xff0c;我说个事情&#xff1a;掘金联合 Rokid 开发者社区给大家发福利啦&#xff01; 掘金联合 Rokid 开发者社区为大家准备了一些福利&#xff0c;只要秀出你的 skill 和技术栈&#xff0c;就有可能获得 Rokid 全栈语音智能开发套件。 ? Rokid开箱试用活动 活…

点击复制文本

点击按钮&#xff0c;进行文本复制操作。实现这个功能需要二点&#xff1b; 一&#xff1a;用window.getSelection().selectAllChildren(“”)获取要复制的内容 二&#xff1a;用document.execCommand ("Copy");进行复制操作 关键代码 window.getSelection().selec…

6.25

TEXT 94 Cancer biology 肿瘤生物学 Cramping tumours 断了肿瘤的活路&#xff08;陈继龙编译&#xff09; Jan 18th 2007 From The Economist print edition An old observation about cancer cells may lead to a new treatment 早年发现的肿瘤细胞的一个特征可能为治疗肿瘤打…

Java Lambdas简介

Java 8的主题是lambdas。 我已经注意到&#xff0c;对于许多Java程序员来说&#xff0c;lambda都是非常难的材料。 因此&#xff0c;让我们尝试对它们有一个基本的了解。 首先&#xff0c;lambda到底是什么&#xff1f; Lambda是一个匿名函数&#xff0c;与常规函数不同&#…

ios html清除缓存图片,iOS,如何清理缓存的图片

通常&#xff0c;在我们加载图片的时候&#xff0c;一般都会做缓存处理&#xff0c;像SDWebImage&#xff0c;YYWebImage都是有的&#xff0c;但是有缓存&#xff0c;当然也需要清理缓存,如果没有这个功能的话&#xff0c;显得app太没人性化。获取总的缓存大小// 获取某个路径下…

搭建一个项目的前期准备

后端&#xff1a;node(驱动) mogodb(数据库) express(node框架) mongoose(快速建模工具) moment.js(时间和日期格式化) jade(模板引擎)前端&#xff1a; jquery(类库) bootstrsop(样式框架) bower(npm模块)本地环境&#xff1a;less cssmin jshint uglifyjs mocha …

ZOJ1081 Points Within

在解析几何中&#xff0c;我们大量的使用列方程求解未知量。但是在计算机计算的时候&#xff0c;解析几何的算法因为使用除法过多可能会带来严重的精度误差&#xff0c;所以简单来说&#xff0c;计算几何使用了一些其他的等效的方法来解决这些问题。 这里先说一个比较基础的题目…

如何使用JavaScript控制台改进工作流程

作为Web开发人员&#xff0c;很有必要了解如何调试代码。后台开发我们经常使用外部库来记录日志&#xff0c;并在某些情况下格式化显示日志&#xff0c;前端我们会使用断点和控制台&#xff0c;但是我们浏览器的控制台比我们想象的要强大得多。 当我们考虑控制台时&#xff0c…

如何在OpenJDK中使用ECC

曾经试图在Java和OpenJDK中使用椭圆曲线密码术 &#xff08;ECC&#xff09;的每个人要么被迫使用Bouncy Castle&#xff0c;要么被SunEC提供者弄糊涂了 。 SunEC提供程序根据文档 &#xff08;报价&#xff09;提供以下算法&#xff1a; AlgorithmParameters 欧共体 KeyAgr…

html 文本框数量加减,收藏!js实现input加减

好的程序员是会复制粘贴的&#xff0c;这样说好像会被唾弃的。。。。。html减号按钮点击事件function subtraction(){//获取-号按钮var subtraction document.getElementById("subtraction");//获取文本框var number document.getElementById("number");…