【kafka】使用jmeter压测kafka并发性能

我不是女神ヾ 2022-10-29 07:31 380阅读 0赞

1、idea中开发kafka并发测试需要的扩展包

由于jmeter的jms模块并不支持kafka,因此需要扩展开发
引入jmeter

  1. <dependency>
  2. <groupId>org.apache.jmeter</groupId>
  3. <artifactId>ApacheJMeter_core</artifactId>
  4. <version>5.4.1</version>
  5. <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.jmeter</groupId>
  9. <artifactId>ApacheJMeter_java</artifactId>
  10. <version>5.4.1</version>
  11. <scope>provided</scope>
  12. </dependency>

编写向kafka发送消息的核心逻辑,继承AbstractJavaSamplerClient

  1. public class JmeterTest extends AbstractJavaSamplerClient {
  2. private static final Logger log = LoggerFactory.getLogger(JmeterTest.class);
  3. private KafkaProducer producer;
  4. private Integer dataSize;
  5. private Integer dataNum;
  6. private String topic;
  7. // SampleResult类封装了从入口样本返回的各种信息
  8. private SampleResult results;
  9. /**
  10. * 创建生产者实例
  11. */
  12. private void init() {
  13. if (producer == null) {
  14. // ...
  15. Map<String, Object> kafkaProperites = ConfigUtil.getProducerParams(openSsl, "jmeter-test");
  16. producer = new KafkaProducer(kafkaProperites);
  17. }
  18. }
  19. @Override
  20. public Arguments getDefaultParameters() {
  21. // 声明定义Arguments类
  22. Arguments params = new Arguments();
  23. // 添加一个新参数
  24. params.addArgument("dataSize", "4608");
  25. params.addArgument("dataNum", "1");
  26. params.addArgument("topic", "test_topic_1");
  27. return params;
  28. }
  29. @Override
  30. public void setupTest(JavaSamplerContext jsc) {
  31. // 定义SampleResult类
  32. results = new SampleResult();
  33. // 以String形式获取指定参数的值,或者如果未指定该值,则返回指定的默认值
  34. dataSize = jsc.getIntParameter("dataSize", 4608);
  35. dataNum = jsc.getIntParameter("dataNum", 1);
  36. topic = jsc.getParameter("topic", "test_topic_1");
  37. }
  38. @Override
  39. public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
  40. init();
  41. ProducerRecord<String, byte[]> record = getRecord();
  42. results.sampleStart();
  43. for (int i = 0; i < dataNum; i++) {
  44. producer.send(record);
  45. }
  46. results.sampleEnd();
  47. //由于kafka的错误基本上都是警告,没法通过异常捕获知道,这里直接返回成功了,真正是否成功还得通过日志定位, 待优化
  48. results.setSuccessful(true);
  49. results.setResponseData("send " + dataNum + " records to " + topic, StandardCharsets.UTF_8.name());
  50. producer.close();
  51. return results;
  52. }
  53. // 构造dataSize大小的随机数据
  54. private ProducerRecord<String, byte[]> getRecord() {
  55. byte[] payload = null;
  56. Random random = new Random(0);
  57. if (dataSize != null) {
  58. payload = new byte[dataSize];
  59. for (int i = 0; i < payload.length; ++i)
  60. payload[i] = (byte) (random.nextInt(26) + 65);
  61. }
  62. ProducerRecord<String, byte[]> record = new ProducerRecord<>(topic, payload);
  63. return record;
  64. }
  65. }

2、在windows环境中用可视化页面配置

添加线程组,组下面添加取样器-》Java请求
在这里插入图片描述
配置java请求的自定义类路径
在这里插入图片描述
将配置好的线程组保存成jmx文件

3、上传至linux环境中执行

问题:执行jmeter报没有权限
在这里插入图片描述
给整个bin目录赋执行权限即可
在这里插入图片描述
然后执行sh ./jmeter.sh -v,显示jmeter的banner就ok啦
在这里插入图片描述

执行我们配好的jmx文件
sh jmeter.sh -n -t kafka-producer.jmx -l result.jtl
在这里插入图片描述

4、收集结果

回到windows系统,在jmeter中添加一个“聚合报告”,打开result.jtl
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,380人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Jmeter

    Jmeter工具使用入门教程 添加线程组 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text