我正在尝试编写一个 HTTP 服务,该服务将从 HTTP 获取数据并使用 Netty 将其放入 Kafka。我需要在 m5.large EC2 实例上处理 20K RPS,这似乎非常可行。
代码很简单:
Server.java
public class Server {
public static void main(final String[] args) throws Exception {
final EventLoopGroup bossGroup = new EpollEventLoopGroup();
final EventLoopGroup workerGroup = new EpollEventLoopGroup();
try {
final ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap
.group(bossGroup, workerGroup)
.channel(EpollServerSocketChannel.class)
.childHandler(new RequestChannelInitializer(createProducer()))
.childOption(ChannelOption.SO_KEEPALIVE, true);
bootstrap.bind(PORT).sync().channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
private static Producer<String, ByteBuffer> createProducer() {
final Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_HOST);
properties.put(ProducerConfig.CLIENT_ID_CONFIG, "KafkaBidRequestProducer");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteBufferSerializer.class.getName());
properties.put(ProducerConfig.RETRIES_CONFIG, 0);
}
}
代码取自官方文档。但是,有时我会Request 'Post BidRequest' failed: j.u.c.TimeoutException: Request timeout after 60000 ms在负载测试中遇到异常。
据我了解,这意味着在我的负载测试实例和服务实例之间建立了连接,但完成时间超过 60 秒。这个简单程序的哪一部分可以阻塞这么长时间?
我已经调整了 Kafka 制作人:减少了它的超时时间。我知道这send可能会阻塞,所以我增加了发送缓冲区,但没有帮助。我也增加ulimits了服务用户。我在 OpenJDK 版本 1.8.0_171 上运行并securerandom.source设置为file:/dev/urandom,因此randomUUID不应阻止对 的调用。
慕森王
相关分类