У меня есть приложение Java, отправляющее сообщения на удаленную тему Apache Kafka. Это дает сбой, за исключением следующего:
java.lang.RuntimeException: org.apache.http.client.ClientProtocolException
at com.$MyCompany.datalake.streams.clients.producer.internals.Sender.run(Sender.java:315)
at com.$MyCompany.datalake.streams.clients.producer.internals.Sender.run(Sender.java:163)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.http.client.ClientProtocolException: null
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:187)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:221)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:165)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:140)
at com.$MyCompany.datalake.streams.clients.producer.internals.Sender.run(Sender.java:310)
... 6 common frames omitted
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
... 11 common frames omitted
Caused by: java.net.SocketException: Connection timed out (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:879)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:850)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124)
at org.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136)
at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:167)
at org.apache.http.impl.io.ChunkedOutputStream.flushCache(ChunkedOutputStream.java:109)
at org.apache.http.impl.io.ChunkedOutputStream.write(ChunkedOutputStream.java:156)
at java.io.DataOutputStream.write(DataOutputStream.java:88)
at com.$MyCompany.datalake.streams.clients.producer.internals.Sender$2.writeTo(Sender.java:271)
at org.apache.http.impl.execchain.RequestEntityProxy.writeTo(RequestEntityProxy.java:121)
at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156)
at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:160)
at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238)
И после многих исследований, tcpdumps и т. Д. Мы обнаружили, что наша исходная машина устанавливает биты DF (Dont Fragment) для пакетов. И где-то до цели, MTU машины меньше, чем наш MTU, поэтому пакеты отклоняются. Как только мы выровняем наш размер MTU, проблема решена.
Вот что мне не ясно:
Как я понимаю, целевой компьютер должен отправить обратно сообщение ICMP, сообщающее, что «пакет слишком большой»». Почему мое приложение, использующее Kafka-REST для отправки сообщений, не может обработать это?
Это потому, что это асинхронное сообщение? Как насчет моего обратного вызова, который ловит исключение?