Spring,Reactor和ElasticSearch:使用伪造的测试数据进行标记

在上一篇文章中,我们创建了一个从ElasticSearch的API到Reactor的Mono的简单适配器,如下所示:

import reactor.core.publisher.Mono;private Mono indexDoc(Doc doc) {//...
}

现在,我们希望以受控的并发级别运行此方法数百万次。 基本上,我们想看看索引代码在负载下的行为,对其进行基准测试。

用jFairy伪造数据

首先,我们需要一些美观的测试数据。 为此,我们将使用方便的jFairy库。 我们将索引的文档是一个简单的POJO:

@Value
class Doc {private final String username;private final String json;
}

生成逻辑包装在Java类中:

import io.codearte.jfairy.Fairy;
import io.codearte.jfairy.producer.person.Address;
import io.codearte.jfairy.producer.person.Person;
import org.apache.commons.lang3.RandomUtils;@Component
class PersonGenerator {private final ObjectMapper objectMapper;private final Fairy fairy;private Doc generate() {Person person = fairy.person();final String username = person.getUsername() + RandomUtils.nextInt(1_000_000, 9_000_000);final ImmutableMap<String, Object> map = ImmutableMap.<String, Object>builder().put("address", toMap(person.getAddress())).put("firstName", person.getFirstName()).put("middleName", person.getMiddleName()).put("lastName", person.getLastName()).put("email", person.getEmail()).put("companyEmail", person.getCompanyEmail()).put("username", username).put("password", person.getPassword()).put("sex", person.getSex()).put("telephoneNumber", person.getTelephoneNumber()).put("dateOfBirth", person.getDateOfBirth()).put("company", person.getCompany()).put("nationalIdentityCardNumber", person.getNationalIdentityCardNumber()).put("nationalIdentificationNumber", person.getNationalIdentificationNumber()).put("passportNumber", person.getPassportNumber()).build();final String json = objectMapper.writeValueAsString(map);return new Doc(username, json);}private ImmutableMap<String, Object> toMap(Address address) {return ImmutableMap.<String, Object>builder().put("street", address.getStreet()).put("streetNumber", address.getStreetNumber()).put("apartmentNumber", address.getApartmentNumber()).put("postalCode", address.getPostalCode()).put("city", address.getCity()).put("lines", Arrays.asList(address.getAddressLine1(), address.getAddressLine2())).build();}}

相当无聊的代码实际上确实很酷。 每次运行它时,它都会生成随机但合理的JSON,如下所示:

{"address": {"street": "Ford Street","streetNumber": "32","apartmentNumber": "","postalCode": "63913","city": "San Francisco","lines": ["32 Ford Street","San Francisco 63913"]},"firstName": "Evelyn","middleName": "","lastName": "Pittman","email": "pittman@mail.com","companyEmail": "evelyn.pittman@woodsllc.eu","username": "epittman5795354","password": "VpEfFmzG","sex": "FEMALE","telephoneNumber": "368-005-109","dateOfBirth": "1917-05-14T16:47:06.273Z","company": {"name": "Woods LLC","domain": "woodsllc.eu","email": "contact@woodsllc.eu","vatIdentificationNumber": "30-0005081","url": "http://www.woodsllc.eu"},"nationalIdentityCardNumber": "713-79-5185","nationalIdentificationNumber": "","passportNumber": "jVeyZLSt3"
}

整齐! 不幸的是,没有记录jFairy是否是线程安全的,因此以防万一在实际代码中,我正在使用ThreadLocal 。 好的,所以我们只有一个文档,但是我们需要数百万个文档! 使用for -loop太过时了。 您会告诉我们无限的随机人流吗?

import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;private final Scheduler scheduler = Schedulers.newParallel(PersonGenerator.class.getSimpleName());Mono<Doc> generateOne() {return Mono.fromCallable(this::generate).subscribeOn(scheduler);
}Flux<Doc> infinite() {return generateOne().repeat();
}

generateOne()Mono<Doc>包装阻塞的generate()方法。 另外, generate()parallel Scheduler上运行。 为什么? 事实证明,jFairy在单个内核上还不够快(很多随机数生成,表查找等),因此我不得不并行化数据生成。 通常不应该是一个问题。 但是,当生成伪造数据的速度比接触外部服务器的响应式应用程序慢时,它会告诉您有关基于Netty的Spring Web-flux(!)的性能。

同时调用ElasticSearch

好的,拥有无数好看的假测试数据流,我们现在要在ElasticSearch中对其进行索引。

@PostConstruct
void startIndexing() {index(1_000_000, 1_000);
}private void index(int count, int maxConcurrency) {personGenerator.infinite().take(count).flatMap(this::indexDocSwallowErrors, maxConcurrency).window(Duration.ofSeconds(1)).flatMap(Flux::count).subscribe(winSize -> log.debug("Got {} responses in last second", winSize));
}private Mono<IndexResponse> indexDocSwallowErrors(Doc doc) {return indexDoc(doc).doOnError(e -> log.error("Unable to index {}", doc, e)).onErrorResume(e -> Mono.empty());
}

当应用程序启动时,它将启动对一百万个文档的索引编制。 注意,告诉Reactor(它与RxJava相同)多么容易,它应该调用多达1000个对ElasticSearch的并发请求。 每秒我们计算收到的回复数:

Got 2925 responses in last second
Got 2415 responses in last second
Got 3336 responses in last second
Got 2199 responses in last second
Got 1861 responses in last second

不错! 特别是当您考虑到有多达一千个并发HTTP请求并且我们的应用程序启动时几乎只有30个线程峰值(!),好吧,这是localhost <-> localhost ,有罪! 但是,我们实际上如何知道所有这些呢? 日志记录很好,但是到了二十一世纪,我们可以做得更好! 监视将是下一批的主题。

源代码可在react reactive-elastic-search分支中的github.com/nurkiewicz/elastic-flux中获得。

翻译自: https://www.javacodegeeks.com/2018/01/spring-reactor-elasticsearch-bechmarking-fake-test-data.html

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

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

相关文章

通信工程施工图案例分析

分析入口 给你一个城市&#xff0c;要如何开始分析&#xff0c;如下图&#xff1a; 分析一下城市的情况&#xff1a; 主要有&#xff1a; 行政区域地理位置&#xff0c;周围的地形经济发展情况X事发展的情况交通发展的情况其他&#xff1a;还包括农林、旅游、气象、地质、水…

参数整定临界比例度实验_PID理解起来很难?系统讲解PID控制及参数调节,理论加实际才好!...

在实际工程中&#xff0c;应用最为广泛的调节器控制规律为比例、积分、微分控制&#xff0c;简称PID控制&#xff0c;又称PID调节。PID控制器问世至今以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。PID调节控制是一个传统控制方法&#xff0c;它适…

工程计价里面的表以及相关税额的计算

序号表名表一工程预算总表表二建筑安装工程费用预算表表三&#xff08;甲&#xff09;建筑安装工程量算表表三&#xff08;乙&#xff09;建筑安装工程施工机械使用费算表表三&#xff08;丙&#xff09;建筑安装工程仪器仪表使用费预算表表四&#xff08;甲&#xff09;国内器…

apache jmeter_Apache Server和JMeter调试

apache jmeter我一直在使用JMeter为生产服务器生成负载以测试我的应用程序。 该测试计划具有13个以上的HTTP采样器以发出不同的请求&#xff0c;并具有一个正则表达式提取器以从响应中提取一些值。 此值在连续的HTTP Sampler中使用。 这个测试用例简单而直接。 最初&#xff0c…

CDMA系统的三种码

CDMA系统中用到的三种码&#xff1a;PN码、Wash码、长码 种类作用PN码伪随机码&#xff0c;主要是把发送的序列转化为伪随机序列Wash码消除或者抑制多址干扰&#xff0c;如果多址信号是正交的&#xff0c;那么多址干扰可以减小到0&#xff1b;区分前向信道长码区分用户的业务信…

4计算准确率_孩子计算总出错?4个好方法帮助低年级学生提高计算准确率!

低年级孩子&#xff0c;由于活泼好动&#xff0c;注意力不容易集中&#xff0c;思维容易被分散。表现在学业上&#xff0c;就会出现学习水平参差不齐的情况。而最主要的表现&#xff0c;就是计算能力的差异。据资深数学老师观察&#xff1a;成绩好的孩子&#xff0c;一般不只掌…

使用Speedion 3.0.17或更高版本轻松从事务中返回值

交易次数 在我以前的文章中&#xff0c;我写了关于如何使用Speedment轻松使用事务的方法&#xff0c;其中我们原子地更新了两个银行帐户。 众所周知&#xff0c;事务是一种将多个数据库操作组合到一个原子执行的单个操作中的方法。 但是事务不仅与更新数据库有关&#xff0c;而…

无线业务需求的线路设计以及拓扑图实现

MSC →\rightarrow→BSC →\rightarrow→ BTS ADM-1 →\rightarrow→ ADM-14 →\rightarrow→ ADM-16 边缘层 →\rightarrow→ 汇聚层 →\rightarrow→ 核心层 设计光缆链路时要注意的问题&#xff1a; 链路要适当长一些&#xff0c;减少中继设备接续造成的损耗尽可能多的使…

双代号网络图节点时间参数_管理和实务都考!快速学会单代号与双代号参数计算...

工程网络计划是二级建造师《建设工程施工管理》科目每年均会进行考核的高频考点&#xff0c;重点在双代号、单代号网络计划的概念及应用。主要题型为通过网络图或文字描述计算相关网络参数或确定关键线路&#xff0c;本篇就双代号、单代号网络计划相关参数的计算&#xff0c;以…

idea中maven执行install报错_IntelliJ IDEA Maven编译install时报错,无效的发行版:1.8

1.首先看java环境是否配置正确JAVA_HOME : C:\Program Files\Java\jdk1.8.0_92 //安装的Jdk路径PATH: %JAVA_HOME%\bin;按下"window"R 输入cmd 按下"ENTER" 输入java -version&#xff0c;如果出现了版本号等信息说明配置成功2.确认maven配…

gc可视化分析_GC内存可视化器教程–第一部分

gc可视化分析正如您从过去的文章中可能已经读到的那样&#xff0c;要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力&#xff0c;例如Java堆内存占用量以及垃圾回收过程。 为了实现上述目标&#xff0c;所有JVM供应商&#xff08;Oracle&#xff0c;IBM等&…

涉及到IP地址的各种计算(CIDR/子网划分/IP地址范围的确定等)

1.判断是否属于子网 方法&#xff1a;如子网86.32.0.0/12&#xff0c;它的网络前缀有12位&#xff0c;把点十分制划为二进制展开&#xff0c;每一个点分隔开的是相邻的两组数字&#xff0c;每组数字有八个&#xff0c;你把他写在纸上数一下&#xff0c;扣掉前面的八位数字&…

go 变量大写_go语言如何将大写转小写

go语言将大写转小写的方法&#xff1a;首先创建一个go示例文件&#xff1b;然后定义一个字符串类型的变量&#xff1b;接着使用ToLower函数将大写的变量字符全部转成小写&#xff1b;最后使用print函数打印转换后的结果即可。本文操作环境&#xff1a;Windows7系统、Go1.11.2版…

为什么Spring的健康状况会再次下降,下降,上升,上升,上升和下降?

为什么 我们新JavaScript客户端应用程序会定期调用Grails后端的/health端点来确定离线状态。 事情开始变得“​​有趣”。 我们免费获得此端点&#xff0c;因为Grails基于Spring Boot&#xff0c;而Spring Boot带有一个名为Spring Boot Actuator的子项目。 这给了我们许多端点…

浅谈auto与decltype函数的区别

auto与decltype都是C里处理类型的指示符&#xff0c;它们的使用场景如下&#xff1a; autodecltype在我们需要给变量赋值的时候&#xff0c;简单的程序往往可以通过观察得出表达式的类型&#xff0c;但在一些大型程序中这样做往往是行不通的&#xff0c;为此可以使用auto指示符…

php mysql 快餐_用PHP+MYSQL做一个简单的点餐系统的后台,初学者. 请高手指点下如何实现后台添加菜名 餐馆 价格...

展开全部" name"cm" placeholder"菜名" type"text" />" name"cg" placeholder"餐馆" type"text" />" name"jg" placeholder"价格" type"text" />if…

三句话讲清楚直接初始化与拷贝初始化

直接初始化 int main() {int a(3);printf("%d",a); }拷贝初始化 int main() { int a3; printf("%d",a); }区别 直接初始化拷贝初始化不使用等号初始化一个变量就是直接初始化使用等号初始化一个变量就是拷贝初始化 直接初始化与拷贝初始化的使用一般以代…

redhat 9.0 mysql 配置_RedHat 9.0下Apache+PHP+MySQL服务器安装配置

一、安装环境操作系统&#xff1a;Linux RedHat 9.0web服务软件&#xff1a;Apache httpd-2.2.3.tar.gz数据库软件&#xff1a;MySQL-server-5.0.26-0.i386.rpm(服务端)MySQL-client-5.0.26-0.i386.rpm(客户端)MySQL-devel-5.0.26-0.i386.rpm(开发包)MySQL-shared-5.0.26-0.i38…

spark减少内存消耗_将内存消耗减少20倍

spark减少内存消耗这将是另一个故事&#xff0c;与我们分享有关内存相关问题的最新经验。 该案例是从最近的客户支持案例中提取的&#xff0c;在该案例中&#xff0c;我们遇到了一个行为异常严重的应用程序&#xff0c;该应用程序因生产中的OutOfMemoryError消息而死。 在连接了…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验&#xff0c;看过那篇文章的人可能知道&#xff0c;今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中&#xff0c;机器学习和运筹…