使用grep4j轻松测试分布式组件上的SLA

因此,您的分布式体系结构如下图所示,您刚刚从企业那里收到了一项要求,以确保生产者发送并随后传输到下游系统(消费者)的消息的SLA必须快且永远不会慢于此。 400毫秒。

要求说:

从生产者发送到任何消费者的消息的延迟绝不应慢于400毫秒。


听起来很熟悉? 对我来说,经验告诉我,如果将来我想保护SLA,则还需要使测试自动化,以免引入瓶颈,而这会增加消息的延迟。 但是怎么做呢? 生产者和使用者位于不同的机器中,并且某些使用者不是用Java编写的。 另外,在生产者和消费者之间有一个队列(或Web服务或RMI或ESB或其他组件或其他任何东西),因此测试起来并不容易。 好吧,所有组件都以类似的方式写入日志,那么为什么不使用日志作为测试数据呢?

例如,这些是2个示例日志,一个来自生产者发出消息(id 1546366),另一个来自接收消息的使用者之一(id 1546366):

生产者日志

2013-02-19 10:09:05,795 INFO [org.grep4j.demo.input.core.InputCoreMessageSender] (pool-19-thread-9) Input::MessageSender::Message(1546366) Sent Successfully

消费者日志

2013-02-19 10:09:06,161 INFO [org.grep4j.demo.handler.bean.mdb.SingleDestPacketHandler] (Thread-62314 (HornetQ-client-global-threads-989457197)) Handler::Packet::Message(1546366) Received::PacketId(982336426)::State(NORMAL)::Dest(CONSUMER4, 1)::DataLevel(EVENT, 7)::Op(CREATE, C)::GlobalId(1546366)::Priority(1)::Src(GUI, 1::Ids(EventId=1546366,SFBId=1546366,isBirType=false,inBir=false))

这就是我使用Grep4j进行自动性能测试的样子:

package com.gdg.grep4j.demo;
import static com.gdg.grep4j.demo.profiles.Profiles.consumer1;
import static com.gdg.grep4j.demo.profiles.Profiles.consumer2;
import static com.gdg.grep4j.demo.profiles.Profiles.consumer3;
import static com.gdg.grep4j.demo.profiles.Profiles.producer;
import static com.gdg.grep4j.demo.services.TimeService.extractTime;
import static org.grep4j.core.Grep4j.constantExpression;
import static org.grep4j.core.Grep4j.grep;
import static org.grep4j.core.fluent.Dictionary.on;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.number.OrderingComparison.lessThan;
import static org.junit.Assert.assertThat;
import org.grep4j.core.result.GrepResults;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
@Test
public class MessageDistributionPerformanceTest {private static final long MAX_ACCETABLE_LATENCY = 400L;private long producerTime = 0;private GrepResults consumersResults;@BeforeTestpublic void triggerMessageDispatcher() {System.out.println('Producing and firing a Message(1546366) to downstream systems...');}@BeforeTestpublic void extractProducerTime() {GrepResults producerResult = grep(constantExpression('Message(1546366) Sent Successfully'),     on(producer));producerTime = extractTime(producerResult.toString());}@BeforeTestpublic void grepConsumerLogs() {consumersResults = grep(constantExpression('Message(1546366) Received'),on(consumer1, consumer2, consumer3));}public void testConsumer1Latency() {long consumer1Time = extractTime(consumersResults.filterOnProfile(consumer1).toString());assertThat((consumer1Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));}public void testConsumer2Latency() {long consumer2Time = extractTime(consumersResults.filterOnProfile(consumer2).toString());assertThat((consumer2Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));}public void testConsumer3Latency() {long consumer3Time = extractTime(consumersResults.filterOnProfile(consumer3).toString());assertThat((consumer3Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));}
}

配置文件是grep目标上下文,在我的情况下,所有配置文件都是远程计算机(要更好地了解配置文件,请参阅Grep4j页面 )。

TimeService只是一个简单的服务类,用于提取日志中的时间。

package com.gdg.grep4j.demo.services;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TimeService {private static final Pattern timePattern = Pattern.compile('([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9]) ([0-9][0-9]|2[0-3]):([0-9][0-9]):([0-9][0-9]),([0-9][0-9][0-9])');public static long extractTime(String text) {Matcher lm = timePattern.matcher(text);if (lm.find()) {SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss,SSS');sdf.setTimeZone(TimeZone.getTimeZone('UTC'));String inputString = lm.group();Date date = null;try {date = sdf.parse(inputString);} catch (ParseException e) {e.printStackTrace();}return date.getTime();} else {throw new IllegalArgumentException('timePattern not found');}}
}

在几行简单的代码中,我进行了非常灵活的测试(我可以测试日志中生成的任何内容)。 对于完整的代码: https : //github.com/marcocast/grep4j-gdg.git

参考:通过我们的JCG合作伙伴 Marco Castigliego的grep4j ,可以在“ 删除重复和修复不良名称”博客上轻松测试分布式组件上的SLA 。

翻译自: https://www.javacodegeeks.com/2013/02/easy-testing-slas-on-distributed-components-with-grep4j.html

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

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

相关文章

16进制颜色识别和搭配规律

在CSS中,经常会用到16进制的颜色来设置文本、背景、边框等颜色,但是对于一个纯前端来讲,16进制颜色的识别和搭配可能会较为陌生了 ,本文简单介绍一下16进制颜色的一些规律 16进制颜色的数值意义: 举个例子:比如 #1A2B…

iis服务器显示http1.1,IIS服务器“500”内部错误 HTTP/1.1 新建会话失败

IIS服务器“500”内部错误 访问asp :HTTP/1.1 新建会话失败1.重命名 %SystemRoot%\System32\Clbcatq.dll 为 %SystemRoot%\System32\~Clbcatq.dll2.重启动,删除注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下的com33.进入:cmd.exe进windows目录下输入:rd /s /q Registration …

Python+Appium环境搭建

1、python环境搭建,这里就不做过多介绍 2、安装 node.js 2.1、官网下载node.js:https://nodejs.org/en/download/ 2.2、获取到安装文件后,直接双击安装文件,根据程序的提示,完成nodejs的安装。 2.3、安装完成后&#x…

怎么弄出满屏幕的字_怎么把屏幕字体全部显示出来

2020-05-24阅读(30)本文主要为您介绍被别人用手机号买了票怎么办,内容包括别人用我的手机号,买了火车票怎么办,有人用我的手机号买了火车票怎么办,有人用我的手机号买了火车票怎么办。手机号被别人绑定买火车票了,可以将手机号直接…

为MongoDB定制Spring Social Connect框架

在上一篇文章中 ,我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里,我想提供有关我如何做的更多细节。 Spring Social项目已经提供了基于jdbc的连接存储库实现,以将用户连接数据持久保存到关系数据库中。 但是,我…

跳槽上班第一天的感受

在上家公司呆了快三年,因为想从事与算法相关的工作,跳槽到了另一家公司,今天是上班的第一天,感觉不轻松也不紧张。有意无意的对比了两家公司的工作环境和工作方式,感觉差别是蛮大的,新的工作环境啥的都没有…

以空格为分隔符读取内容给两个变量_问与答61: 如何将一个文本文件中满足指定条件的内容筛选到另一个文本文件中?...

学习Excel技术,关注微信公众号:excelperfectQ:如下图1所示,一个名为“InputFile.csv”文件,每行有6个数字,每个数字使用空格分隔开。图1现在,我要将以60至69开头的行放置到另一个名为“OutputFi…

Chrome调试WebView时Inspect出现空白的解决方法(使用离线包不Fan墙)

起因 使用HTML5开发Android应用时,少不了调试WebView。做前端的还是习惯Chrome的开发者工具,以前都是输入Chrome://inspect就可以调试WebView了,太方便了。 最近老是出现空白页面,各种搜索,最后还是Fan墙解决了。好在…

BZOJ 1008:[HNOI2008]越狱

傻逼题&#xff0c;然后n&#xff0c;m写反了WA了一发。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<queue> #include<vector> typedef long long LL; using namespac…

2018年各大互联网前端面试题五(今日头条)

基础 行标签都有哪些&#xff1f;特点&#xff1f;img标签的用法请描述一下cookies&#xff0c;sessionStorage和localStorage的区别&#xff1f;一个div&#xff0c;高度是宽度的50%&#xff0c;让该div的宽度占据整个屏幕&#xff0c;然后能自适应&#xff0c;垂直居中&#…

属性被分为八大类不包括_Python语言---私有属性

属性分为实例属性与类属性方法分为普通方法&#xff0c;类方法&#xff0c;静态方法一&#xff1a;属性&#xff1a;尽量把需要用户传入的属性作为实例属性&#xff0c;而把同类都一样的属性作为类属性。实例属性在每创造一个实例时都会初始化一遍&#xff0c;不同的实例的实例…

CSS 文本溢出时显示省略标记

如标题所示... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content…

Jenkins分层作业和作业状态汇总

您可能知道&#xff0c;Jenkins是高度可配置的CI服务器。 我们可以设置不同的自定义构建过程。 我将分享一些我用来设置Jenkins工作层次的方法。 这是用例&#xff1a; 我们有一个主入口作业被调用以启动整个构建过程。 这项工作可以有一个到多个子工作。 &#xff08;第2级&…

【Python Programe】WSGI (Web Server Gateway Interface)

Part1: What is a Web server? 一个位于物理服务器上的网络服务器&#xff08;服务器里的服务器&#xff09;&#xff0c;等待客户端去发送request&#xff0c;当服务器接收到request&#xff0c;就会生成一个response发送回客户端&#xff1b; 客户端与服务器使用HTTP协议进…

Redis配置文件配置

Spring和Redis整合&#xff1a; 配置applicationContext-redis.xml&#xff0c;添加Redis服务&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"ht…

华大单片机m4内核的滴答定时器_微处理器、单片机及其外设,处理还是控制?...

每项新应用设计都需要一个单片机或微处理器。当在两者之间选择其一时&#xff0c;需要考虑一些因素。以下是微处理器、单片机以及异构架构的概述。考虑选择微处理器(MPU)或者单片机(MCU)时&#xff0c;应用类型通常是关键因素。另一方面&#xff0c;最终选择取决于诸如操作系统…

option标签selected=selected属性失效的问题

要在select标签上面加上autocomplete"off"关闭自动完成&#xff0c;不然浏览器每次刷新后将自动选择上一次关闭时的option&#xff0c;这样默认属性selected"selected"就会失效啦 要记住每次遇到select标签时就最好要加上autocomplete"off"这一项…

Spring集成–从头开始应用程序,第2部分

这是本教程的第二部分&#xff0c;我们将使用Spring Integration创建发票处理应用程序。 如果您错过了它&#xff0c;一定要看一下第一部分 。 以前&#xff0c;我们已经定义了系统的功能要求&#xff0c;创建了网关&#xff0c;分离器&#xff0c;过滤器和路由器组件。 让我们…

H5添加禁止缩放功能

<meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, minimum-scale1.0, user-scalableno, target-densitydpidevice-dpi" />

安装提示卸载office_office2010 卸载工具

点击上方“蓝字”&#xff0c;关注我们获取更多免费资源我们为什么要用这个office2010卸载工具呢&#xff0c;很简单旧版本的office卸载不干净&#xff0c;在安装新版本的office时可能会遇到一些奇奇怪怪的问题。如果遇到无法安装office时&#xff0c;我们可以先使用office卸载…