编译环境:
JDK: 1.8+
Maven:3.3.9+
打包命令:
mvn clean package
运行命令:
在DataToKafka-3.0.0.jar所在的目录,创建名为config的目录,
在config目录中创建runtime.json的配置文件,配置一下必要的参数即可运行起来,3.0.0版本把配置全部更改成了JSON文件的配置方式
java -jar 在DataToKafka-3.0.0.jar
会在Jar包所在的目录创建logs目录,目录里面有相关的运行日志,可供查阅
-
配置全部使用JSON方式
-
支持CSV和JSON两种格式数据发送
-
可以随意配置数据字段
-
字符串字段可以设置长度
-
数值可以设置取值范围
-
时间可以设置起始位置及格式
-
发数频度设置
-
支持这两种格式的属性模板定义
-
有些字段可以设置固定值,有些可以设置活动值
-
等等功能
-
支持CSV文件配置具体点位及取值范围
-
支持开关量的自定义随机控制
-
支持同一列配置的多种数据类型生成
- 系统采用灵活的配置方式进行发数,在发数速率上要有所下降
- 不管是CSV还是JSON格式都能很好的支持
- 在数据字段上灵活的添加或减少
- 在字段的数据类型上可以灵活的配置
- 目前支持的数据类型有:int double float boolean date string
{
"kafka": {
"bootstrapServers": "192.168.1.220:9092", //用于初始化时建立链接到kafka集群的连接地址
"acks": 0, //用于消息的可靠性传输
"retries": 3, //poducer消息发送失败后,重试的次数
"lingerMs": 100, //缓冲区的消息被清空的时间间隔
"batchSize": 102400, //批量发送消息的大小
"bufferMemory": 33554432, //缓存消息的缓冲区大小
"maxRequestSize": 10485760, //producer端能够发送的最大消息大小
"compressionType": "lz4", //消息压缩方式
"requestTimeoutMs": 60000, //消息发送的最长等待时间
"maxInFlightRequestsPer": "1", //限制producer在单个broker连接上能够发送的未响应请求的数量
"keySerializer": "org.apache.kafka.common.serialization.StringSerializer", //提供将key序列化方式
"valueSerializer": "org.apache.kafka.common.serialization.StringSerializer" //提供将value序列化方式
},
"commons": {
"stringFieldDefaultLength": 4, //字符串的长度为默认4个字符组成
"stringFieldDefaultWrite": 7, // 1 表示大写 2 表示小写 3 表示数字 4 表示大写小写混合 5 表示小写和数字 6 表示大写和数字 7 表示大写小写和数字
"booleanFieldDefaultFlag": 0, //1 表示true -1 表示false 0 表示随机true或false
"intFieldDefaultMin": 0, //表示int最小取值范围
"intFieldDefaultMax": 10000, // 表示int最大取值范围
"doubleFieldDefaultFormat": "#0.000", // 表示保留的小数点位数
"doubleFieldDefaultMin": 0, // 表示double最小取值范围
"doubleFieldDefaultMax": 10000, // 表示double最大取值范围
"floatFieldDefaultFormat": "#0.00", // 表示保留的小数点位数
"floatFieldDefaultMin": 0, // 表示float最小取值范围
"floatFieldDefaultMax": 10000, // 表示float最大取值范围
"dateFieldDefaultStartPoint": "now", // 表示开始时间
"dateFieldDefaultFormat": "yyyy-MM-dd HH:mm:ss" // 表示时间格式
},
"message": [
{
"topicName": "itdeer1", //主题名称
"threads": 1, //启动的线程数
"dataNumber": 100000, //发送的数据条数或批数 为0则为无限发送
"timeFrequency": -1, //时间间隔
"dataMapping": {
"type": "json", //数据格式
"appoint": "false", //是否是模板
"fields": [ //字段列表
{
"field": "tagName==string(5)" //字段名称为 tagName 类型为string 长度为5 长度不设置则使用默认值
},
{
"field": "tagValue==double(0,10)" //字段名称为 tagValue 类型为double 取值范围 0,10,范围不设置则使用默认值
},
{
"field": "isGood==boolean(0)" //字段名称为 isGood 类型为boolean 取值方式不设置则使用默认值 0 表示随机true或false
},
{
"field": "sendTS==date(now,yyyy-MM-dd HH:mm:ss,1000)" //字段名称为 sendTS 类型为date 起始值为当前时间,时间格式为yyyy-MM-dd HH:mm:ss 最后的参数为生成的时间值与上一个值直接的间隔
},
{
"field": "piTS==date(2018-01-30 00:00:00.000,yyyy-MM-dd HH:mm:ss.SSS)" //字段名称为 piTS 类型为date 起始值为指定时间点(2018-01-30 00:00:00.000)格式要和后面的格式保持一致,时间格式为yyyy-MM-dd HH:mm:ss.SSS
},
{
"field": "sw==switching(0)" //表示开关量 表示开关量的变换类型 -1表示只返回0值 0表示随机时间内返回0或者1 1表示值返回1 大于1的值表示指定时间内变换一次
}
]
}
},
{
"topicName": "itdeer2",
"threads": 1,
"dataNumber": 100000,
"timeFrequency": -1,
"dataMapping": {
"type": "csv",
"appoint": "false",
"separator": ",", //数据分隔符
"fields": [
{
"field": "tagName==string" //字段名称为 tagName 类型为string 长度使用默认值
},
{
"field": "tagValue==double" //字段名称为 tagValue 类型为double 取值范围使用默认值
},
{
"field": "isGood==boolean"//字段名称为 isGood 类型为boolean 取值方式使用默认值
},
{
"field": "sendTS==date"//字段名称为 sendTS 类型为date 起始时间和格式使用默认值
},
{
"field": "piTS==date"//字段名称为 piTS 类型为date 起始时间和格式使用默认值
}
]
}
},
{
"topicName": "itdeer3",
"threads": 1,
"dataNumber": 100000,
"timeFrequency": -1,
"dataMapping": {
"type": "json", //格式为JSON
"appoint": "true", //使用模板 字段名称和值之间用“==”连接 字段与字段之间使用“&&”连接
"points": [
{
"point": "tagname==CH4.A4037&&tagvalue==int(0,10)&&isgood==boolean(0)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss.SSS)"
}, //tagname字段 值为CH4.A4037, tagvalue字段 值为int类型 范围为(0,10), isgood字段 取值为boolean随机,sendts字段和pits为时间类型,当前时间开始,格式不同
{
"point": "tagname==CH4.A4038&&tagvalue==int(10,30)&&isgood==boolean(1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==H2.A00015&&tagvalue==int(30,50)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==H2.A00010&&tagvalue==int(50,80)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==NH3A00008&&tagvalue==int(80,100)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==NH3A00018&&tagvalue==int(100,150)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2331.C800HTA50CQ101&&tagvalue==int(150,200)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2385.C800HTA50CQ101&&tagvalue==int(200,210)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2531.C700HTA50CQ101&&tagvalue==int(250,310)&&isgood==boolean(1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2581.C700HTA50CQ101&&tagvalue==int(310,410)&&isgood==boolean(0)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss.SSS)"
}
]
}
},
{
"topicName": "itdeer4",
"threads": 1,
"dataNumber": 100000,
"timeFrequency": -1,
"dataMapping": {
"type": "csv", //格式为CSV
"appoint": "true", //使用模板
"separator": ",", //分隔符
"points": [
{
"point": "tagname==CH4.A4037&&tagvalue==int(0,10)&&isgood==boolean(0)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss.SSS)"
},
{
"point": "tagname==CH4.A4038&&tagvalue==int(10,30)&&isgood==boolean(1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==H2.A00015&&tagvalue==int(30,50)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==H2.A00010&&tagvalue==int(50,80)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==NH3A00008&&tagvalue==int(80,100)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==NH3A00018&&tagvalue==int(100,150)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2331.C800HTA50CQ101&&tagvalue==int(150,200)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2385.C800HTA50CQ101&&tagvalue==int(200,210)&&isgood==boolean(-1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2531.C700HTA50CQ101&&tagvalue==int(250,310)&&isgood==boolean(1)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss)"
},
{
"point": "tagname==2581.C700HTA50CQ101&&tagvalue==int(310,410)&&isgood==boolean(0)&&sendts==date(now,yyyy-MM-dd HH:mm:ss)&&pits==date(now,yyyy-MM-dd HH:mm:ss.SSS)"
}
]
}
},
{
"topicName": "itdeer5",
"threads": 1,
"dataNumber": 100000,
"timeFrequency": 5000,
"dataMapping": {
"type": "csv",
"appoint": "true", //是否指定点位
"separator": ",", // 分隔符
"pointFile": { // 点位从文件中获取
"fields": "tagname==row_1&&tagvalue==int(row_2,row_3)&&isgood==boolean(0)&&sendts==date&&pits==date", // 点位文件的每一行数据在整体数据中所在位置
"mapping": "row_1,row_2,row_3", //点位文件的具体行
"fileName": "point.csv" //点位文件名称
}
}
}
]
}
CSV点位配置样例
6131.B10DCS10FQ001,switching,2,0
6131.B10DCS10FQ002,switching,3,0
6131.B10DCS10FQ002A,int,10,50
6131.B10DCS10FQ002B,int,100,200
6131.B10HTA50CQ101,float,0,100
6131.B10HTB62CT901A,float,100,200
6131.B10HTA50CM101A,double,50,90
6131.B10HSK30CP101A,double,-8,10
[1] kafka
-
bootstrapServers
参数名称:bootstrapServers 默认值:192.168.1.220:9092 参数说明:KAFKA_BOOTSTRAP_SERVERS:用于初始化时建立链接到kafka集群 以host:port形式,多个以逗号分隔host1:port1,host2:port2 -
acks
参数名称:acks 默认值:0 参数说明: acks:生产者需要server端在接收到消息后,进行反馈确认的尺度,主要用于消息的可靠性传输 acks=0表示生产者不需要来自server的确认 acks=1表示server端将消息保存后即可发送ack,而不必等到其他follower角色的都收到了该消息 acks=all(or acks=-1)意味着server端将等待所有的副本都被接收后才发送确认 -
retries
参数名称:retries 默认值:3 参数说明: retries: producer消息发送失败后,重试的次数 默认值为0,不进行重试 -
lingerMs
参数名称:lingerMs 默认值:100 参数说明: linger.ms: 默认值为0,默认情况下缓冲区的消息会被立即发送到服务端,即使缓冲区的空间并没有被用完。 可以将该值设置为大于0的值,这样发送者将等待一段时间后,再向服务端发送请求,以实现每次请求可以尽可能多的发送批量消息。 batch.size和linger.ms是两种实现让客户端每次请求尽可能多的发送消息的机制,它们可以并存使用,并不冲突 -
batchSize
参数名称:batchSize 默认值:102400 参数说明: batch.size:当多条消息发送到同一个partition时,该值控制生产者批量发送消息的大小, 批量发送可以减少生产者到服务端的请求数,有助于提高客户端和服务端的性能 默认 1048576 B -
bufferMemory
参数名称:bufferMemory 默认值:133554432 参数说明: buffer.memory: 制定producer端用于缓存消息的缓冲区大小,保存的是还未来得及发送到server端的消息, 如果生产者的发送速度大于消息被提交到server端的速度,该缓冲区将被耗尽 默认值为 33554432 ,即 32MB -
maxRequestSize
参数名称:maxRequestSize 默认值:10485760 参数说明: max.request.size: 官网上解释该参数用于控制producer发送请求的大小 实际上该参数控制的是producer端能够发送的最大消息大小 -
compressionType
参数名称:compressionType 默认值:lz4 参数说明: 压缩数据的压缩类型。压缩最好用于批量处理,批量处理消息越多,压缩性能越好 none : 无压缩,默认值。 gzip : snappy : 由于kafka源码的某个关键设置,使得snappy表现不如lz4 lz4 : producer 结合lz4 的性能较好 性能:lz4 >> snappy >> gzip -
requestTimeoutMs
参数名称:requestTimeoutMs 默认值:60000(60s) 参数说明: 消息发送的最长等待时间 当producer发送请求给broker后,broker需要在规定的时间范围内将处理结果返回给producer request.timeout.ms 即控制这个时间,默认值为30s 通常情况下,超时会在回调函数中抛出TimeoutException异常交由用户处理 -
maxInFlightRequestsPer
参数名称:maxInFlightRequestsPer 默认值:1 参数说明: 限制producer在单个broker连接上能够发送的未响应请求的数量 -
keySerializer valueSerializer
参数名称: keySerializer valueSerializer 默认值: org.apache.kafka.common.serialization.StringSerializer org.apache.kafka.common.serialization.StringSerializer 参数说明: key.serializer, value.serializer说明了使用何种序列化方式将用户提供的key和vaule值序列化成字节
[2] commons
-
stringFieldDefaultLength
参数名称: stringFieldDefaultLength 默认值:4 参数说明: 字符串的长度为默认4个字符组成 -
stringFieldDefaultWrite
参数名称: stringFieldDefaultWrite 默认值:7 参数说明: 1 表示大写 2 表示小写 3 表示数字 4 表示大写小写混合 5 表示小写和数字 6 表示大写和数字 7 表示大写小写和数字 -
booleanFieldDefaultFlag
参数名称: booleanFieldDefaultFlag 默认值:0 参数说明: 1 表示true -1 表示false 0 表示随机true或false -
intFieldDefaultMin
参数名称: intFieldDefaultMin 默认值:0 参数说明: 表示int最小取值范围 -
intFieldDefaultMax
参数名称: intFieldDefaultMax 默认值:10000 参数说明: 表示int最大取值范围 -
doubleFieldDefaultFormat
参数名称: doubleFieldDefaultFormat 默认值:#0.000 参数说明: 表示保留的小数点位数 -
doubleFieldDefaultMin
参数名称: doubleFieldDefaultMin 默认值:0 参数说明: 表示double最小取值范围 -
doubleFieldDefaultMax
参数名称: doubleFieldDefaultMax 默认值:10000 参数说明: 表示double最大取值范围 -
floatFieldDefaultFormat
参数名称: floatFieldDefaultFormat 默认值:#0.00 参数说明: 表示保留的小数点位数 -
floatFieldDefaultMin
参数名称: floatFieldDefaultMin 默认值:0 参数说明: 表示float最小取值范围 -
floatFieldDefaultMax
参数名称: floatFieldDefaultMax 默认值:10000 参数说明: 表示float最大取值范围 -
dateFieldDefaultStartPoint
参数名称: dateFieldDefaultStartPoint 默认值:now 参数说明: 表示开始时间 -
dateFieldDefaultFormat
参数名称: dateFieldDefaultFormat 默认值:yyyy-MM-dd HH:mm:ss 参数说明: 表示时间格式 -
dateFieldDefaultInterval
参数名称: dateFieldDefaultInterval 默认值:0 参数说明: 时间值与上一个时间的间隔 -
switchingFieldDefaultType
参数名称: switchingFieldDefaultType 默认值:0 参数说明: 开关量的类型 表示开关量的变换类型 -1表示只返回0值 0表示随机时间内返回0或者1 1表示值返回1 大于1的值表示指定时间内变换一次 -
switchingFieldDefaultMaxValue
参数名称: switchingFieldDefaultMaxValue 默认值:100 参数说明: 开关量的类型 变换的时间范围最大值 -
switchingFieldDefaultMinValue
参数名称: switchingFieldDefaultMinValue 默认值:0 参数说明: 开关量的类型 变换的时间范围最小值
[3] message
-
topicName
参数名称: topicName 默认值: 参数说明: 主题名称 -
threads
参数名称: threads 默认值:1 参数说明: 启动的线程数 -
dataNumber
参数名称: dataNumber 默认值:10000 参数说明: 表示单线程发送的数据条数或批数 若为0则表示无限发送 -
timeFrequency
参数名称: timeFrequency 默认值:-1 参数说明: 表示时间间隔 -1表示没有时间间隔 -
type
参数名称: type 默认值:json 参数说明: 数据格式 支持JSON和CSV -
appoint
参数名称: appoint 默认值:false 参数说明: 是否是模板不是模板的情况下需要配置fields字段,需要模板的话配置points -
separator
参数名称: separator 默认值:, 参数说明: CSV格式数据的分隔符,JSON格式则不需要配置 -
fields
参数名称: fields 默认值: 参数说明: 发送的一条数据中含有的字段信息,每一个字段都要分开写,指定好字段的名称和值的数据类型及取值范围,若为CSV格式也需要配置字段名称 只是数据中不体现字段名称,但是数据是按照字段配置的顺序组织的数据, 以上对单个字段进行了描述,这里就不赘述了,按照实例配制即可 -
points
参数名称: points 默认值: 参数说明: 一批要发送的多条数据的配置,每一条数据都可以不一样,针对每一条数据进行特性配置,每次发送是一批数据,所以注意发数总量和线程数的问题 以上对单个字段进行了描述,这里就不赘述了,按照实例配制即可 -
pointFile
参数名称: pointFile 默认值: 参数说明: 一批要发送的多条数据的配置,每一条数据都可以不一样,针对每一条数据进行特性配置,每次发送是一批数据,所以注意发数总量和线程数的问题 需要配置字段和文件行以及文件名称 -
fields
参数名称: fields 默认值: 参数说明: 消息模板,指出具体的字段从文件列中来 -
mapping
参数名称: mapping 默认值: 参数说明: 文件列的具体列 -
fileName
参数名称: fileName 默认值: 参数说明: 点位数据来源文件,文件名称
[1] string
示例:
string(8)
字符串长度默认值:
stringFieldDefaultLength 4
字符串的组成类型默认:
stringFieldDefaultWrite 2
参数说明:
生成的字符串的长度参数需为正整数
组成类型默认说明:
生成字符串
字符串的长度为4个字符组成
1 表示大写 2 表示小写 3 表示数字 4 表示大写小写混合 5 表示小写和数字 6 表示大写和数字 7 表示大写小写和数字
注意:可以不设置参数,直接变量名称==string 则使用默认参数值为 变量名称==string(4) 全部小写值
[2] boolean
示例:
boolean(0)
boolean类型默认变换类型:
booleanFieldDefaultFlag 0
参数说明:
生成的值变换类型
1 表示true -1 表示false 0 表示随机true或false
注意:可以不设置参数,直接变量名称==boolean 则使用默认参数值为 变量名称==boolean(0)
[3] int
示例:
int(0,100)
int类型默认最小最大值范围:
intFieldDefaultMin 0
intFieldDefaultMax 10000
参数说明:
生成的值变化范围
表示int最小取值范围
表示int最大取值范围
注意:可以不设置参数,直接变量名称==int 则使用默认参数值为 变量名称==int(0,10000)
[4] double
示例:
double(0,100)
double类型默认最小最大值范围及格式:
intFieldDefaultMin 0.0
intFieldDefaultMax 10000.0
doubleFieldDefaultFormat #0.000
参数说明:
生成的值变化范围和格式
表示double最小取值范围
表示double最大取值范围
表示保留的小数点位数
注意:可以不设置参数,直接变量名称==double 则使用默认参数值为 变量名称==double(0,10000) 格式为#0.000
[5] float
示例:
float(0,100)
float类型默认最小最大值范围及格式:
floatFieldDefaultMin 0.0f
floatFieldDefaultMax 10000.0f
floatFieldDefaultFormat #0.00
参数说明:
生成的值变化范围和格式
表示float最大取值范围
表示float最小取值范围
表示保留的小数点位数
注意:可以不设置参数,直接变量名称==float 则使用默认参数值为 变量名称==float(0,10000) 格式为#0.00
[6] date
示例:
date(0,100)
date类型默认开始时间,时间间隔和格式:
dateFieldDefaultStartPoint now
dateFieldDefaultFormat yyyy-MM-dd HH:mm:ss
dateFieldDefaultInterval 0
参数说明:
生成的值开始时间及间隔和格式
表示开始时间
表示时间格式
表示时间格式,单位为毫秒值
注意:可以不设置参数,直接变量名称==date 则使用默认参数值为 变量名称==date(2018-01-30 00:00:00,yyyy-MM-dd HH:mm:ss,10000) 格式为 yyyy-MM-dd HH:mm:ss
[7] switching
示例:
switching(0)
switching类型变化类型及时间间隔的最大最小值:
switchingFieldDefaultType 0
switchingFieldDefaultMaxValue 100
switchingFieldDefaultMinValue 0
参数说明:
生成开关量
表示开关量的变换类型 -1表示只返回0值 0表示随机时间内返回0或者1 1表示值返回1 大于1的值表示指定时间内变换一次
表示开关量随机变化的时间段最大值
表示开关量随机变化的时间段最小值
注意:可以不设置参数,直接变量名称==switching 则使用默认参数值为 变量名称==switching(0) 值只有 0 和 1
本次测试只是针对我开发工具到我的虚机得结果,在服务器上性能应该要比这个要高一些。
[1] JSON格式,不使用模板
在这台小机器上性能只能说还行,多个线程在一定范围内是成倍增加的
ThreadNum TopicName TotleTime(s) InitTime(s) SendTime(s) StartDate EndDate TotleMessageNums Speed
Thread-1 itdeer1 259.0 0.0 259.0 2019-08-30 23:32:05 2019-08-30 23:36:25 50000000 193050.19305019305
[2] CSV格式,不使用模板
在这台小机器上性能只能说还行,多个线程在一定范围内是成倍增加的
ThreadNum TopicName TotleTime(s) InitTime(s) SendTime(s) StartDate EndDate TotleMessageNums Speed
Thread-1 itdeer2 242.0 0.0 242.0 2019-08-30 23:26:23 2019-08-30 23:30:26 50000000 206611.57024793388
[3] JSON格式,使用模板
在这台小机器上性能只能说还行,多个线程在一定范围内是成倍增加的,使用的模板竟然没有降低太多的性能
ThreadNum TopicName TotleTime(s) InitTime(s) SendTime(s) StartDate EndDate TotleMessageNums Speed
Thread-1 itdeer3 231.0 0.0 231.0 2019-08-30 23:16:58 2019-08-30 23:20:50 5000000 21645.021645021647
[4] CSV格式,使用模板
在这台小机器上性能只能说还行,多个线程在一定范围内是成倍增加的,使用的模板竟然没有降低太多的性能
ThreadNum TopicName TotleTime(s) InitTime(s) SendTime(s) StartDate EndDate TotleMessageNums Speed
Thread-1 itdeer4 177.0 0.0 177.0 2019-08-30 23:09:37 2019-08-30 23:12:35 5000000 28248.58757062147