所有其他指标均无用

对于队列,无论是实现为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数据线,那么除了这些类型数据线,你知道如今市面上还有哪些更方便好用的手机数据线吗&…

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

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

Apache ActiveMQ 5.9发布

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

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

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

Java对象到对象映射器

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

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

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

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

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

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

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

select、poll、epoll之间的区别总结[整理]

原文:https://www.cnblogs.com/Anker/p/3265058.html 好文章收藏下,慢慢品味 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者…

JPA(七):映射关联关系------映射双向多对一的关联关系

映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone;import java.util.Date; import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; impo…

如何优雅的绘制一棵省市区三级可选择的树?

开始 总结一下 开发过程中的思路想法 各位大佬们看看就好 首先你拥有的数据结构 所有省市区的信息列表 以及已经选中的信息 用的是element-ui的 el-tree const cityStorage {provinceList:[{id: 1, provinceId: "110000", name: "北京市"}],//所有省ci…

html click事件 参数,vue 实现click同时传入事件对象和自定义参数

这篇文章主要介绍了vue 实现click同时传入事件对象和自定义参数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧仅仅传入自定义参数HTMLdddddJS代码new Vue({el:#app,methods:{tm:function(e){console.log(e);}}})仅仅传入事件对象HTML…

Android学习(七)—— Android布局

Android布局 1、LinearLayout 线性布局,这种布局在平时的开发中用的最多,内部控件只能水平或竖直进行排列,在搭建较复杂的界面时会有点麻烦。 常用属性 android:orientation 控制控件排列方向,属性值为垂直(vertical…

不一样的ZTree,权限树.js插件

每一个有趣的创新,都源于苦逼的生活。在最近的工作中,遇到一个做权限管理筛选的需求。 简单总结需求: 1展示一个组织中的组织结构 2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想苦逼的重复劳动,还…

JavaFX 2:如何加载图像

这是有关如何在JavaFX 2应用程序中加载图像的JavaFX教程。 使用ImageView可以轻松完成此操作。 ImageView是一个节点,用于绘制加载有Image类的图像。 因此,您将首先使用Image类加载图像,然后使用ImageView显示它。 我还将在这里演示如何从本地…

记HTML5 a 标签的一个小坑

今天写了段简单的代码&#xff0c;点击<a>标签时却抛出了这个错误&#xff1a;Uncaught TypeError: download is not a function。代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

C#线程 ---- 线程同步详解

线程同步 说明&#xff1a;接上一篇&#xff0c;注意分享线程同步的必要性和线程同步的方法。 测试代码下载&#xff1a;https://github.com/EkeSu/C-Thread-synchronization-C-.git 一、什么是线程同步&#xff1a; 在同一时间只允许一个线程访问资源的情况称为线程同步。 二、…

响应式方案调研及前端开发管理思考

网易首页响应式风格实现技术调研网易首页实现页面&#xff08;字体&#xff09;响应式风格的方式是在不同尺寸的视口中使用不同的容器类&#xff0c;如图 1所示。当视口大于等于1420px时&#xff0c;使用大尺寸容器类 &#xff08;index2017_1200_wrap&#xff0c;width: 1200p…

linux nexus启动_Linux一键部署Nexus 3私服仓库自动化部署脚本

此脚本是Linux一键部署Nexus 3私服仓库自动化脚本&#xff0c;有需要朋友可以参考&#xff0c;脚本内容如下&#xff1a;环境准备&#xff1a;操作系统&#xff1a;CentOS Linux release 7.8.2003软件版本&#xff1a;Docker&#xff1a;docker-ce-19.03.12[rootlocalhost ~]# …

flex.css快速入门,极速布局

什么是flex.css? css3 flex 布局相信很多人已经听说过甚至已经在开发中使用过它&#xff0c;但是我想我们都会有一个共同的经历&#xff0c;面对它的各种版本&#xff0c;各种坑&#xff0c;傻傻的分不清楚&#xff0c;flex.css就是对flex布局的一种封装&#xff0c;通过简洁…