[ 
https://issues.apache.org/jira/browse/KAFKA-12776?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17345822#comment-17345822
 ] 

Guozhang Wang commented on KAFKA-12776:
---------------------------------------

Hey [~neeraj.vaidya], thanks for your updates, they are very helpful.

Note that there's no ordering synchronization upfront at the `send` call 
itself, i.e. records added by concurrent threads via the `send` call are not 
ordered by the system time when the `send` call is triggered. It is totally 
possible that a thread calls `send` at t1 while another thread calls `send` at 
t2 > t1, whereas the second record gets appended to the inner buffer first 
(this is the synchronization barrier actually, assuming the two records could 
end up within the same batch) and then the first record. So I think even 
without the broker transient failure, you may still observe such scenarios.

If you do care about send ordering from multiple concurrent callers, you'd need 
to do some synchronization upfront before hitting `send`, e.g. like you 
mentioned yourself using a single thread to trigger the `send` call.

> Producer sends messages out-of-order inspite of enabling idempotence
> --------------------------------------------------------------------
>
>                 Key: KAFKA-12776
>                 URL: https://issues.apache.org/jira/browse/KAFKA-12776
>             Project: Kafka
>          Issue Type: Bug
>          Components: producer 
>    Affects Versions: 2.6.0, 2.7.0
>         Environment: Linux RHEL 7.9 and Ubuntu 20.04
>            Reporter: NEERAJ VAIDYA
>            Priority: Major
>         Attachments: mocker.zip
>
>
> I have an Apache Kafka 2.6 Producer which writes to topic-A (TA). 
> My application is basically a Spring boot web-application which accepts JSON 
> payloads via HTTP and then pushes each to a Kafka topic. I also use Spring 
> Cloud Stream Kafka in the application to create and use a Producer.
> For one of my failure handling test cases, I shutdown the Kafka cluster while 
> my applications are running. (Note : No messages have been published to the 
> Kafka cluster before I stop the cluster)
> When the producer application tries to write messages to TA, it cannot 
> because the cluster is down and hence (I assume) buffers the messages. Let's 
> say it receives 4 messages m1,m2,m3,m4 in increasing time order. (i.e. m1 is 
> first and m4 is last).
> When I bring the Kafka cluster back online, the producer sends the buffered 
> messages to the topic, but they are not in order. I receive for example, m2 
> then m3 then m1 and then m4.
> Why is that ? Is it because the buffering in the producer is multi-threaded 
> with each producing to the topic at the same time ?
> My project code is attached herewith.
> I can confirm that I have enabled idempotence. I have also tried with 
> ```max.in.flight.requests=1```



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to