Use a fast serialization library like FST for serialization of TbActorMsg instead of the default java serialization because java serialization is notoriously slow.

This should improve throughput when serialization/deserialization is the bottleneck.
This commit is contained in:
Jan Bols 2019-01-14 14:52:35 +01:00
parent 64d3006cb9
commit 768886d0f3
3 changed files with 29 additions and 4 deletions

View File

@ -41,6 +41,10 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
</dependency>
<dependency> <dependency>
<groupId>io.netty</groupId> <groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId> <artifactId>netty-transport-native-epoll</artifactId>
@ -180,6 +184,10 @@
<groupId>org.apache.curator</groupId> <groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId> <artifactId>curator-recipes</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.google.protobuf</groupId> <groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId> <artifactId>protobuf-java</artifactId>
@ -528,6 +536,16 @@
</configuration> </configuration>
<executions> <executions>
<execution> <execution>
<id>boot</id>
<goals>
<goal>repackage</goal>
</goals>
<!--<configuration>-->
<!--<classifier>axians-custom</classifier>-->
<!--</configuration>-->
</execution>
<execution>
<id>custom</id>
<goals> <goals>
<goal>repackage</goal> <goal>repackage</goal>
</goals> </goals>

View File

@ -17,8 +17,8 @@ package org.thingsboard.server.service.encoding;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nustaq.serialization.FSTConfiguration;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.SerializationUtils;
import org.thingsboard.server.common.msg.TbActorMsg; import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.cluster.ServerAddress; import org.thingsboard.server.common.msg.cluster.ServerAddress;
import org.thingsboard.server.gen.cluster.ClusterAPIProtos; import org.thingsboard.server.gen.cluster.ClusterAPIProtos;
@ -30,13 +30,14 @@ import static org.thingsboard.server.gen.cluster.ClusterAPIProtos.MessageType.CL
@Slf4j @Slf4j
@Service @Service
public class ProtoWithJavaSerializationDecodingEncodingService implements DataDecodingEncodingService { public class ProtoWithFSTService implements DataDecodingEncodingService {
private final FSTConfiguration config = FSTConfiguration.createDefaultConfiguration();
@Override @Override
public Optional<TbActorMsg> decode(byte[] byteArray) { public Optional<TbActorMsg> decode(byte[] byteArray) {
try { try {
TbActorMsg msg = (TbActorMsg) SerializationUtils.deserialize(byteArray); TbActorMsg msg = (TbActorMsg) config.asObject(byteArray);
return Optional.of(msg); return Optional.of(msg);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
@ -47,7 +48,7 @@ public class ProtoWithJavaSerializationDecodingEncodingService implements DataDe
@Override @Override
public byte[] encode(TbActorMsg msq) { public byte[] encode(TbActorMsg msq) {
return SerializationUtils.serialize(msq); return config.asByteArray(msq);
} }
@Override @Override

View File

@ -84,6 +84,7 @@
<delight-nashorn-sandbox.version>0.1.14</delight-nashorn-sandbox.version> <delight-nashorn-sandbox.version>0.1.14</delight-nashorn-sandbox.version>
<kafka.version>2.0.0</kafka.version> <kafka.version>2.0.0</kafka.version>
<bucket4j.version>4.1.1</bucket4j.version> <bucket4j.version>4.1.1</bucket4j.version>
<fst.version>2.57</fst.version>
</properties> </properties>
<modules> <modules>
@ -795,6 +796,11 @@
<artifactId>bucket4j-core</artifactId> <artifactId>bucket4j-core</artifactId>
<version>${bucket4j.version}</version> <version>${bucket4j.version}</version>
</dependency> </dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>${fst.version}</version>
</dependency>
<dependency> <dependency>
<groupId>io.springfox.ui</groupId> <groupId>io.springfox.ui</groupId>
<artifactId>springfox-swagger-ui-rfc6570</artifactId> <artifactId>springfox-swagger-ui-rfc6570</artifactId>