我正在嘗試編寫一個 HTTP 服務,該服務將從 HTTP 獲取數據并使用 Netty 將其放入 Kafka。我需要在 m5.large EC2 實例上處理 20K RPS,這似乎非常可行。代碼很簡單:Server.javapublic 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不應阻止對 的調用。
1 回答

慕森王
TA貢獻1777條經驗 獲得超3個贊
你說得對,里面沒有什么東西可以阻擋。發送到 Kafka 的調用是異步的。我查看了您的代碼,從我所看到的一切看起來都不錯。
我要檢查的幾件事:
確保 AWS 中的安全組定義允許 Kafka 服務器和應用程序與 Zookeeper 通信。如果這是一個測試/POC,您應該只允許所有三個實例/集群之間的所有流量。60 秒超時讓我懷疑網絡超時,這可能意味著某些服務無法訪問。
您是否嘗試過更簡單的測試,嘗試在沒有 Netty 依賴的情況下對 Kafka 進行生產?也許這有助于縮小問題的范圍。
添加回答
舉報
0/150
提交
取消